modules/pa/spawn.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- spawn_job
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)
/* [<][>][^][v][top][bottom][index][help] */
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 */