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 */