annotate uip/slocal.c @ 13:3c5835cca094

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 15:40:28 +0900
parents 441a2190cfae
children 07f8972434be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* slocal.c - MH style mailer to write to a local user's mailbox */
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: slocal.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 /* This program implements mail delivery in the MH/MMDF style.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 Under SendMail, users should add the line
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 "| /usr/local/lib/mh/slocal"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 to their $HOME/.forward file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 Under MMDF-I, users should (symbolically) link /usr/local/lib/mh/slocal
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 to $HOME/bin/rcvmail.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 Under stand-alone MH, post will automatically run this during local
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 delivery.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 This program should be used ONLY if you have "mts sendmail" or "mts mh"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 or "mts mmdf1" set in your MH configuration.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 /* */
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
25 #include <unistd.h>
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #include "../h/dropsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #include "../h/rcvmail.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #include "../zotnet/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #include <pwd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #ifndef V7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #ifndef NOIOCTLH
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #include <sys/ioctl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #endif /* NOIOCTLH */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #endif /* not V7 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #include <utmp.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #ifndef UTMP_FILENAME
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 #ifdef UTMP_FILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #define UTMP_FILENAME UTMP_FILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 #ifdef _PATH_UTMP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #define UTMP_FILENAME _PATH_UTMP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 #define UTMP_FILENAME "/etc/utmp"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 #endif /* UTMP_FILENAME */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #ifdef MSGID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 static int check_msgid (int, char *);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #undef DBM /* used by ndbm.h */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 #include <ndbm.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 #ifdef DBM_SUFFIX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 #undef dbm_pagfno
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 #define dbm_pagfno dbm_dirfno
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 #endif /* DBM_SUFFIX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #include <sys/file.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 #include <fcntl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 #endif
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
72 //#ifdef UNISTD
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 #include <unistd.h>
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74 //#endif
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 #if defined(LOCKF) && !defined(F_ULOCK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 #include <sys/fcntl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 #endif /* LOCKF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 #define NVEC 100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 #define ADDRSW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 "addr address", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 #define USERSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 "user name", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 #define FILESW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 "file file", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 #define SENDSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 "sender address", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 #define MBOXSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 "mailbox file", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 #define HOMESW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 "home directory", -4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 #define INFOSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 "info data", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 #define MAILSW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 "maildelivery file", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 #define VERBSW 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 "verbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 #define NVERBSW 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 "noverbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 #define DEBUGSW 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 "debug", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 #define HELPSW 11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 static int debug = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 static int globbed = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 static int parsed = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 static int utmped = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 static int verbose = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 #ifdef SETMG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 static gid_t mailgroup;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 #endif /* SETMG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 static char *addr = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 static char *user = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 static char *info = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 static char *file = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 static char *sender = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 static char *unixfrom = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 static char *mbox = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 static char *home = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 static struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 static char ddate[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 struct tws *now;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 static jmp_buf myctx;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 struct pair {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 char *p_name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 char *p_value;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 char p_flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 #define P_NIL 0x00
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 #define P_ADR 0x01
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 #define P_HID 0x02
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 #define P_CHK 0x04
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 static struct pair *lookup ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 static struct pair hdrs[NVEC + 1] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 "source", NULL, P_HID,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 "addr", NULL, P_HID,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 "Return-Path", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 "Reply-To", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 "From", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 "Sender", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 "To", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 "cc", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 "Resent-Reply-To", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 "Resent-From", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 "Resent-Sender", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 "Resent-To", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 "Resent-cc", NULL, P_ADR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 static struct pair vars[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 "sender", NULL, P_NIL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 "address", NULL, P_NIL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 "size", NULL, P_NIL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 "reply-to", NULL, P_CHK,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 "info", NULL, P_NIL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 static char *rcvstore;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 extern char **environ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 static void adorn ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 static TYPESIG alrmser ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 off_t lseek ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 #ifndef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 struct passwd *getpwnam ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 static int localmail(), usr_delivery(), split(), parse(), logged_in();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 static int timely(), usr_file(), usr_pipe(), copyfile();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 static expand(), glob(), copyinfo();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 main (argc, argv, envp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 char **argv,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 **envp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 FILE *fp = stdin;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 *mdlvr = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 buf[100],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 from[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 mailbox[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 tmpfil[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 **argp = argv + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 invo_name = r1bindex (*argv, '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 m_foil (NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 mts_init (invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 adios (NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 (void) sprintf (buf, "%s [switches] [address info sender]",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 help (buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 case ADDRSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 if (!(addr = *argp++))/* allow -xyz arguments */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 case INFOSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 if (!(info = *argp++))/* allow -xyz arguments */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 case USERSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 if (!(user = *argp++))/* allow -xyz arguments */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 case FILESW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 if (!(file = *argp++) || *file == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 case SENDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 if (!(sender = *argp++))/* allow -xyz arguments */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 case MBOXSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 if (!(mbox = *argp++) || *mbox == '-')
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 HOMESW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 if (!(home = *argp++) || *home == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 case MAILSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 if (mdlvr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 adios (NULLCP, "only one maildelivery file at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 mdlvr = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 case VERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 verbose++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 case NVERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 verbose = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 case DEBUGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 debug++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 switch (argp - (argv + 1)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 case 1:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 addr = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 case 2:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 info = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 case 3:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 sender = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 rcvstore = getcpy(libpath("rcvstore"));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 if (addr == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 addr = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 if (user == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 user = (cp = index (addr, '.')) ? ++cp : addr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 if ((pw = getpwnam (user)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 adios (NULLCP, "no such local user as %s", user);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 if (chdir (pw -> pw_dir) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 (void) chdir ("/");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 (void) umask (0077);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 if (geteuid () == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 #ifdef BSD41A
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 (void) inigrp (pw -> pw_name, pw -> pw_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 #endif /* BSD41A */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 (void) setgid (pw -> pw_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 (void) initgroups (pw -> pw_name, pw -> pw_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 (void) setuid (pw -> pw_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 #ifdef SETMG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 mailgroup = getegid();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 setgid(getgid());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 #endif /* SETMG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 if (info == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 info = "";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 setbuf (stdin, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 if (file == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 fprintf (stderr, "retrieving message from stdin\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 if ((fd = copyfile (fileno (stdin), file = tmpfil, 1)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 adios (NULLCP, "unable to create temporary file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 int tmpfd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 if ((tmpfd = open (file, 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 adios(file, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 fprintf (stderr, "retrieving message from file \"%s\"\n", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 if ((fd = copyfile (tmpfd, tmpfil, 1)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 adios (NULL, "unable to create temporary file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 close (tmpfd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 fprintf (stderr, "temporary file \"%s\" selected\n", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 if ((fp = fdopen (fd, "r+")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 adios (NULLCP, "unable to access temporary file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 from[0] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 if (sender == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 sender = "";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 copyinfo (fp, from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 if (mbox == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 (void) sprintf (mailbox, "%s/%s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 mmdfldir[0] ? mmdfldir : pw -> pw_dir,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 mmdflfil[0] ? mmdflfil : pw -> pw_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 mbox = mailbox;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 if (home == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 home = pw -> pw_dir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 if ((now = dtwstime ()) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 adios (NULLCP, "unable to ascertain local time");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 (void) sprintf (ddate, "Delivery-Date: %s\n", dtimenow ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 if (debug) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 fprintf (stderr, "addr=\"%s\" user=\"%s\" info=\"%s\" file=\"%s\"\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 addr, user, info, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 fprintf (stderr, "sender=\"%s\" mbox=\"%s\" home=\"%s\" from=\"%s\"\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 sender, mbox, home, from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 fprintf (stderr, "ddate=\"%s\" now=%02d:%02d\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 ddate, now -> tw_hour, now -> tw_min);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 done (localmail (fd, from, mdlvr) != NOTOK ? RCV_MOK : RCV_MBX);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 static int localmail (fd, from, mdlvr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 char *from,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 *mdlvr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 #ifdef MSGID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 static int first = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 #ifdef DBM_SUFFIX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 char buf[32];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 (void) sprintf(buf, ".maildelivery%s", DBM_SUFFIX);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 if (stat (buf, &st) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 #else /* DBM_SUFFIX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 if (stat (".maildelivery.pag", &st) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 #endif /* DBM_SUFFIX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 * Allow a user to trigger the database by creating an
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 * empty database file. That gets us here, now we need
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 * to remove it so DBM will create and initialize it properly.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 if (st.st_size == 0 && first) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 first = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 #ifdef DBM_SUFFIX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 (void) unlink(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 #else /* DBM_SUFFIX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 (void) unlink(".maildelivery.pag");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 #endif /* DBM_SUFFIX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 if (check_msgid (fd, ".maildelivery") == DONE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 if (usr_delivery (fd, mdlvr ? mdlvr : ".maildelivery", 0, from) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 if (usr_delivery (fd, maildelivery, 1, from) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 printf ("(invoking hook)\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 if (usr_hook (fd, mbox) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 printf ("(trying normal delivery)\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 return usr_file (fd, mbox, from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 int matches (p1, p2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 register char *p1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 *p2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 register char *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 if (p1 == 0 || p2 == 0) return 0; /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 for (p = p1; *p; p++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 if (uprf (p, p2))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 if (ml_ismlptr (p))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 p++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 #define matches(a,b) (stringdex (b, a) >= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 static int usr_delivery (fd, delivery, su, from)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 int fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 su;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 char *delivery,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 *from;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 accept,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 status,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 won,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 vecp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 *action,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 *field,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 *pattern,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 *string;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 char buffer[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 tmpbuf[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 *vec[NVEC];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 register struct pair *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 register FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 if ((fp = fopen (delivery, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 if (fstat (fileno (fp), &st) == NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 || (st.st_uid != 0 && (su || st.st_uid != pw -> pw_uid))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 || st.st_mode & 0022) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 if (verbose) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 printf ("%s: ownership/modes bad (%d, %d,%d,0%o)\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 delivery, su, pw -> pw_uid, st.st_uid, st.st_mode);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 won = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 next = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 while (fgets (buffer, sizeof buffer, fp) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 if (*buffer == '#' || *buffer == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 if (cp = index (buffer, '\n'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 ml_conv(buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 if ((vecp = split (buffer, vec)) < 5) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 fprintf(stderr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 "WARNING: entry with only %d fields, skipping ...\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 vecp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 for (i = 0; vec[i]; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 fprintf (stderr, "vec[%d]: \"%s\"\n", i, vec[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 field = vec[0];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 pattern = vec[1];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 action = vec[2];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 switch (vec[3][0]) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 case 'N':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 case 'n':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 if (! next)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 continue; /* if previous condition failed, don't
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 do this - else fall through */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 case '?':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 if (won)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 continue; /* else fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 case 'A':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 case 'a':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 accept = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 case 'R':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 case 'r':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 accept = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 string = vec[4];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 if (vecp > 5) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 if (uleq (vec[5], "select")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 if (logged_in () != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 if (vecp > 7 && timely (vec[6], vec[7]) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 switch (*field) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 case '*':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 case 'd':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 if (uleq (field, "default")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 if (won)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 } /* else fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 if (!parsed && parse (fd) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 (void) fclose (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 if ((p = lookup (hdrs, field)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 || (p->p_value == NULL) /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 || !matches (p -> p_value, pattern)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 next = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 next = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 switch (*action) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 case 'q':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 if (!uleq (action, "qpipe"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 continue; /* else fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 case '^':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 expand (tmpbuf, string, fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 if (split (tmpbuf, vec) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 status = usr_pipe (fd, tmpbuf, vec[0], vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 case 'p':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 if (!uleq (action, "pipe"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 continue; /* else fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 case '|':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 vec[2] = "sh";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 vec[3] = "-c";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 expand (tmpbuf, string, fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 vec[4] = tmpbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 vec[5] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 status = usr_pipe (fd, tmpbuf, "/bin/sh", vec + 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 case '+':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 dofolder:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 if (*string == '+')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 strcpy(tmpbuf, string);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 sprintf(tmpbuf, "+%s", string);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 vec[2] = "rcvstore";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 vec[3] = tmpbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 vec[4] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 printf("rcvstore %s", vec[3]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 status = usr_pipe(fd, "rcvstore", rcvstore, vec + 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 case 'f':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 if (uleq(action, "folder"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 goto dofolder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 if (!uleq (action, "file"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 continue; /* else fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 case '>':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 #ifdef RPATHS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 status = usr_file (fd, string, from); /* UUCP format? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 status = usr_file (fd, string, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 case 'm':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 if (!uleq (action, "mbox"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 status = usr_file (fd, string, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 case 'd':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 if (!uleq (action, "destroy"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 status = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 #ifdef REALLY_DESTROY
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 printf ("\tdestroying message\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 if (accept)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 won++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 goto finish;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 #endif /* REALLY_DESTROY */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 if (status == OK) { /* next is already 1. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 if (accept)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 won++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 } else { /* overload the next variable */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 next = 0; /* to indicate that action failed */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690 finish:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 (void) fclose (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 return (won ? OK : NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 #define QUOTE '\\'
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 static int split (cp, vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 for (i = 0, s = cp; i <= NVEC;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 vec[i] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 while (isspace (*s) || *s == ',')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 *s++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 if (*s == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 if (*s == '"') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714 for (vec[i++] = ++s; *s != 0 && *s != '"'; s++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 if (*s == QUOTE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 if (*++s == '"')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 (void) strcpy (s - 1, s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 s--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 if (*s == '"')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 *s++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724 if (*s == QUOTE && *++s != '"')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 s--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 vec[i++] = s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 while (*s != 0 && !isspace (*s) && *s != ',')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 vec[i] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 static int parse (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 register int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 int fd1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 *dp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 *lp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 char name[NAMESZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 field[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 register struct pair *p,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 *q;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 register FILE *in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 if (parsed++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 if ((fd1 = dup (fd)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 if ((in = fdopen (fd1, "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 rewind (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 if (p = lookup (hdrs, "source"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 p -> p_value = getcpy (sender);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 if (p = lookup (hdrs, "addr"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 p -> p_value = getcpy (addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 for (i = 0, state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 switch (state = m_getfld (state, name, field, sizeof field, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 lp = add (field, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 state = m_getfld (state, name, field, sizeof field, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777 lp = add (field, lp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 for (p = hdrs; p -> p_name; p++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 if (uleq (p -> p_name, name)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 if (!(p -> p_flags & P_HID)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 if (cp = p -> p_value)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 if (p -> p_flags & P_ADR) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 dp = cp + strlen (cp) - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 if (*dp == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 *dp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 cp = add (",\n\t", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 cp = add ("\t", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 p -> p_value = add (lp, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 free (lp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 if (p -> p_name == NULL && i < NVEC) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 p -> p_name = getcpy (name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 p -> p_value = lp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 p -> p_flags = P_NIL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 p++, i++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 p -> p_name = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 if (state != FLDEOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 case BODY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 case BODYEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 case FILEEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 case LENERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 case FMTERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 advise (NULLCP, "format error in message");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 advise (NULLCP, "internal error");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 if (p = lookup (vars, "reply-to")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 if ((q = lookup (hdrs, "reply-to")) == NULL || q -> p_value == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 q = lookup (hdrs, "from");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 p -> p_value = getcpy (q ? q -> p_value : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 p -> p_flags &= ~P_CHK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 fprintf (stderr, "vars[%d]: name=\"%s\" value=\"%s\"\n",
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
833 (int)(p - vars), p -> p_name, p -> p_value);
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 #define empty(s) ((s) ? (s) : "")
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 for (p = hdrs; p -> p_name; p++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 fprintf (stderr, "hdrs[%d]: name=\"%s\" value=\"%s\"\n",
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
839 (int)(p - hdrs), p -> p_name, empty(p -> p_value));
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 #undef empty
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 for (p = hdrs; p -> p_name; p++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 char *tmpbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 if (! p -> p_value)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 tmpbuf = getcpy(p -> p_value);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 exthdr_decode(tmpbuf, p -> p_value);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 free(tmpbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857 #define LPAREN '('
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 #define RPAREN ')'
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860 static expand (s1, s2, fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861 register char *s1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 *s2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865 register char c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866 *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867 register struct pair *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869 if (!globbed)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 glob (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 while (c = *s2++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873 if (c != '$' || *s2 != LPAREN)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 *s1++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 for (cp = ++s2; *s2 && *s2 != RPAREN; s2++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 if (*s2 != RPAREN) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
879 s2 = --cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
880 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
881 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
882 *s2++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
883 if (p = lookup (vars, cp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
884 if (!parsed && (p -> p_flags & P_CHK))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
885 (void) parse (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
886
bce86c4163a3 Initial revision
kono
parents:
diff changeset
887 (void) strcpy (s1, p -> p_value);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
888 s1 += strlen (s1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
889 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
890 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
891 *s1 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
892 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
893
bce86c4163a3 Initial revision
kono
parents:
diff changeset
894 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
895
bce86c4163a3 Initial revision
kono
parents:
diff changeset
896 static glob (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
897 register int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
898 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
899 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
900 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
901 register struct pair *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
902
bce86c4163a3 Initial revision
kono
parents:
diff changeset
903 if (globbed++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
904 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
905
bce86c4163a3 Initial revision
kono
parents:
diff changeset
906 if (p = lookup (vars, "sender"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
907 p -> p_value = getcpy (sender);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
908 if (p = lookup (vars, "address"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
909 p -> p_value = getcpy (addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
910 if (p = lookup (vars, "size")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
911 (void) sprintf (buffer, "%d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
912 fstat (fd, &st) != NOTOK ? (int) st.st_size : 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
913 p -> p_value = getcpy (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
914 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
915 if (p = lookup (vars, "info"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
916 p -> p_value = getcpy (info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
917
bce86c4163a3 Initial revision
kono
parents:
diff changeset
918 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
919 for (p = vars; p -> p_name; p++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
920 fprintf (stderr, "vars[%d]: name=\"%s\" value=\"%s\"\n",
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
921 (int)(p - vars), p -> p_name, p -> p_value);
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
922 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
923
bce86c4163a3 Initial revision
kono
parents:
diff changeset
924 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
925
bce86c4163a3 Initial revision
kono
parents:
diff changeset
926 static struct pair *lookup (pairs, key)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
927 register struct pair *pairs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
928 register char *key;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
929 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
930 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
931
bce86c4163a3 Initial revision
kono
parents:
diff changeset
932 for (; cp = pairs -> p_name; pairs++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
933 if (uleq (cp, key))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
934 return pairs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
935
bce86c4163a3 Initial revision
kono
parents:
diff changeset
936 return NULL;
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
bce86c4163a3 Initial revision
kono
parents:
diff changeset
941 static int logged_in () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
942 struct utmp ut;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
943 register FILE *uf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
944
bce86c4163a3 Initial revision
kono
parents:
diff changeset
945 if (utmped)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
946 return utmped;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
947
bce86c4163a3 Initial revision
kono
parents:
diff changeset
948 if ((uf = fopen (UTMP_FILENAME, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
949 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
950
bce86c4163a3 Initial revision
kono
parents:
diff changeset
951 while (fread ((char *) &ut, sizeof ut, 1, uf) == 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
952 if (ut.ut_name[0] != 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
953 #ifdef UTMAXTYPE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
954 && ut.ut_type == USER_PROCESS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
955 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
956 && strncmp (user, ut.ut_name, sizeof ut.ut_name) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
957 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
958 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
959 (void) fclose (uf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
960 return (utmped = DONE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
961 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
962
bce86c4163a3 Initial revision
kono
parents:
diff changeset
963 (void) fclose (uf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
964 return (utmped = NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
965 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
966
bce86c4163a3 Initial revision
kono
parents:
diff changeset
967
bce86c4163a3 Initial revision
kono
parents:
diff changeset
968 static int timely (t1, t2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
969 char *t1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
970 *t2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
971 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
972 #define check(t,a,b) if (t < a || t > b) return NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
973 #define cmpar(h1,m1,h2,m2) if (h1 < h2 || (h1 == h2 && m1 < m2)) return OK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
974
bce86c4163a3 Initial revision
kono
parents:
diff changeset
975 int t1hours,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
976 t1mins,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
977 t2hours,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
978 t2mins;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
979
bce86c4163a3 Initial revision
kono
parents:
diff changeset
980 if (sscanf (t1, "%d:%d", &t1hours, &t1mins) != 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
981 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
982 check (t1hours, 0, 23);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
983 check (t1mins, 0, 59);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
984
bce86c4163a3 Initial revision
kono
parents:
diff changeset
985 if (sscanf (t2, "%d:%d", &t2hours, &t2mins) != 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
986 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
987 check (t2hours, 0, 23);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
988 check (t2mins, 0, 59);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
989
bce86c4163a3 Initial revision
kono
parents:
diff changeset
990 cmpar (now -> tw_hour, now -> tw_min, t1hours, t1mins);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
991 cmpar (t2hours, t2mins, now -> tw_hour, now -> tw_min);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
992
bce86c4163a3 Initial revision
kono
parents:
diff changeset
993 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
994 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
995
bce86c4163a3 Initial revision
kono
parents:
diff changeset
996 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
997
bce86c4163a3 Initial revision
kono
parents:
diff changeset
998 static int usr_file (fd, mailbox, from)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
999 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1000 char *mailbox,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1001 *from;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1002 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1003 int md,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1004 mapping;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1005 register char *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1006 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1007 gid_t mail_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1008 int file_mode;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1009
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1010 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1011 printf ("\tdelivering to file \"%s\"", mailbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1012 if (from && *from) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1013 (void) mbx_uucp ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1014 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1015 printf (" (uucp style)");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1016 (void) sprintf (buffer, "%s%s", from, ddate);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1017 bp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1018 mapping = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1019 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1020 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1021 bp = ddate;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1022 mapping = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1023 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1024 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1025 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1026
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1027 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1028 * for SYS5 systems
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1029 * (maildrop: gid = mail (660))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1030 * Attention!! This routine may open a security hole...
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1031 * by hayashi@kuic.kyoto-u.ac.jp
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1032 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1033
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1034 #ifdef SETMG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1035 if (strcmp(mailbox, mbox) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1036 mail_gid = mailgroup;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1037 file_mode = 0660;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1038 setgid(mailgroup);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1039 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1040 mail_gid = pw -> pw_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1041 file_mode = m_gmprot();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1042 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1043 #else /* SETMG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1044 mail_gid = pw -> pw_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1045 file_mode = m_gmprot();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1046 #endif /* SETMG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1047
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1048 if ((md = mbx_open (mailbox, pw -> pw_uid, mail_gid, file_mode))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1049 == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1050 #ifdef SETMG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1051 setgid(getgid());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1052 #endif /* SETMG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1053 adorn ("", "unable to open:");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1054 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1055 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1056
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1057 (void) lseek (fd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1058 if (mbx_copy (mailbox, md, fd, mapping, bp, verbose) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1059 #ifdef SETMG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1060 setgid(getgid());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1061 #endif /* SETMG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1062 adorn ("", "error writing to:");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1063 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1064 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1065
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1066 (void) mbx_close (mailbox, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1067 #ifdef SETMG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1068 setgid(getgid());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1069 #endif /* SETMG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1070 if (verbose) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1071 printf (", done.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1072 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1073 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1074 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1075 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1076
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1077 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1078
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1079 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1080 static int usr_hook (fd, mailbox)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1081 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1082 char *mailbox;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1083 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1084 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1085 vecp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1086 char receive[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1087 tmpfil[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1088 *vec[NVEC];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1089
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1090 if ((fd = copyfile (fd, tmpfil, 0)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1091 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1092 adorn ("unable to copy message; skipping hook\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1093 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1094 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1095 (void) chown (tmpfil, pw -> pw_uid, pw -> pw_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1096
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1097 vecp = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1098 (void) sprintf (receive, "%s/.mh_receive", pw -> pw_dir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1099 switch (access (receive, 01)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1100 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1101 (void) sprintf (receive, "%s/bin/rcvmail", pw -> pw_dir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1102 if (access (receive, 01) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1103 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1104 if (verbose) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1105 printf ("\tnot present\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1106 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1107 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1108 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1109 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1110 vec[vecp++] = addr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1111 vec[vecp++] = tmpfil;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1112 vec[vecp++] = sender;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1113 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1114
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1115 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1116 vec[vecp++] = tmpfil;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1117 vec[vecp++] = mailbox;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1118 vec[vecp++] = home;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1119 vec[vecp++] = addr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1120 vec[vecp++] = sender;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1121 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1122 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1123 vec[0] = r1bindex (receive, '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1124 vec[vecp] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1125
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1126 i = usr_pipe (fd, "rcvmail", receive, vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1127 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1128
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1129 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1130 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1131 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1133 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1134
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1135 static int usr_pipe (fd, cmd, pgm, vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1136 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1137 char *cmd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1138 *pgm,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1139 **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1140 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1141 int bytes,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1142 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1143 child_id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1144 status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1145 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1146
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1147 if (verbose) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1148 printf ("\tdelivering to pipe \"%s\"", cmd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1149 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1150 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1151 (void) lseek (fd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1152
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1153 for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1154 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1155 switch (child_id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1156 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1157 adorn ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1158 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1159
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1160 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1161 if (fd != 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1162 (void) dup2 (fd, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1163 (void) freopen ("/dev/null", "w", stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1164 (void) freopen ("/dev/null", "w", stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1165 if (fd != 3)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1166 (void) dup2 (fd, 3);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1167 closefds (4);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1168 #ifdef TIOCNOTTY
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1169 if ((fd = open ("/dev/tty", 2)) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1170 (void) ioctl (fd, TIOCNOTTY, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1171 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1172 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1173 #endif /* TIOCNOTTY */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1174 #ifdef BSD42
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
1175 (void) setpgrp (); // (void) setpgrp (0, getpid ());
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1176 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1177
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1178 *environ = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1179 (void) m_putenv ("USER", pw -> pw_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1180 (void) m_putenv ("HOME", pw -> pw_dir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1181 (void) m_putenv ("SHELL", pw -> pw_shell);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1182
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1183 execvp (pgm, vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1184 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1185
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1186 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1187 switch (setjmp (myctx)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1188 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1189 (void) signal (SIGALRM, alrmser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1190 bytes = fstat (fd, &st) != NOTOK ? (int) st.st_size : 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1191 if (bytes <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1192 bytes = 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1193 (void) alarm ((unsigned) (bytes * 60 + 300));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1194
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1195 status = pidwait (child_id, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1196
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1197 (void) alarm (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1198 #ifdef MMDFI
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1199 if (status == RP_MOK || status == RP_OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1200 status = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1201 #endif /* MMDFI */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1202 if (verbose) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1203 if (status == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1204 printf (", wins.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1205 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1206 if ((status & 0xff00) == 0xff00)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1207 printf (", system error\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1208 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1209 (void) pidstatus (status, stdout, ", loses");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1210 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1211 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1212 return (status == 0 ? OK : NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1213
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1214 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1215 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1216 (void) kill (child_id, SIGKILL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1217 #else /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1218 (void) killpg (child_id, SIGKILL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1219 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1220 if (verbose) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1221 printf (", timed-out; terminated\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1222 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1223 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1224 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1225 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1226 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1227 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1228
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1229 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1231 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1232
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1233 static TYPESIG alrmser (i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1234 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1235 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1236 longjmp (myctx, DONE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1237 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1238
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1239 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1241 static copyinfo (fp, from)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1242 register FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1243 char *from;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1244 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1245 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1246 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1247 static char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1248
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1249 if (unixfrom) /* interface from copyfile */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1250 strcpy (from, unixfrom);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1251 else if (fgets (from, BUFSIZ, fp) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1252 adios (NULLCP, "no message");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1253
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1254 if (strncmp (from, "From ", i = strlen ("From "))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1255 rewind (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1256 *from = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1257 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1258 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1259
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1260 (void) strcpy (buffer, from + i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1261 if (cp = index (buffer, '\n')) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1262 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1263 cp -= 24;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1264 if (cp < buffer)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1265 cp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1266 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1267 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1268 cp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1269 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1270
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1271 for (cp = buffer + strlen (buffer) - 1; cp >= buffer; cp--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1272 if (isspace (*cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1273 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1274 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1275 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1276 sender = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1277 rewind (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1278 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1279
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1280 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1281
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1282 static int copyfile (qd, tmpfil, fold)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1283 int qd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1284 fold;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1285 register char *tmpfil;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1286 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1287 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1288 first = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1289 fd1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1290 fd2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1291 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1292 register FILE *qfp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1293 *ffp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1294
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1295 (void) strcpy (tmpfil, m_tmpfil (invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1296 if ((fd1 = creat (tmpfil, 0600)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1297 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1298 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1299 if ((fd1 = open (tmpfil, 2)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1300 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1301
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1302 if (!fold) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1303 while ((i = read (qd, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1304 if (write (fd1, buffer, i) != i) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1305 you_lose: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1306 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1307 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1308 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1309 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1310 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1311 goto you_lose;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1312 (void) lseek (fd1, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1313 return fd1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1314 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1315
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1316 if ((fd2 = dup (qd)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1317 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1318 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1319 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1320 if ((qfp = fdopen (fd2, "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1321 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1322 (void) close (fd2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1323 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1324 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1325
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1326 if ((fd2 = dup (fd1)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1327 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1328 (void) fclose (qfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1329 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1330 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1331 if ((ffp = fdopen (fd2, "r+")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1332 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1333 (void) close (fd2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1334 (void) fclose (qfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1335 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1336 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1337
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1338 i = strlen ("From ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1339 while (fgets (buffer, sizeof buffer, qfp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1340 if (!strncmp (buffer, "From ", i))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1341 if (first == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1342 #ifdef RPATHS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1343 register char *fp, *cp, *hp, *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1344 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1345 unixfrom = getcpy (buffer); /* save for later */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1346 #ifndef RPATHS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1347 continue; /* but don't put in file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1348 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1349 hp = cp = index (fp = unixfrom + i, ' ');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1350 while (hp = index (++hp, 'r'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1351 if (uprf (hp, "remote from")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1352 hp = rindex (hp, ' ');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1353 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1354 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1355 if (hp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1356 ep = rindex (++hp, '\n');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1357 sprintf (buffer, "Return-Path: %.*s!%.*s\n",
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
1358 (int)(ep - hp), hp,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
1359 (int)(cp - fp), fp);
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1360 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1361 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1362 sprintf (buffer, "Return-Path: %.*s\n",
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
1363 (int)(cp - fp), fp);
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1364 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1365 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1366 #ifdef notdef /* mbx_copy does this */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1367 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1368 putc ('>', ffp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1369 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1370 first++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1371 fputs (buffer, ffp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1372 if (ferror (ffp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1373 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1374 (void) fclose (ffp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1375 (void) fclose (qfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1376 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1377 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1378 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1379
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1380 (void) fclose (ffp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1381 if (ferror (qfp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1382 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1383 (void) fclose (qfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1384 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1385 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1386 (void) fclose (qfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1387
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1388 (void) lseek (fd1, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1389
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1390 return fd1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1391 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1392
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1393 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1394
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1395 /* VARARGS2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1396
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1397 static void adorn (what, fmt, a, b, c, d, e, f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1398 char *what,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1399 *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1400 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1401 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1402 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1403 *d,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1404 *e,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1405 *f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1406 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1407 char *cp = invo_name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1408
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1409 if (!verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1410 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1411 printf (", ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1412
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1413 invo_name = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1414 advise (what, fmt, a, b, c, d, e, f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1415 invo_name = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1416 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1417
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1418 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1419
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1420 #ifdef MSGID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1421
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1422 static int check_msgid (fd, file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1423 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1424 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1425 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1426 int fd1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1427 state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1428 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1429 buf[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1430 name[NAMESZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1431 datum key,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1432 value;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1433 DBM *db;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1434 FILE *in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1435
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1436 if ((fd1 = dup (fd)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1437 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1438 if ((in = fdopen (fd1, "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1439 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1440 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1441 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1442 rewind (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1443
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1444 for (state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1445 switch (state = m_getfld (state, name, buf, sizeof buf, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1446 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1447 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1448 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1449 if (!uleq (name, "Message-ID")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1450 while (state == FLDPLUS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1451 state = m_getfld (state, name, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1452 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1453 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1454
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1455 cp = add (buf, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1456 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1457 state = m_getfld (state, name, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1458 cp = add (buf, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1459 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1460 key.dsize = strlen (key.dptr = trimcpy (cp)) + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1461 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1462 cp = key.dptr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1463
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1464 if ((db = dbm_open (file, O_RDWR | O_CREAT, 0600)) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1465 advise (file, "unable to perform dbm_open on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1466 out: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1467 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1468 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1469 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1470 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1471 #ifdef LOCKF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1472 if (lockf (dbm_pagfno (db), F_LOCK, 0) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1473 advise (file, "unable to perform lockf on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1474 goto out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1475 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1476 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1477 #ifdef FCNTL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1478 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1479 struct flock fl;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1480
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1481 fl.l_type = F_WRLCK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1482 fl.l_whence = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1483 fl.l_start = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1484 fl.l_len = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1485 if (fcntl (dbm_pagfno (db), F_SETLK, &fl) == -1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1486 advise (file, "unable to perform flock on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1487 goto out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1488 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1489 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1490 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1491 if (flock (dbm_pagfno (db), LOCK_EX) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1492 advise (file, "unable to perform flock on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1493 goto out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1494 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1495 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1496 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1497
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1498 value = dbm_fetch (db, key);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1499 if (value.dptr != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1500 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1501 advise (NULLCP,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1502 "Message-ID: %s already received on\n\tDate: %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1503 cp, value.dptr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1504 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1505 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1506 return DONE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1507 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1508
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1509 value.dsize = strlen (value.dptr =
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1510 ddate + sizeof "Delivery-Date:") + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1511
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1512 if (dbm_store (db, key, value, DBM_INSERT))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1513 advise (file, "possibly corrupt file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1514
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1515 dbm_close (db);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1516
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1517 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1518 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1519
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1520 case BODY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1521 case BODYEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1522 case FILEEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1523 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1524
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1525 case LENERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1526 case FMTERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1527 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1528 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1529 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1530
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1531 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1532 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1533
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1534 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1535 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1536 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1537 #endif