lib/courier-authlib/chain.c
changeset 0 6f7a81934006
child 2 b3afb9f1e801
equal deleted inserted replaced
-1:000000000000 0:6f7a81934006
       
     1 /*
       
     2 ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
       
     3 ** distribution information.
       
     4 */
       
     5 
       
     6 #if	HAVE_CONFIG_H
       
     7 #include	"config.h"
       
     8 #endif
       
     9 #include	<stdio.h>
       
    10 #include	<stdlib.h>
       
    11 #include	<string.h>
       
    12 #if	HAVE_UNISTD_H
       
    13 #include	<unistd.h>
       
    14 #endif
       
    15 #if	HAVE_FCNTL_H
       
    16 #include	<fcntl.h>
       
    17 #endif
       
    18 
       
    19 #include	"auth.h"
       
    20 
       
    21 static const char rcsid[]="$Id: chain.c,v 1.1 2000/04/13 17:55:05 bruce Exp $";
       
    22 
       
    23 void authchain(int argc, char **argv, const char *buf)
       
    24 {
       
    25 int	pipes[2];
       
    26 pid_t	p;
       
    27 int	l, n;
       
    28 char	**vec;
       
    29 char	*prog;
       
    30 
       
    31 	vec=authcopyargv(argc, argv, &prog);
       
    32 	if (!prog || open("/dev/null", O_RDONLY) != 3)	authexit(1);
       
    33 
       
    34 	if (pipe(pipes))
       
    35 	{
       
    36 		perror("pipe");
       
    37 		authexit(1);
       
    38 	}
       
    39 	while ((p=fork()) < 0)
       
    40 	{
       
    41 		perror("fork");
       
    42 		sleep(3);
       
    43 	}
       
    44 	close(3);
       
    45 
       
    46 	if (p)
       
    47 	{
       
    48 		dup(pipes[0]);
       
    49 		close(pipes[0]);
       
    50 		close(pipes[1]);
       
    51 		execv(prog, vec);
       
    52 		perror(prog);
       
    53 		authexit(1);
       
    54 	}
       
    55 	l=strlen(buf);
       
    56 	close(3);
       
    57 	close(pipes[0]);
       
    58 	while (l)
       
    59 	{
       
    60 		n=write(pipes[1], buf, l);
       
    61 		if (n <= 0)	break;
       
    62 		buf += n;
       
    63 		l -= n;
       
    64 	}
       
    65 	close(pipes[1]);
       
    66 	authexit(1);
       
    67 }