annotate uip/inc.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents a6481689f99c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* inc.c - incorporate messages from a maildrop into a folder */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
3 static char ident[] = "@(#)$Id: inc.c,v 1.2 2006/12/05 18:18:13 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 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 /* Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 * Added hpux hacks to set and reset gid to be "mail" as needed. The reset
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 * is necessary so inc'ed mail is the group of the inc'er, rather than
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 * "mail". We setgid to egid only when [un]locking the mail file. This
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 * is also a major security precaution which will not be explained here.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 * Fri Feb 7 16:04:57 PST 1992 John Romine <bug-mh@ics.uci.edu>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 * NB: I'm not 100% sure that this setgid stuff is secure even now.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #include "../h/dropsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #ifdef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #include <krb.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #ifdef HESIOD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #include <hesiod.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #include "../h/formatsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 #include "../h/scansbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 #include "../zotnet/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #ifdef UNISTD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 #ifndef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 #define MFminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 #else /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 #define MFminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 #ifndef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #define POPminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 #else /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 #define POPminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 #ifndef RPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #define RPOPminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 #else /* RPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 #define RPOPminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 #endif /* RPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 #ifndef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 #define APOPminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 #define APOPminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #endif /* APOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 #ifndef TMA
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 #define TMAminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 #else /* TMA */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 #define TMAminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 #endif /* TMA */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 #define AUDSW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 "audit audit-file", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 #define NAUDSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 "noaudit", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 #define CHGSW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 "changecur", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 #define NCHGSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 "nochangecur", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 #define DECRSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 "decrypt", TMAminc (-7),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 #define NDECRSW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 "nodecrypt", TMAminc (-9),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 #define MSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 "file name", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 #define FORMSW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 "form formatfile", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 #define FMTSW 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 "format string", 5,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 #define HOSTSW 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 "host host", POPminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 #define USERSW 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 "user user", POPminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 #define PACKSW 11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 "pack file", POPminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 #define NPACKSW 12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 "nopack", POPminc (-6),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 #define APOPSW 13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 "apop", APOPminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 #define NAPOPSW 14
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 "noapop", APOPminc (-6),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 #define RPOPSW 15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 "rpop", RPOPminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 #define NRPOPSW 16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 "norpop", RPOPminc (-6),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 #define SILSW 17
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 "silent", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 #define NSILSW 18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 "nosilent", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 #define TRNCSW 19
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 "truncate", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 #define NTRNCSW 20
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 "notruncate", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 #define UUCPSW 21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 "uucp", MFminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 #define NUUCPSW 22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 "nouucp", MFminc (-6),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 #define WIDSW 23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 "width columns", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 #define HELPSW 24
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 int snoop = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 extern char response[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 static char *file = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 static int size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 static long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 static long start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 static long stop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 static int pd = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 static FILE *pf = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 static int pop_action (), pop_pack ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 static int map_count();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 /* * /
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 static int real_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 #ifdef MAILGROUP /* For setting and returning to "mail" gid */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 static int return_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 /* these variables have to be globals so that done() can correctly clean up the lockfile */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 static int locked = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 static char *newmail;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 static FILE *in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 char *argv[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 int chgflag = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 trnflag = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 decflag = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 noisy = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 width = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 uucp = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 nmsgs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 nbytes,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 p = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 #if !defined(RPOP) && !defined(APOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 rpop = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 #else /* RPOP || APOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 #if defined(APOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 rpop = -1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 #else /* RPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 rpop = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 #endif /* APOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 #endif /* !RPOP && !APOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 hghnum,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 *maildir,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 *folder = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 *form = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 *format = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 *audfile = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 *from = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 *host = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 *pass = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 buf[100],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 **ap,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 **argp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 *nfs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 *arguments[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 char *user = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 struct stat st,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 s1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 FILE *aud = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 #ifdef MHE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 FILE *mhe = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 #endif /* MHE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 #ifdef HESIOD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 struct hes_postoffice *po;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 char *tmphost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 /* absolutely the first thing we do is save our privileges,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 * and drop them if we can.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 * On some system, we can regain the root privileges
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 * even after switching to normal privileges.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 real_uid = getuid();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 #ifdef hpux
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 setresuid(-1, real_uid, -1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 #ifdef SETEUID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 seteuid(real_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 #ifdef SETREUID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 getusr();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 setreuid(0, real_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 #endif /* SETREUID */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 #endif /* SETEUID */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 #endif /* hpux */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 return_gid = getegid(); /* Save effective gid, assuming we'll use it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 #ifdef todo
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 * TODO: On some system, setgid() changes saved gid even when it is called
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 * by non-privileged user. We should use setegid() on such a system.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 #define setgid setegid
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 * with MAILGROUP and POP both defined the setgid() call ran as root,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 * and saved gid would be lost. At first, we must check the effective uid.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 * (cf. 93/12/17 bsa@kf8nh.wariat.org)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 if (geteuid() != 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 setgid(getgid()); /* Turn off extraordinary privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 #else /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 setgid(getgid()); /* Turn off extraordinary privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 invo_name = r1bindex (argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 if (strlen(invo_name) > NAMESZ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 fprintf(stderr, "%s: argv[0] too long\n", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 exit(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 mts_init (invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 #ifdef MH_PLUS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 if (rpop_default && *rpop_default)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 rpop = atoi(rpop_default);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 #endif /* MH_PLUS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 #ifdef HESIOD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 * Scheme is:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 * use MAILHOST environment variable if present,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 * else try Hesiod.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 * If that fails, use the default (if any)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 * provided by mtstailor in mts_init()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 if ((tmphost = getenv("MAILHOST")) != NULL && strlen(tmphost) < BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 pophost = tmphost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 else if ((po = hes_getmailhost(getusr())) != NULL &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 strcmp(po->po_type, "POP") == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 pophost = po->po_host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 #endif /* HESIOD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 if (pophost && *pophost)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 host = pophost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 if ((cp = getenv ("MHPOPDEBUG")) && *cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 snoop++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 if ((cp = m_find (invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 ap = copyip (ap, arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 ap = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 if (argc > MAXARGS - (ap - arguments))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 adios (NULLCP, "too many arguments.");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 (void) copyip (argv + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 for (argp = arguments; *argp; argp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 if (strlen(*argp) >= BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 adios (NULLCP, "argument too long");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 adios (NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 (void) sprintf (buf, "%s [+folder] [switches]", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 help (buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 case AUDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 audfile = getcpy (m_maildir (cp));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 case NAUDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 audfile = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 case CHGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 chgflag++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 case NCHGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 chgflag = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 case TRNCSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 trnflag = 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 case MSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 from = path (cp, TFILE);/* fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 if (trnflag == 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 case NTRNCSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 trnflag = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 case SILSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 noisy = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 case NSILSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 noisy++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 case FORMSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 if (!(form = *argp++) || *form == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 format = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 case FMTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 if (!(format = *argp++) || *format == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 form = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 case WIDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 width = atoi (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 case DECRSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 decflag++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 case NDECRSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 decflag = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 case UUCPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 uucp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 case NUUCPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 uucp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 case HOSTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 if (!(host = *argp++) || *host == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 case USERSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 if (!(user = *argp++) || *user == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 case PACKSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 #ifndef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 #else /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 if (!(file = *argp++) || *file == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 case NPACKSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 file = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 case APOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 rpop = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 case RPOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 rpop = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 case NAPOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 case NRPOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 rpop = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 if (*cp == '+' || *cp == '@') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 if (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 adios (NULLCP, "only one folder at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 adios (NULLCP, "usage: %s [+folder] [switches]", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 if (host && !*host)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 host = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 if (from || !host || rpop <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 #ifndef SETREUID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 (void) setuid (real_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 setreuid(-1, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 setreuid(real_uid, real_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 #endif /* SETREUID */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 setgid(getgid()); /* Turn off extraordinary privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 if (from) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 newmail = from;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 host = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 adios (NULLCP, "no mail to incorporate");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 else if (host) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 int status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 if (user == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 user = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 if (rpop > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 pass = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 ruserpass (host, &user, &pass);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 /* Regain root privileges to open a privileged port for RPOP. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 #ifdef hpux
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 if (rpop > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 setresuid(-1, 0, -1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 #ifdef SETEUID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 if (rpop > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 seteuid(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 #ifdef SETREUID
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 if (rpop > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 setreuid(-1, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 setreuid(real_uid, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 #endif /* SETREUID */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 #endif /* SETEUID */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 #endif /* hpux */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 status = pop_init (host, user, pass, snoop, rpop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 if (rpop > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 (void) setuid (real_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 if (status == NOTOK || pop_stat (&nmsgs, &nbytes) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 adios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 if (nmsgs == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 (void) pop_quit ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 adios (NULLCP, "no mail to incorporate");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 if (((newmail = getenv ("MAILDROP")) && *newmail)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 || ((newmail = m_find ("maildrop")) && *newmail)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 if (strlen(newmail) >= BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 adios (NULLCP, "Maildrop name too long");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 newmail = m_mailpath (newmail);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 if (uucp && umincproc && *umincproc)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 get_uucp_mail ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 newmail = concat (MAILDIR, "/", MAILFIL, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 adios (NULLCP, "no mail to incorporate");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 if (host && file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 goto go_to_it;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 if (!m_find ("path"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 free (path ("./", TFOLDER));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 if (!folder && !(folder = m_find (inbox)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 folder = defalt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 if (strlen(folder) >= BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 adios (NULLCP, "Inbox name too long");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 maildir = m_maildir (folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 if (stat (maildir, &st) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 if (errno != ENOENT)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 adios (maildir, "error on folder");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 cp = concat ("Create folder \"", maildir, "\"? ", NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 if (noisy && !getanswer (cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 if (!makedir (maildir))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 adios (NULLCP, "unable to create folder %s", maildir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 if (chdir (maildir) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 adios (maildir, "unable to change directory to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 if (!(mp = m_gmsg (folder)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 adios (NULLCP, "unable to read folder %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 go_to_it: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 if (host == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 if (access (newmail, 02) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 trnflag = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 if ((in = fopen (newmail, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 adios (newmail, "unable to read");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 locked++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 if (trnflag) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 (void) signal (SIGHUP, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 (void) signal (SIGINT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 (void) signal (SIGQUIT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 (void) signal (SIGTERM, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 setgid(return_gid); /* Reset gid to lock mail file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 in = lkfopen (newmail, "r");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 setgid(getgid()); /* Return us to normal privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 if (in == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 adios (NULLCP, "unable to lock and fopen %s", newmail);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 (void) fstat (fileno(in), &s1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 setgid(getgid()); /* Return us to normal privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 if (audfile) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 if ((i = stat (audfile, &st)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 advise (NULLCP, "Creating Receive-Audit: %s", audfile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 if ((aud = fopen (audfile, "a")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 adios (audfile, "unable to append to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 (void) chmod (audfile, m_gmprot ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 #ifndef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 fprintf (aud, from ? "<<inc>> %s -ms %s\n" : "<<inc>> %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 dtimenow (), from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 #else /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 fprintf (aud, from ? "<<inc>> %s -ms %s\n"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 : host ? "<<inc>> %s -host %s -user %s%s\n"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 : "<<inc>> %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 dtimenow (), from ? from : host, user,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 rpop < 0 ? " -apop" : rpop > 0 ? " -rpop" : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 #ifdef MHE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 if (m_find ("mhe")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 cp = concat (maildir, "/++", NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 i = stat (cp, &st);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 if ((mhe = fopen (cp, "a")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 admonish (cp, "unable to append to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 (void) chmod (cp, m_gmprot ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 #endif /* MHE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 nfs = new_fs (form, format, FORMAT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 if (noisy) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 printf ("Incorporating new mail into %s...\n\n", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 if (host) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 if (file) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 file = path (file, TFILE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 if (stat (file, &st) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 if (errno != ENOENT)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 adios (file, "error on file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 cp = concat ("Create file \"", file, "\"? ", NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 if (noisy && !getanswer (cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 msgnum = map_count ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 if ((pd = mbx_open (file, getuid (), getgid (), m_gmprot ()))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 adios (file, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 if ((pf = fdopen (pd, "w+")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 adios (NULLCP, "unable to fdopen %s", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 hghnum = msgnum = mp -> hghmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 if ((mp = m_remsg (mp, 0, mp -> hghmsg + nmsgs)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 adios (NULLCP, "unable to allocate folder storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 for (i = 1; i <= nmsgs; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 msgnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 if (file) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 (void) fseek (pf, 0L, 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 pos = ftell (pf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 size = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 (void) fwrite (mmdlm1, 1, strlen (mmdlm1), pf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 start = ftell (pf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 if (pop_retr (i, pop_pack) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 adios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 (void) fseek (pf, 0L, 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 stop = ftell (pf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 if (fflush (pf))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 adios (file, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 (void) fseek (pf, start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 cp = getcpy (m_name (msgnum));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 if ((pf = fopen (cp, "w+")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 adios (cp, "unable to write");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 (void) chmod (cp, m_gmprot ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 start = stop = 0L;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 if (pop_retr (i, pop_action) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 adios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 if (fflush (pf))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 adios (cp, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 (void) fseek (pf, 0L, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 switch (p = scan (pf, msgnum, 0, nfs, width,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712 file ? 0 : msgnum == mp -> hghmsg + 1 && chgflag,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 1, /* check UNSEEN? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714 0, 0, stop - start, noisy)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 case SCNEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 printf ("%*d empty\n", DMAXFOLDER, msgnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 case SCNFAT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 trnflag = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 noisy++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 /* advise (cp, "unable to read"); already advised */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 /* fall thru */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 case SCNERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 case SCNNUM:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 case SCNMSG:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 case SCNENC:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 if (aud)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 ml_fputs (scanl, aud);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 fputs (scanl, aud);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 #ifdef MHE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 if (mhe)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 ml_fputs (scanl, mhe);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 fputs (scanl, mhe);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 #endif /* MHE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 if (!file) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 mp -> msgstats[msgnum] = EXISTS;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 #ifdef TMA
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 if (p == SCNENC) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 if (mp -> lowsel == 0 || msgnum < mp -> lowsel)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 mp -> lowsel = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 if (mp -> hghsel == 0 || msgnum > mp -> hghsel)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 mp -> hghsel = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 mp -> numsel++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 mp -> msgstats[msgnum] |= SELECTED;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 #endif /* TMA */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 mp -> msgstats[msgnum] |= UNSEEN;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 mp -> msgflags |= SEQMOD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 if (file) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 (void) fseek (pf, stop, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 (void) fwrite (mmdlm2, 1, strlen (mmdlm2), pf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 if (fflush (pf) || ferror (pf)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 int e = errno;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 (void) pop_quit ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 errno = e;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 adios (file, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 (void) map_write (file, pd, 0, 0L, start, stop, pos, size,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 noisy);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 if (ferror(pf) || fclose (pf)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 int e = errno;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 (void) unlink (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 (void) pop_quit ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 errno = e;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 adios (cp, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 if (trnflag && pop_dele (i) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 adios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 if (pop_quit () == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 adios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 if (file) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 (void) mbx_close (file, pd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 pd = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 m_unknown (in); /* the MAGIC invocation... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 hghnum = msgnum = mp -> hghmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 for (i = 0;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 if (msgnum >= mp -> hghoff)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 if ((mp = m_remsg (mp, 0, mp -> hghoff + MAXFOLDER)) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 advise (NULLCP, "unable to allocate folder storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 i = NOTOK;
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
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 switch (i = scan (in, msgnum + 1, msgnum + 1, nfs, width,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 msgnum == hghnum && chgflag,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 1, /* check UNSEEN? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 0, 0, 0L, noisy)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 case SCNFAT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 case SCNEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 case SCNERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 if (aud)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 fputs ("inc aborted!\n", aud);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 advise (NULLCP, "aborted!"); /* doesn't clean up locks! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 case SCNNUM:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 advise (NULLCP,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 "more than %d messages in folder %s, %s not zero'd",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 MAXFOLDER, folder, newmail);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 advise (NULLCP, "scan() botch (%d)", i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 case SCNMSG:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 case SCNENC:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 if (aud)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 ml_fputs (scanl, aud);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 fputs (scanl, aud);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 #ifdef MHE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 if (mhe)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 ml_fputs (scanl, mhe);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 fputs (scanl, mhe);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852 #endif /* MHE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856 msgnum++, mp -> hghmsg++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857 mp -> msgstats[msgnum] = EXISTS;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 #ifdef TMA
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859 if (i == SCNENC) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860 if (mp -> lowsel == 0 || mp -> lowsel > msgnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861 mp -> lowsel = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 if (mp -> hghsel == 0 || mp -> hghsel < msgnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 mp -> hghsel = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 mp -> numsel++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865 mp -> msgstats[msgnum] |= SELECTED;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867 #endif /* TMA */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868 mp -> msgstats[msgnum] |= UNSEEN;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869 mp -> msgflags |= SEQMOD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 #ifndef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 if (i < 0) { /* error } */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
879 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
880 if (p < 0) { /* error */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
881 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
882 if (locked)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
883 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
884 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
885 setgid(return_gid); /* Be sure we can unlock mail file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
886 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
887
bce86c4163a3 Initial revision
kono
parents:
diff changeset
888 if (! lkfclose (in, newmail))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
889 locked = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
890 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
891 setgid(getgid()); /* And then return us to normal privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
892 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
893 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
894 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
895 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
896 adios (NULLCP, "failed");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
897 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
898
bce86c4163a3 Initial revision
kono
parents:
diff changeset
899 if (aud)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
900 (void) fclose (aud);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
901 #ifdef MHE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
902 if (mhe)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
903 (void) fclose (mhe);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
904 #endif /* MHE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
905 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
906 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
907 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
908 if (host && file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
909 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
910 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
911
bce86c4163a3 Initial revision
kono
parents:
diff changeset
912 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
913
bce86c4163a3 Initial revision
kono
parents:
diff changeset
914 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
915 if (host == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
916 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
917 if (trnflag) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
918 if (stat (newmail, &st) != NOTOK && s1.st_mtime != st.st_mtime)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
919 advise (NULLCP, "new messages have arrived!\007");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
920 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
921 if ((i = creat (newmail, 0600)) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
922 (void) close (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
923 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
924 admonish (newmail, "error zero'ing");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
925 (void) unlink (map_name (newmail));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
926 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
927 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
928 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
929 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
930 printf ("%s not zero'd\n", newmail);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
931
bce86c4163a3 Initial revision
kono
parents:
diff changeset
932 if (msgnum == hghnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
933 admonish (NULLCP, "no messages incorporated");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
934 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
935 m_replace (pfolder, folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
936 if (chgflag)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
937 mp -> curmsg = hghnum + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
938 mp -> hghmsg = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
939 if (mp -> lowmsg == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
940 mp -> lowmsg = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
941 if (chgflag) /* sigh... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
942 m_setcur (mp, mp -> curmsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
943 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
944
bce86c4163a3 Initial revision
kono
parents:
diff changeset
945 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
946 if (host == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
947 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
948 if (locked)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
949 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
950 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
951 setgid(return_gid); /* Be sure we can unlock mail file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
952 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
953
bce86c4163a3 Initial revision
kono
parents:
diff changeset
954 if (! lkfclose (in, newmail))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
955 locked = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
956 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
957 setgid(getgid()); /* And then return us to normal privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
958 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
959 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
960 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
961 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
962
bce86c4163a3 Initial revision
kono
parents:
diff changeset
963 m_setvis (mp, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
964 m_sync (mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
965 m_update ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
966
bce86c4163a3 Initial revision
kono
parents:
diff changeset
967 #ifdef TMA
bce86c4163a3 Initial revision
kono
parents:
diff changeset
968 if (decflag && mp -> numsel > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
969 if (noisy) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
970 printf ("\nIncorporating encrypted mail into %s...\n\n", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
971 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
972 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
973
bce86c4163a3 Initial revision
kono
parents:
diff changeset
974 tmastart (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
975 for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
976 if (mp -> msgstats[msgnum] & SELECTED && decipher (msgnum) == OK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
977 if ((in = fopen (cp = m_name (msgnum), "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
978 admonish (cp, "unable to open message");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
979 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
980 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
981 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
982 switch (scan (in, msgnum, 0, nfs, width,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
983 msgnum == mp -> curmsg,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
984 1, /* check UNSEEN? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
985 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
986 fstat (fileno (in), &st) != NOTOK ? (long) st.st_size
bce86c4163a3 Initial revision
kono
parents:
diff changeset
987 : 0L,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
988 noisy)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
989 case SCNEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
990 printf ("%*d empty\n", DMAXFOLDER, msgnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
991 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
992
bce86c4163a3 Initial revision
kono
parents:
diff changeset
993 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
994 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
995 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
996 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
997 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
998 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
999 tmastop ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1000
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1001 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1002 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1003 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1004 #endif /* TMA */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1005
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1006 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1007 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1008
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1009 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1010
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1011 void done (status)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1012 int status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1013 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1014 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1015 if (file && pd != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1016 (void) mbx_close (file, pd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1017 #endif /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1018
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1019 if (locked)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1020 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1021 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1022 setgid(return_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1023 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1024
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1025 if (! lkfclose (in, newmail))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1026 locked = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1027 #ifdef MAILGROUP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1028 setgid(getgid());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1029 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1030 #endif /* MAILGROUP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1031 exit (status);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1032 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1033 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1034
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1035 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1036 get_uucp_mail () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1037 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1038 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1039 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1040
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1041 (void) sprintf (buffer, "%s/%s", UUCPDIR, UUCPFIL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1042 if (stat (buffer, &st) == NOTOK || st.st_size == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1043 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1044
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1045 switch (child_id = vfork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1046 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1047 admonish ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1048 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1049
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1050 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1051 execlp (umincproc, r1bindex (umincproc, '/'), NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1052 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1053 perror (umincproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1054 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1055
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1056 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1057 (void) pidXwait (child_id, umincproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1058 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1059 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1060 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1061 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1062
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1063 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1064
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1065 #ifdef POP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1066 static int pop_action (s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1067 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1068 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1069 fprintf (pf, "%s\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1070 stop += strlen (s) + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1071 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1072
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1073
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1074 static int pop_pack (s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1075 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1076 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1077 register int j;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1078 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1079
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1080 (void) sprintf (buffer, "%s\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1081 for (j = 0; (j = stringdex (mmdlm1, buffer)) >= 0; buffer[j]++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1082 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1083 for (j = 0; (j = stringdex (mmdlm2, buffer)) >= 0; buffer[j]++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1084 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1085 fputs (buffer, pf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1086 size += strlen (buffer) + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1087 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1088
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1089 static int map_count () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1090 int md;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1091 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1092 struct drop d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1093 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1094
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1095 if (stat (file, &st) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1096 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1097 if ((md = open (cp = map_name (file), 0)) == NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1098 || map_chk (cp, md, &d, (long) st.st_size, 1)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1099 if (md != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1100 (void) close (md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1101 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1102 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1103 (void) close (md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1104 return (d.d_id);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1105 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1106 #endif /* POP */