Source File modules/pa/spawn.c

    1    | /*  spawn.c
    2    |
    3    |     Source file for spawn operations for  PGPsendmail  (wrapper to sendmail).
    4    |
    5    |     Copyright (C) 1994-1998  Richard Gooch
    6    |
    7    |     This program is free software; you can redistribute it and/or modify
    8    |     it under the terms of the GNU General Public License as published by
    9    |     the Free Software Foundation; either version 2 of the License, or
    10   |     (at your option) any later version.
    11   |
    12   |     This program is distributed in the hope that it will be useful,
    13   |     but WITHOUT ANY WARRANTY; without even the implied warranty of
    14   |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15   |     GNU General Public License for more details.
    16   |
    17   |     You should have received a copy of the GNU General Public License
    18   |     along with this program; if not, write to the Free Software
    19   |     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    20   |
    21   |     Richard Gooch may be reached by email at  rgooch@atnf.csiro.au
    22   |     The postal address is:
    23   |       Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia.
    24   | */
    25   |
    26   | /*  This programme intercepts messages sent by user mail agents to the
    27   |     sendmail daemon and checks to see if messages can be encrypted using the
    28   |     recipient's PGP public keys.
    29   |
    30   |
    31   |     Written by      Richard Gooch   31-MAY-1994
    32   |
    33   |     Updated by      Richard Gooch   31-MAY-1994: Extracted from  pgpsendmail.c
    34   |
    35   |     Updated by      Richard Gooch   18-JUN-1994: Made error messages more
    36   |   explicit.
    37   |
    38   |     Updated by      Richard Gooch   27-JUN-1994: Copied  set_env  from
    39   |   pgpdaemon.c
    40   |
    41   |     Updated by      Richard Gooch   5-JUL-1994: Changed to use of  m_copy  .
    42   |
    43   |     Updated by      Richard Gooch   14-JUL-1994: Moved  copy_data  and  set_env
    44   |   to  misc.c
    45   |
    46   |     Updated by      Richard Gooch   3-DEC-1994: Fixed bug for externally set
    47   |   error descriptor.
    48   |
    49   |     Updated by      Richard Gooch   25-SEP-1997: Used new ERRSTRING macro.
    50   |
    51   |     Last updated by Richard Gooch   10-JUL-1998: Removed definitions of system
    52   |   errlist array.
    53   |
    54   |
    55   | */
    56   | #include <stdio.h>
    57   | #include <stdlib.h>
    58   | #include <errno.h>
    59   | #include <sys/types.h>
    60   | #include <unistd.h>
    61   | #include <string.h>
    62   |
    63   |
    64   | /* #include "pgpsendmail.h" */
    65   |
    66   | #define ERRSTRING strerror(errno)
    67   |
    68   | #define LINE_LENGTH 1024
    69   | #define STRING_LENGTH 255
    70   |
    71   | int spawn_job (char *path, char *argv[], int *in_fd, int *out_fd, int *err_fd)
    72   | /*  This routine will fork(2) and execvp(2) a process.
    73   |     The file to execute must be pointed to by  path  .
    74   |     The NULL terminated list of arguments which will be passed to  main  must
    75   |     be pointed to by  argv  .
    76   |     The input file descriptor (fd = 0) for the process must be pointed to by
    77   |     in_fd  .If the value here is less than 0, then a pipe to the process is
    78   |     opened and the writeable end is written to the storage pointed to by  in_fd
    79   |     The standard output file descriptor (fd = 1) for the process must be
    80   |     pointed to by  out_fd  .If the value here is less than 0, then a pipe to
    81   |     the process is opened and the readable end is written to the storage
    82   |     pointed to by  out_fd  .
    83   |     The standard error output file descriptor (fd = 2) for the process must be
    84   |     pointed to by  err_fd  .If the value here is less than 0, then a pipe to
    85   |     the process is opened and the readable end is written to the storage
    86   |     pointed to by  err_fd  .
    87   |     The routine returns the child process ID on success, else it returns -1.
    88   | */
    89   | {
    90   |     int child_pid;
    91   |     /*    char txt[LINE_LENGTH]; */
    92   |     int sd1[2], sd2[2];
    93   |
    94   |     if (pipe(sd1) == -1)
    95   |       {
    96   | 	perror("pipe failed");
    97   | 	return(1);
    98   |       }
    99   |     if (pipe(sd2) == -1)
    100  |       {
    101  | 	perror("pipe failed");
    102  | 	return(1);
    103  |       }
    104  |
    105  |     /*  Fork and exec  */
    106  |     switch ( child_pid = fork () )
    107  |     {
    108  |       case 0:
    109  | 	/*  Child: exec  */
    110  | 	close(sd1[0]);
    111  |
    112  | 	dup2( sd1[1], 1 );   /* stdout */
    113  |
    114  | 	dup2( sd1[1], 2 );    /* stderr */
    115  |
    116  | 	execvp (path, argv);
    117  |
    118  | 	fprintf (stderr, "Could not exec: \"%s\"\t%s\n", path, ERRSTRING);
    119  | 	exit (1);
    120  | 	break;
    121  |       case -1:
    122  | 	/*  Error  */
    123  | 	fprintf (stderr, "Could not fork\t%s\n", ERRSTRING);
    124  | 	return (-1);
    125  | 	break;
    126  |       default:
    127  | 	/*  Parent  */
    128  | 	break;
    129  |     }
    130  |     /*  Parent only  */
    131  |
    132  |     close(sd1[1]);
    133  |
    134  |     dup2 (sd1[0], 0);
    135  |
    136  |     /*        printf("Reading child output\n");
    137  |     while (read(0, txt, 10000) != 0)
    138  |       printf("child read %s\n", txt);
    139  |
    140  |       printf("Finished reading child output\n");  */
    141  |
    142  |     return (child_pid);
    143  | }   /*  End Function spawn_job  */