annotate uip/pgped.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* pgped.c - PGP editor */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 static char ident[] = "@(#)$Id: pgped.c,v 1.1.1.1 2005/04/18 14:46:07 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include "../h/mhn.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../h/addrsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include "../h/aliasbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #ifdef UNISTD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #endif /* UNISTD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #endif /* LOCALE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 struct addrlist {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 char *address;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 struct addrlist *next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 struct addrlist *add_addrlist();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 int exec_pgp5_for_keyid();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 char *get_micalg();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 static TYPESIG goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #define ALIASW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 {"alias aliasfile", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #define MHNPROC 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 {"mhnproc program", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #define PGPPROC 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 {"pgpproc program", -7},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #define SIGNSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 {"sign", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #define NSIGNSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 {"nosign", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 #define CRYPTSW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 {"encrypt", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 #define NCRPTSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 {"noencrypt", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #define MIMESW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 {"mime", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 #define NMIMESW 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 {"nomime", 0},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 #define HELPSW 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 {"help", 4},
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 {NULL, 0}
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 static int signsw = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 static int encryptsw = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 static int mimesw = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 static char *mhnproc = "mhn";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 static char *pgpproc = ""; /* "pgp"; */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 static char prefix[] = "----- =_aaaaaaaaaa";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 static char tmpfil1[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 static char tmpfil2[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 static char tmpfil3[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 static FILE *out1 = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 static FILE *out2 = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 static struct addrlist *addrs = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 static struct addrlist *from_addrs = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 static struct addrlist *resent_addrs = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 char *addr_headers[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 "Reply-To",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 "From",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 "Sender",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 "To",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 "Cc",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 "Bcc",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 "Dcc",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 NULLCP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 #define NOT_INSTALLED 127
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 main(argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 char *argv[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 int i, cnt, pid, tomhn, mimehdr, resent, compnum, state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 char *cp, *file = NULL, *keyid, buf[BUFSIZ], name[NAMESZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 char **ap, **argp, *arguments[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 FILE *in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 struct addrlist *ip;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 #endif /* LOCALE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 invo_name = r1bindex(argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 if ((cp = m_find(invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 ap = brkstring(cp = getcpy(cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 ap = copyip(ap, arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 ap = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 (void) copyip(argv + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 while ((cp = *argp++)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 switch (smatch(++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 ambigsw(cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 done(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 adios(NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 (void) sprintf(buf, "%s [switches] file", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 help(buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 done(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 case ALIASW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 adios(NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 if ((i = alias(cp)) != AK_OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 adios(NULLCP, "aliasing error in %s - %s", cp, akerror(i));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 case SIGNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 signsw++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 case NSIGNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 signsw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 case CRYPTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 encryptsw++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 case NCRPTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 encryptsw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 case MIMESW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 mimesw++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 case NMIMESW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 mimesw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 case MHNPROC:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 if (!(mhnproc = *argp++) || *mhnproc == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 adios(NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 case PGPPROC:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 if (!(pgpproc = *argp++) || *pgpproc == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 adios(NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 if (file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 adios(NULLCP, "only one file at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 file = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 /* for compatibility to "pgped.sh" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 if (argc == 3 && strcmp(argv[1], "-sign") == 0 && *argv[2] != '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 encryptsw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 if ((cp = m_find("Aliasfile"))) { /* allow Aliasfile: profile entry */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 char *dp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 for (ap = brkstring(dp = getcpy(cp), " ", "\n"); ap && *ap; ap++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 if ((i = alias(*ap)) != AK_OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 adios (NULLCP, "aliasing error in %s - %s", *ap, akerror(i));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 if (dp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 free(dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 (void) alias(AliasFile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 if (!file || (!mimesw && !signsw && !encryptsw))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 adios(NULLCP, "usage: %s [switches] file", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 if (mimesw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 if ((in = fopen(file, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 adios(file, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 tomhn = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 state = FLD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 while ((state = m_getfld(state, name, buf, sizeof(buf), in)) == FLD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 || state == FLDPLUS || state == FLDEOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 if (uleq(name, VRSN_FIELD)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 tomhn = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 fclose(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 if (tomhn) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 if (!getenv("mhdraft"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 m_putenv("mhdraft", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 switch (pid = fork()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 adios("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 execlp(mhnproc, r1bindex(mhnproc, '/'),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 "-nocache", "-noshow", "-nostore", file, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 adios(mhnproc, "unable to exec");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 if (pidXwait(pid, r1bindex(mhnproc, '/')))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 done(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 if (!signsw && !encryptsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 done(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 tomhn = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 if ((in = fopen(file, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 adios(file, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 tmpfil1[0] = tmpfil2[0] = tmpfil3[0] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 (void) signal(SIGHUP, goodbye);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 (void) signal(SIGINT, goodbye);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 (void) signal(SIGQUIT, goodbye);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 (void) signal(SIGPIPE, goodbye);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 (void) signal(SIGTERM, goodbye);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 (void) strcpy(tmpfil1, m_scratch("", m_maildir(invo_name)));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 if ((out1 = fopen(tmpfil1, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 (void) strcpy(tmpfil1, m_tmpfil(invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 if ((out1 = fopen(tmpfil1, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 advise(tmpfil1, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 (void) chmod(tmpfil1, 0600);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 (void) strcpy(tmpfil2, m_scratch("", m_maildir(invo_name)));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 if ((out2 = fopen(tmpfil2, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 (void) strcpy(tmpfil2, m_tmpfil(invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 if ((out2 = fopen(tmpfil2, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 advise(tmpfil2, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 (void) chmod(tmpfil2, 0600);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 mimehdr = resent = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 for (compnum = 1, state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 switch (state = m_getfld(state, name, buf, sizeof(buf), in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 compnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 cp = add(buf, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 state = m_getfld(state, name, buf, sizeof(buf), in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 cp = add(buf, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 if (uleq(name, VRSN_FIELD))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 if (uprf(name, XXX_FIELD_PRF)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 if (mimesw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 char *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 pp = cp + strlen(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 if (*--pp == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 *pp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 if (*--pp == '\r')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 *pp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 fprintf(out2, "%s:%s\r\n", name, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 mimehdr = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 fprintf(out2, "%s:%s", name, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 char **h;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 if (uprf(name, "Resent-")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 for (h = addr_headers; *h; h++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 if (uleq(name+7, *h))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 if (*h)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 resent_addrs = add_addrlist(resent_addrs, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 if (uleq(name+7, "To")) /* Resent-To */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 resent = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 for (h = addr_headers; *h; h++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 if (uleq(name, *h))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 if (*h)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 addrs = add_addrlist(addrs, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 if (uleq(name, "From"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 from_addrs = add_addrlist(from_addrs, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 fprintf (out1, "%s:%s", name, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 free(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 case BODY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 case BODYEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 (void) fseek(in, (long) (-strlen(buf)), 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 case FILEEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 advise(NULLCP, "draft has empty body -- no directives!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 case LENERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 case FMTERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 advise(NULLCP, "message format error in component #%d", compnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 advise(NULLCP, "getfld() returned %d", state);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 if (mimesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 fputs("\r\n", out2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 else if (mimehdr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 fputs("\n", out2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 fprintf (out1, "%s: %s\n", VRSN_FIELD, VRSN_VALUE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 if (mimesw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 int badprefix, len = strlen(prefix);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 char *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 if ((pp = index(prefix, 'a')) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 advise(NULLCP, "internal error");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 pos = ftell(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 badprefix = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 while (fgets(buf, sizeof(buf) - 2, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 cp = buf + strlen(buf) - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 if (*cp-- == '\n' && *cp != '\r') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 *++cp = '\r';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 *++cp = '\n';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 *++cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 fputs(buf, out2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 if (badprefix || buf[0] != '-' || buf[1] != '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 for (cp = buf + strlen(buf) - 1; cp >= buf; cp--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 if (!isspace(*cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 *++cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 if (strncmp(buf + 2, prefix, len) == 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 && isdigit(buf[2 + len]))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 badprefix = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 while (badprefix) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 if (*pp < 'z')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 (*pp)++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 if (*++pp == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 advise(NULLCP,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 "giving up trying to find a unique delimiter string"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 (*pp)++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 fseek(in, pos, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 badprefix = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 while (fgets(buf, sizeof(buf) - 1, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 if (buf[0] != '-' || buf[1] != '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 for (cp = buf + strlen(buf) - 1; cp >= buf; cp--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 if (!isspace(*cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 *++cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 if (strncmp(buf + 2, prefix, len) == 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 && isdigit(buf[2 + len])) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 badprefix = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 if (encryptsw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 fprintf(out1, "%s: multipart/encrypted; ", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 fprintf(out1, "protocol=\"application/pgp-encrypted\";\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 fprintf(out1, "\tboundary=\"%s%d\"\n\n", prefix, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 fprintf(out1, "--%s%d\n", prefix, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 fprintf(out1, "%s: application/pgp-encrypted\n", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 fprintf(out1, "%s: 7bit\n\nVersion: 1\n\n", ENCODING_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 fprintf(out1, "--%s%d\n", prefix, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 fprintf(out1, "%s: application/octet-stream\n", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 fprintf(out1, "%s: 7bit\n\n", ENCODING_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 while ((cnt = fread(buf, sizeof(char), sizeof(buf), in)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 fwrite(buf, sizeof(char), cnt, out2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 if (mimehdr) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 fprintf(out1, "%s: application/pgp; format=mime\n\n", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 if (encryptsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 fprintf(out1, "%s: application/pgp\n\n", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 fprintf(out1, "%s: text/pgp\n\n", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 fclose(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 fclose(out2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 out2 = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 (void) strcpy(tmpfil3, m_scratch("", m_maildir(invo_name)));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 if ((out2 = fopen(tmpfil3, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 (void) strcpy(tmpfil3, m_tmpfil(invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 if ((out2 = fopen(tmpfil3, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 advise(tmpfil3, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 (void) chmod(tmpfil3, 0600);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 fclose(out2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 unlink(tmpfil3);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 if (resent)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 addrs = resent_addrs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 i = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 for (ip = addrs; ip; ip = ip->next)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 i++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 if ((ap = (char **) malloc(sizeof(char *) * (i * 2 + 9))) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 advise(NULLCP, "out of memory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 if (! *pgpproc) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 /* for PGP5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 ap[i = 0] = pgpproc = encryptsw ? "pgpe" : "pgps";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 ap[++i] = encryptsw ? (signsw ? "-sat" : "-at")
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 : (mimesw ? "-ab" : "-at");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 ap[++i] = "+language=en";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 ap[++i] = "+armorlines=0";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 if (encryptsw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 for (ip = addrs; ip; ip = ip->next) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 ap[++i] = "-r";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 ap[++i] = ip->address;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 if (signsw && from_addrs) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 ap[++i] = "-u";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 ap[++i] = from_addrs->address;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 ap[++i] = tmpfil2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 ap[++i] = "-o";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 ap[++i] = tmpfil3;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 ap[++i] = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 if (!mimesw || encryptsw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 switch (pid = fork()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 advise("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 execvp(pgpproc, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 /* maybe PGP5 is not installed. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 _exit(NOT_INSTALLED);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 #if 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 state = pidwait(pid, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 if (WIFEXITED(state) && WEXITSTATUS(state) == NOT_INSTALLED)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 if ((state = pidwait(pid, OK)) == (NOT_INSTALLED << 8))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 /* Let's try old PGP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 pgpproc = "pgp";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 else if (pidstatus(state, stdout, pgpproc))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 pgpproc = "";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 } else if (exec_pgp5_for_keyid(pgpproc, ap, &keyid) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 /* Let's try old PGP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 pgpproc = "pgp";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 pgpproc = "";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 if (*pgpproc) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 /* for PGP2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 ap[i = 0] = r1bindex(pgpproc, '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 ap[++i] = encryptsw ? (signsw ? "-esat" : "-eat")
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 : (mimesw ? "-sab" : "-sat");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 ap[++i] = "+language=en";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 ap[++i] = "+armorlines=0";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 ap[++i] = tmpfil2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 for (ip = addrs; ip; ip = ip->next)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 ap[++i] = ip->address;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 if (from_addrs && from_addrs->address) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 ap[++i] = "-u";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 ap[++i] = from_addrs->address;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 ap[++i] = "-o";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 ap[++i] = tmpfil3;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 ap[++i] = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 switch (pid = fork()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 advise("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 execvp(pgpproc, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 adios(pgpproc, "unable to exec");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 if (pidXwait(pid, r1bindex(pgpproc, '/')))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 if (mimesw && !encryptsw) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 fprintf(out1, "%s: multipart/signed;\n", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 fprintf(out1, "\tprotocol=\"application/pgp-signature\"; ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 fprintf(out1, "micalg=\"pgp-%s\";\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 *pgpproc ? "md5"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 : get_micalg(from_addrs ? from_addrs->address : NULLCP,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 keyid));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 fprintf(out1, "\tboundary=\"%s%d\"\n\n", prefix, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 fprintf(out1, "--%s%d\n", prefix, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 if ((in = fopen(tmpfil2, "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 advise(tmpfil2, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 while (fgets(buf, sizeof(buf) - 1, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 cp = buf + strlen(buf) - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 if (*cp-- == '\n' && *cp == '\r') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 *cp++ = '\n';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 fputs(buf, out1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 fclose(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 fprintf(out1, "\n--%s%d\n", prefix, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 fprintf(out1, "%s: application/pgp-signature\n", TYPE_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 fprintf(out1, "%s: 7bit\n\n", ENCODING_FIELD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 unlink(tmpfil2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 if ((in = fopen(tmpfil3, "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 advise(tmpfil3, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 while (fgets(buf, sizeof(buf) - 1, in))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 fputs(buf, out1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 fclose(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 unlink(tmpfil3);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 if (mimesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 fprintf(out1, "\n--%s%d--\n", prefix, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 fclose(out1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 if (!tomhn) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 sprintf(buf, "%s.orig", m_backup(file));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 if (rename(file, buf) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 advise(buf, "unable to rename %s to", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 unlink(file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 if (rename(tmpfil1, file) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 int in, out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 if (stat(file, &st) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 advise(file, "unable to rename %s to", tmpfil1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 if ((in = open(tmpfil1, 0)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 advise(tmpfil1, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 if ((out = creat(file, 0600)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 advise(file, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 (void) close(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 cpydata(in, out, tmpfil1, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 (void) close(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 (void) close(out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 unlink(tmpfil1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 done(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 struct addrlist *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 add_addrlist(addrp, str)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 struct addrlist *addrp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 char *str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 struct addrlist *ap, **vp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 struct mailname *lp, *mp, *np, taddr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 np = &taddr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 while ((cp = getname(str))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 if (!(mp = getm(cp, NULLCP, 0, AD_HOST, NULLCP)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 np->m_next = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 np = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 np->m_next = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 np = &taddr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 for (lp = taddr.m_next; lp; lp = np->m_next) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 if (lp->m_nohost) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 char *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 pp = akvalue(lp->m_mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 while ((cp = getname(pp))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 if (!(mp = getm(cp, NULLCP, 0, AD_HOST, NULLCP)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 np->m_next = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 np = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 np->m_next = lp->m_next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 mnfree(lp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 np = lp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 for (lp = taddr.m_next; lp; lp = np) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 switch (lp->m_type) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 case UUCPHOST:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 cp = add(lp->m_mbox, add("!", add(lp->m_host, NULLCP)));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 case LOCALHOST:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 cp = add(LocalName(), add("@", add(lp->m_mbox, NULLCP)));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 cp = add(lp->m_host, add("@", add(lp->m_mbox, NULLCP)));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 vp = &addrp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 for (ap = addrp; ap; ap = ap->next) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 if (uleq(ap->address, cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 vp = &(ap->next);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 if (ap)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 free(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 if ((*vp = (struct addrlist *) malloc(sizeof(struct addrlist)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690 == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 advise(NULLCP, "out of memory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 (*vp)->address = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 (*vp)->next = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 np = lp->m_next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 mnfree(lp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 return addrp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 exec_pgp5_for_keyid(prog, ap, keyid)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 char *prog, *ap[], **keyid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 int cnt, state, pid, pdes[2];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 char *cp, *ep, *np, buf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 if (pipe(pdes) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 advise(NULLCP, "unable to open pipe");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 switch (pid = fork()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 close(pdes[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 close(pdes[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 advise("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 if (pdes[1] != fileno(stdout))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724 dup2(pdes[1], fileno(stdout));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 if (pdes[1] != fileno(stderr)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 dup2(pdes[1], fileno(stderr));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 if (pdes[1] != fileno(stdout))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 close(pdes[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 close(pdes[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 execvp(prog, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 /* maybe PGP is not installed. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 _exit(NOT_INSTALLED);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 close(pdes[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 cp = ep = buf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 *keyid = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 while ((cnt = read(pdes[0], buf + (ep - cp), sizeof(buf) - (ep - cp) - 1))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 write(fileno(stdout), buf + (ep - cp), cnt);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 ep = buf + (ep - cp) + cnt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 cp = buf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 while (cp < ep) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 np = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 while (np < ep && *np != '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 np++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 if (np < ep || (cp == buf && np == buf + sizeof(buf) - 1)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 char *xp, *yp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 *np = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 if (! *keyid) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 for (xp = cp; *xp; xp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 if (strncmp(xp, "bits, Key ID ", 13) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 if (*xp && (yp = index(xp + 13, ','))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 *yp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 *keyid = add(xp + 13, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 bcopy(cp, buf, ep - cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 cp = np + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 close(pdes[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 #if 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 state = pidwait(pid, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 if (WIFEXITED(state) && WEXITSTATUS(state) == NOT_INSTALLED)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 if ((state = pidwait(pid, OK)) == (NOT_INSTALLED << 8))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 if (pidstatus(state, stdout, r1bindex(pgpproc, '/')))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 get_micalg(userid, keyid)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 char *userid, *keyid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 int pid, pdes[2];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 char *ap[5], buf[BUFSIZ], *hash = "md5"; /* default */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 FILE *in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 if (pipe(pdes) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 advise(NULLCP, "unable to open pipe");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 switch (pid = fork()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 close(pdes[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 close(pdes[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 advise("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 if (pdes[1] != fileno(stdout))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 dup2(pdes[1], fileno(stdout));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 if (pdes[1] != fileno(stderr)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 dup2(pdes[1], fileno(stderr));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 if (pdes[1] != fileno(stdout))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 close(pdes[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 close(pdes[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 ap[0] = "pgpk";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 ap[1] = "-l";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 ap[2] = "+language=en";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 ap[3] = userid; /* might be NULLCP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 ap[4] = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 execvp("pgpk", ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 adios("pgpk", "unable to exec");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 close(pdes[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 in = fdopen(pdes[0], "r");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 while (fgets(buf, sizeof(buf), in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 if (strncmp(buf, "sec", 3) == 0 /* secret key */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 && strncmp(buf + 12, keyid, strlen(keyid)) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 if (strncmp(buf + 43, "DSS", 3) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 hash = "sha1";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 else if (strncmp(buf + 43, "RSA", 3) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 hash = "md5";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 fclose(in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 if (pidXwait(pid, "pgpk"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 goodbye();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 return hash;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 static TYPESIG goodbye()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 if (out1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 fclose(out1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 if (out2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 fclose(out2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 if (tmpfil1[0])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 unlink(tmpfil1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 if (tmpfil2[0])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 unlink(tmpfil2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 if (tmpfil3[0])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852 unlink(tmpfil3);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 done(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 /* NOT REACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855 }