annotate uip/spost.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 07f8972434be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 static char sccsid[] = "@(#)spost.c 1.6 (Berkeley) 11/2/85";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
5 static char ident[] = "@(#)$Id: spost.c,v 1.1.1.1 2005/04/18 14:46:07 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 /* spost.c - feed messages to sendmail */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 * (This is a simpler, faster, replacement for "post" for use when "sendmail"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 * is the transport system)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #include "../h/addrsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #include "../h/aliasbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #include "../h/dropsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #ifdef UNISTD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 extern char *getfullname (), *getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 extern char *sendmail;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #define uptolow(c) ((isalpha(c) && isupper (c)) ? tolower (c) : c)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #define MAX_SM_FIELD 1476 /* < largest hdr field sendmail will accept */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #define FCCS 10 /* max number of fccs allowed */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 #define FILTSW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 "filter filterfile", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #define NFILTSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 "nofilter", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 #define FRMTSW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 "format", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 #define NFRMTSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 "noformat", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 #define REMVSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 "remove", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #define NREMVSW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 "noremove", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #define VERBSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 "verbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 #define NVERBSW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 "noverbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 #define WATCSW 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 "watch", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 #define NWATCSW 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 "nowatch", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 #define HELPSW 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 #define DEBUGSW 11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 "debug", -5,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 #define DISTSW 12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 "dist", -4, /* interface from dist */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 #define BACKSW 13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 "backup", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 #define NBACKSW 14
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 "nobackup", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 #define CHKSW 15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 "check", -5, /* interface from whom */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 #define NCHKSW 16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 "nocheck", -7, /* interface from whom */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 #define WHOMSW 17
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 "whom", -4, /* interface from whom */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 #define PUSHSW 18 /* fork to sendmail then exit */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 "push", -4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 #define NPUSHSW 19 /* exec sendmail */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 "nopush", -6,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 #define ALIASW 20
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 "alias aliasfile", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 #define NALIASW 21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 "noalias", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 #define WIDTHSW 22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 "width columns", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 #define LIBSW 23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 "library directory", -7,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 #define ANNOSW 24
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 "idanno number", -6,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 #define HENCDSW 25
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 "hencode", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 #define NHENCDSW 26
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 "nohencode", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 struct headers {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 char *value;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 unsigned int flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 #define HNOP 0x0000 /* just used to keep .set around */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 #define HBAD 0x0001 /* bad header - don't let it through */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 #define HADR 0x0002 /* header has an address field */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 #define HSUB 0x0004 /* Subject: header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 #define HTRY 0x0008 /* try to send to addrs on header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 #define HBCC 0x0010 /* don't output this header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 #define HMNG 0x0020 /* mung this header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 #define HNGR 0x0040 /* no groups allowed in this header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 #define HFCC 0x0080 /* FCC: type header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 #define HNIL 0x0100 /* okay for this header not to have addrs */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 #define HIGN 0x0200 /* ignore this header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 unsigned int set;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 #define MFRM 0x0001 /* we've seen a From: */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 #define MDAT 0x0002 /* we've seen a Date: */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 #define MRFM 0x0004 /* we've seen a Resent-From: */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 #define MVIS 0x0008 /* we've seen sighted addrs */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 #define MINV 0x0010 /* we've seen blind addrs */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 #define MRDT 0x0020 /* we've seen a Resent-Date: */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 static struct headers NHeaders[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 "Return-Path", HBAD, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 "Received", HBAD, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 "Reply-To", HADR | HNGR, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 "From", HADR | HNGR, MFRM,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 "Sender", HADR | HBAD, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 "Date", HNOP, MDAT,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 "Subject", HSUB, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 "To", HADR | HTRY, MVIS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 "cc", HADR | HTRY, MVIS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 "Bcc", HADR | HTRY | HBCC | HNIL, MINV,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 "Message-Id", HBAD, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 "Fcc", HFCC, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 static struct headers RHeaders[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 "Resent-Reply-To", HADR | HNGR, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 "Resent-From", HADR | HNGR, MRFM,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 "Resent-Sender", HADR | HBAD, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 "Resent-Date", HNOP, MRDT,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 "Resent-Subject", HSUB, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 "Resent-To", HADR | HTRY, MVIS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 "Resent-cc", HADR | HTRY, MVIS,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 "Resent-Bcc", HADR | HTRY | HBCC, MINV,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 "Resent-Message-Id", HBAD, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 "Resent-Fcc", HFCC, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 "Reply-To", HADR, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 "Fcc", HIGN, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 static short fccind = 0; /* index into fccfold[] */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 static int badmsg = 0; /* message has bad semantics */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 static int verbose = 0; /* spell it out */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 static int debug = 0; /* debugging post */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 static int rmflg = 1; /* remove temporary file when done */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 static int watch = 0; /* watch the delivery process */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 static int backflg = 0; /* rename input file as *.bak when done */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 static int whomflg = 0; /* if just checking addresses */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 static int pushflg = 0; /* if going to fork to sendmail */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 static int aliasflg = -1; /* if going to process aliases */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 static int outputlinelen=72;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 static int hencode = -1; /* encode header in RFC-2047 style */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 static unsigned msgflags = 0; /* what we've seen */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 static enum {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 normal, resent
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 } msgstate = normal;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 static char tmpfil[] = "/tmp/pstXXXXXX";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 static char from[BUFSIZ]; /* my network address */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 static char signature[BUFSIZ]; /* my signature */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 static char *filter = NULL; /* the filter for BCC'ing */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 static char *subject = NULL; /* the subject field for BCC'ing */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 static char *fccfold[FCCS]; /* foldernames for FCC'ing */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 static struct headers *hdrtab; /* table for the message we're doing */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 static FILE *out; /* output (temp) file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 static putfmt(), start_headers(), finish_headers(), putadr(),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 insert_fcc();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 static file(), fcc();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 static int get_header(), putone();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 /* MAIN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 char *argv[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 int state,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 pid,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 compnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 *msg = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 **argp = argv + 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 *sargv[16],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 buf[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 name[NAMESZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 *arguments[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 FILE * in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 invo_name = r1bindex (argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 mts_init (invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 if ((cp = m_find (invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 argp = copyip (brkstring (cp, " ", "\n"), arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 (void) copyip (argv+1, argp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 adios (NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 (void)sprintf (buf, "%s [switches] file", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 help (buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 case DEBUGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 debug++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 case DISTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 msgstate = resent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 case WHOMSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 whomflg++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 case FILTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 if (!(filter = *argp++) || *filter == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 case NFILTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 filter = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 case REMVSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 rmflg++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 case NREMVSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 rmflg = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 case BACKSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 backflg++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 case NBACKSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 backflg = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 case VERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 verbose++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 case NVERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 verbose = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 case WATCSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 watch++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 case NWATCSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 watch = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 case PUSHSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 pushflg++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 case NPUSHSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 pushflg = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 case ALIASW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 if (aliasflg < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 (void) alias (AliasFile);/* load default aka's */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 aliasflg = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 if ((state = alias(cp)) != AK_OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 adios (NULLCP, "aliasing error in file %s - %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 cp, akerror(state) );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 case NALIASW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 aliasflg = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 case WIDTHSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 outputlinelen = atoi (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 if (outputlinelen <= 10)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 outputlinelen = 72;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 case LIBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 case ANNOSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 /* -library & -idanno switch ignored */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 case HENCDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 hencode = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 case NHENCDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 hencode = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 if (msg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 adios (NULLCP, "only one message at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 msg = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 if (aliasflg < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 (void) alias (AliasFile); /* load default aka's */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 if (!msg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 adios (NULLCP, "usage: %s [switches] file", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 if ((in = fopen (msg, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 adios (msg, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 if (hencode == -1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 hencode = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 for (state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 switch (state = m_getfld (state, name, buf, sizeof buf, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 if (uleq (name, "MIME-Version")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 hencode = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 (void) fseek (in, 0L, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 start_headers ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 if (debug) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 verbose++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 out = stdout;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 (void)mktemp (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 if ((out = fopen (tmpfil, "w")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 adios (tmpfil, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 (void)chmod (tmpfil, 0600);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 hdrtab = (msgstate == normal) ? NHeaders : RHeaders;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 for (compnum = 1, state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 switch (state = m_getfld (state, name, buf, sizeof buf, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 #if defined(JAPAN) || defined(MIME_HEADERS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 compnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 cp = add (buf, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 state = m_getfld (state, name, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 cp = add (buf, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 putfmt (name, cp, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 #else /* JAPAN || MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 compnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 putfmt (name, buf, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 compnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 cp = add (buf, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 state = m_getfld (state, name, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 cp = add (buf, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 putfmt (name, cp, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 #endif /* JAPAN || MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 case BODY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 finish_headers (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 fprintf (out, "\n%s", buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 if(whomflg == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 while (state == BODY) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 state = m_getfld (state, name, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 fputs (buf, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 case FILEEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 finish_headers (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 case LENERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 case FMTERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 adios (NULLCP, "message format error in component #%d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 compnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 adios (NULLCP, "getfld() returned %d", state);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 (void)fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 if (backflg && !whomflg) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 (void) strcpy (buf, m_backup (msg));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 if (rename (msg, buf) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 advise (buf, "unable to rename %s to", msg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 if (debug) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 (void)fclose (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 file (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 * re-open the temp file, unlink it and exec sendmail, giving it
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 * the msg temp file as std in.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 if ( freopen( tmpfil, "r", stdin) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 adios (tmpfil, "can't reopen for sendmail");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 if (rmflg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 (void)unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 argp = sargv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 *argp++ = "send-mail";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 *argp++ = "-m"; /* send to me too */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 *argp++ = "-t"; /* read msg for recipients */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 *argp++ = "-i"; /* don't stop on "." */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 if (whomflg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 *argp++ = "-bv";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 if (watch || verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 *argp++ = "-v";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 *argp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 if (pushflg && !(watch || verbose)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 /* fork to a child to run sendmail */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 for (i=0; (pid = vfork()) == NOTOK && i < 5; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 sleep(5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 switch (pid) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 fprintf (verbose ? stdout : stderr, "%s: can't fork to %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 invo_name, sendmail);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 exit(-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 /* we're the child .. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 exit(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 execv ( sendmail, sargv);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 adios ( sendmail, "can't exec");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 /* DRAFT GENERATION */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 static putfmt (name, str, out)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 char *name,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 *str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 FILE * out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 int count,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 grp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 keep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 *pp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 *qp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 *origstr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 namep[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 struct mailname *mp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 *np;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 struct headers *hdr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 while (*str == ' ' || *str == '\t')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 str++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 if (hencode) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 char *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 if ((ep = malloc((unsigned)strlen(str)*10+1)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 adios(NULLCP, "out of memory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 (void) ml_conv(str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 (void) exthdr_encode(str, ep, strlen(name)+2, name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 origstr = str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 str = ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 if ((i = get_header (name, hdrtab)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 fprintf (out, "%s: %s", name, str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 hdr = &hdrtab[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 if (hdr -> flags & HIGN)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 if (hdr -> flags & HBAD) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 advise (NULLCP, "illegal header line -- %s:", name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 badmsg++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 msgflags |= hdr -> set;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 if (hdr -> flags & HSUB)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 subject = subject ? add (str, add ("\t", subject)) : getcpy (str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 if (hdr -> flags & HFCC) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 if (cp = rindex (str, '\n'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 for (cp = pp = str; cp = index (pp, ','); pp = cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 *cp++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 insert_fcc (hdr, pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 insert_fcc (hdr, pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 if (hdr -> flags & HBCC) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 insert_bcc(str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 if (*str != '\n' && *str != '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 if (aliasflg && hdr->flags & HTRY) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 /* this header contains address(es) that we have to do
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 * alias expansion on. Because of the saved state in
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 * getname we have to put all the addresses into a list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 * We then let putadr munch on that list, possibly
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 * expanding aliases.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 register struct mailname *f = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 register struct mailname *mp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 if (hencode)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 /* encode again after format */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 (void) exthdr_decode(origstr, str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 while (cp = getname( str ) ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 mp = getm( cp, NULLCP, 0, AD_HOST, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 if (f == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 f = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 mp->m_next = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 mp->m_next = f->m_next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 f->m_next = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 f = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 f = mp->m_next; mp->m_next = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 putadr( name, f );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 fprintf (out, "%s: %s", name, str );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 static
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 start_headers ()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 char sigbuf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 (void)strcpy( from, getusr() );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 if ((cp = getfullname ()) && *cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 (void)strcpy (sigbuf, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 (void)sprintf (signature, "%s <%s>", sigbuf, from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 if (hencode) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 char *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 (void) ml_conv(signature);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 ep = getcpy (signature);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 (void) exthdr_encode (ep, signature, 5, "From");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 free(ep);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 (void)sprintf (signature, "%s", from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 static
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 finish_headers (out)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 FILE * out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 switch (msgstate) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 case normal:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 if (!(msgflags & MDAT))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 fprintf (out, "Date: %s\n", dtimenow ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 if (msgflags & MFRM)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 fprintf (out, "Sender: %s\n", from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 fprintf (out, "From: %s\n", signature);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 if (!(msgflags & MVIS))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 fprintf (out, "Bcc: Blind Distribution List: ;\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 case resent:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690 if (!(msgflags & MRDT))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 fprintf (out, "Resent-Date: %s\n", dtimenow());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 if (msgflags & MRFM)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 fprintf (out, "Resent-Sender: %s\n", from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 fprintf (out, "Resent-From: %s\n", signature);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 if (!(msgflags & MVIS))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 fprintf (out, "Resent-Bcc: Blind Re-Distribution List: ;\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 if (badmsg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 adios (NULLCP, "re-format message and try again");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 static int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 get_header (header, table)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 char *header;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712 struct headers *table;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714 struct headers *h;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 for (h = table; h -> value; h++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 if (uleq (header, h -> value))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 return (h - table);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 /* output the address list for header "name". The address list
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 * is a linked list of mailname structs. "nl" points to the head
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 * of the list. Alias substitution should be done on nl.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 static putadr (name, nl)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 struct mailname *nl;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 register struct mailname *mp, *mp2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 register int linepos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 int namelen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 fprintf (out, "%s: ", name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 namelen = strlen(name) + 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 linepos = namelen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 for (mp = nl; mp; ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 if (linepos > MAX_SM_FIELD) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 fprintf (out, "\n%s: ", name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 linepos = namelen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 if (mp->m_nohost) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 /* a local name - see if it's an alias */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 cp = akvalue(mp->m_mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 if (strcmp(cp, mp->m_mbox) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 /* wasn't an alias - use what the user typed */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 linepos = putone( mp->m_text, linepos, namelen );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 /* an alias - expand it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 while (cp = getname(cp) ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 if (linepos > MAX_SM_FIELD) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 fprintf (out, "\n%s: ", name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 linepos = namelen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 mp2 = getm( cp, NULLCP, 0, AD_HOST, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 if (akvisible()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 mp2->m_pers = getcpy(mp->m_mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 linepos = putone( adrformat(mp2), linepos, namelen );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 linepos = putone( mp2->m_text, linepos, namelen );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 mnfree( mp2 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 /* not a local name - use what the user typed */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 linepos = putone( mp->m_text, linepos, namelen );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 mp2 = mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 mp = mp->m_next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 mnfree( mp2 );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 putc( '\n', out );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 static int putone ( adr, pos, indent )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 register char *adr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 register int pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 int indent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 register int len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 static int linepos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 char name[BUFSIZ], *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 if (hencode) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 if ((ep = malloc((unsigned)strlen(adr)*10+1)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 adios(NULLCP, "out of memory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 sprintf(name, "%*s", indent, ""); /* dummy */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 (void) exthdr_encode(adr, ep, pos, name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 len = strlen(ep);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 len = strlen( adr );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 if (pos == indent)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 linepos = pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 else if ( linepos+len > outputlinelen ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 fprintf ( out, ",\n%*s", indent, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 if (hencode) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 (void) exthdr_encode(adr, ep, linepos, name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 len = strlen(ep);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 linepos = indent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811 pos += indent + 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 fputs( ", ", out );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 linepos += 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 pos += 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 if (hencode) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 char *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 fputs(ep, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 linepos = (p = rindex(ep, '\n')) ? (ep + len) - (p+1) : linepos + len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 free(ep);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 fputs(adr, out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 linepos += len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 #else /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 fputs( adr, out );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 linepos += len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 return (pos+len);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 static insert_fcc (hdr, pp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 struct headers *hdr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 char *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 for (cp = pp; isspace (*cp); cp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 for (pp += strlen (pp) - 1; pp > cp && isspace (*pp); pp--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 if (pp >= cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 *++pp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 if (*cp == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 if (fccind >= FCCS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 adios (NULLCP, "too many %ss", hdr -> value);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855 fccfold[fccind++] = getcpy (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859 /* BCC GENERATION */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861 static make_bcc_file () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 int fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 child_id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865 status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866 char *vec[6];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867 FILE * in, *out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869 (void)mktemp (bccfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 if ((out = fopen (bccfil, "w")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871 adios (bccfil, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 (void)chmod (bccfil, 0600);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 fprintf (out, "Date: %s\n", dtimenow ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 fprintf (out, "From: %s\n", signature);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 if (subject)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 fprintf (out, "Subject: %s", subject);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 fprintf (out, "BCC:\n\n------- Blind-Carbon-Copy\n\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
879 (void)fflush (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
880
bce86c4163a3 Initial revision
kono
parents:
diff changeset
881 if (filter == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
882 if ((fd = open (tmpfil, 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
883 adios (NULLCP, "unable to re-open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
884 cpydgst (fd, fileno (out), tmpfil, bccfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
885 close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
886 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
887 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
888 vec[0] = r1bindex (mhlproc, '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
889
bce86c4163a3 Initial revision
kono
parents:
diff changeset
890 for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
891 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
892 switch (child_id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
893 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
894 adios ("vfork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
895
bce86c4163a3 Initial revision
kono
parents:
diff changeset
896 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
897 dup2 (fileno (out), 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
898
bce86c4163a3 Initial revision
kono
parents:
diff changeset
899 i = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
900 vec[i++] = "-forward";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
901 vec[i++] = "-form";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
902 vec[i++] = filter;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
903 vec[i++] = tmpfil;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
904 vec[i] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
905
bce86c4163a3 Initial revision
kono
parents:
diff changeset
906 execvp (mhlproc, vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
907 adios (mhlproc, "unable to exec");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
908
bce86c4163a3 Initial revision
kono
parents:
diff changeset
909 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
910 if (status = pidwait (child_id, OK))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
911 admonish (NULL, "%s lost (status=0%o)", vec[0], status);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
912 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
913 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
914 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
915
bce86c4163a3 Initial revision
kono
parents:
diff changeset
916 fseek (out, 0L, 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
917 fprintf (out, "\n------- End of Blind-Carbon-Copy\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
918 (void)fclose (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
919 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
920 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
921
bce86c4163a3 Initial revision
kono
parents:
diff changeset
922 /* FCC INTERACTION */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
923
bce86c4163a3 Initial revision
kono
parents:
diff changeset
924 static file (path)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
925 char *path;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
926 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
927 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
928
bce86c4163a3 Initial revision
kono
parents:
diff changeset
929 if (fccind == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
930 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
931
bce86c4163a3 Initial revision
kono
parents:
diff changeset
932 for (i = 0; i < fccind; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
933 if (whomflg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
934 printf ("Fcc: %s\n", fccfold[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
935 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
936 fcc (path, fccfold[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
937 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
938
bce86c4163a3 Initial revision
kono
parents:
diff changeset
939
bce86c4163a3 Initial revision
kono
parents:
diff changeset
940 static fcc (file, folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
941 char *file,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
942 *folder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
943 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
944 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
945 child_id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
946 status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
947 char fold[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
948
bce86c4163a3 Initial revision
kono
parents:
diff changeset
949 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
950 printf ("%sFcc: %s\n", msgstate == resent ? "Resent-" : "", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
951 (void)fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
952
bce86c4163a3 Initial revision
kono
parents:
diff changeset
953 for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
954 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
955 switch (child_id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
956 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
957 if (!verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
958 fprintf (stderr, " %sFcc %s: ",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
959 msgstate == resent ? "Resent-" : "", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
960 fprintf (verbose ? stdout : stderr, "no forks, so not ok\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
961 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
962
bce86c4163a3 Initial revision
kono
parents:
diff changeset
963 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
964 (void)sprintf (fold, "%s%s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
965 *folder == '+' || *folder == '@' ? "" : "+", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
966 execlp (fileproc, r1bindex (fileproc, '/'),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
967 "-link", "-file", file, fold, NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
968 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
969
bce86c4163a3 Initial revision
kono
parents:
diff changeset
970 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
971 if (status = pidwait (child_id, OK)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
972 if (!verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
973 fprintf (stderr, " %sFcc %s: ",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
974 msgstate == resent ? "Resent-" : "", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
975 fprintf (verbose ? stdout : stderr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
976 " errored (0%o)\n", status);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
977 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
978 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
979
bce86c4163a3 Initial revision
kono
parents:
diff changeset
980 (void)fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
981 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
982
bce86c4163a3 Initial revision
kono
parents:
diff changeset
983 /* TERMINATION */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
984
bce86c4163a3 Initial revision
kono
parents:
diff changeset
985 /* VARARGS2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
986
bce86c4163a3 Initial revision
kono
parents:
diff changeset
987 static die (what, fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
988 char *what,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
989 *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
990 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
991 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
992 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
993 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
994 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
995 adios (what, fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
996 }