annotate uip/popi.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children a6481689f99c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* popi.c - POP initiator - for MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char ident[] = "@(#)$Id$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include "../h/formatsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../h/scansbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #ifdef SMTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include "../h/local.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #else /* SMTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #endif /* SMTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #include "../zotnet/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #include <stdlib.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #ifndef RPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #define RPOPminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #define RPOPminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #ifndef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #define APOPminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #define APOPminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #if !defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #define BPOPminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #define BPOPminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #ifndef SMTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #define BULKminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #define BULKminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 #define APOPSW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 "apop", APOPminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 #define NAPOPSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 "noapop", APOPminc (-6),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 #define AUTOSW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 "auto", BPOPminc(-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #define NAUTOSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 "noauto", BPOPminc(-6),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #define BULKSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 "bulk directory", BULKminc(-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 #define FORMSW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 "form formatfile", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 #define FMTSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 "format string", 5,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #define HOSTSW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 "host host", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 #define PROGSW 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 "mshproc program", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 #define RPOPSW 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 "rpop", RPOPminc (-4),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 #define NRPOPSW 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 "norpop", RPOPminc (-6),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 #define USERSW 11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 "user user", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 #define WIDSW 12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 "width columns", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 #define HELPSW 13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 static char *bulksw = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 static int snoop = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 static int width = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 static char mailname[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 static char *nfs = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 static struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 extern int errno;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 extern char response[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 static popi(), retr_action();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 #if defined(BPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 static msh();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 #ifdef SMTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 static do_bulk();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 char *argv[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 int autosw = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 noisy = 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 rpop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 *maildir,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 *folder = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 *form = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 *format = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 *host = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 *user = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 *pass = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 buf[100],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 **ap,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 **argp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 *arguments[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 invo_name = r1bindex (argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 mts_init (invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 if (pophost && *pophost)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 host = pophost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 if ((cp = getenv ("MHPOPDEBUG")) && *cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 snoop++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 if ((cp = m_find (invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 ap = copyip (ap, arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 ap = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 (void) copyip (argv + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 rpop = getuid () && !geteuid ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 adios (NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 (void) sprintf (buf, "%s [+folder] [switches]", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 help (buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 case AUTOSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 autosw = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 case NAUTOSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 autosw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 case BULKSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 if (!(bulksw = *argp++) || *bulksw == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 case FORMSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 if (!(form = *argp++) || *form == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 format = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 case FMTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 if (!(format = *argp++) || *format == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 form = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 case WIDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 width = atoi (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 case HOSTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 if (!(host = *argp++) || *host == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 case USERSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 if (!(user = *argp++) || *user == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 case APOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 rpop = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 case RPOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 rpop = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 case NAPOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 case NRPOPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 rpop = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 case PROGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 if (!(mshproc = *argp++) || *mshproc == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 if (*cp == '+' || *cp == '@') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 if (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 adios (NULLCP, "only one folder at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 adios (NULLCP, "usage: %s [+folder] [switches]", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 if (!host)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 adios (NULLCP, "usage: %s -host \"host\"", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 #ifdef SMTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 if (bulksw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 do_bulk (host);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 if (user == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 user = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 if (rpop > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 pass = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 (void) setuid (getuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 ruserpass (host, &user, &pass);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 (void) sprintf (mailname, "PO box for %s@%s", user, host);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 if (pop_init (host, user, pass, snoop, rpop) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 adios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 if (rpop > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 (void) setuid (getuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 nfs = new_fs (form, format, FORMAT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 if (!m_find ("path"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 free (path ("./", TFOLDER));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 if (!folder && !(folder = m_find (inbox)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 folder = defalt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 maildir = m_maildir (folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 if (stat (maildir, &st) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 if (errno != ENOENT)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 adios (maildir, "error on folder");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 cp = concat ("Create folder \"", maildir, "\"? ", NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 if (noisy && !getanswer (cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 if (!makedir (maildir))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 adios (NULLCP, "unable to create folder %s", maildir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 if (chdir (maildir) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 adios (maildir, "unable to change directory to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 if (!(mp = m_gmsg (folder)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 adios (NULLCP, "unable to read folder %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 #if defined(BPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 if (autosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 msh ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 popi ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 (void) pop_quit ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 m_replace (pfolder, folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 m_setvis (mp, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 m_sync (mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 m_update ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 static struct swit popicmds[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 #define DELECMD 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 "dele", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 #define LASTCMD 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 "last", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 #define LISTCMD 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 "list", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 #define NOOPCMD 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 "noop", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 #define QUITCMD 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 "quit", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 #define RETRCMD 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 "retr", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 #define RSETCMD 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 "rset", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 #define SCANCMD 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 "scan", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 #define STATCMD 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 "stat", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 #define TOPCMD 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 "top", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 #if defined(BPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 #define MSHCMD 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 "msh", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 };
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 static popi ()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 int eof;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 eof = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 if (eof)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 printf ("(%s) ", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 for (cp = buffer; (i = getchar ()) != '\n'; ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 if (i == EOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 (void) putchar ('\n');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 if (cp == buffer)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 eof = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 if (cp < buffer + sizeof buffer - 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 *cp++ = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 if (buffer[0] == '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 if (buffer[0] == '?') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 printf ("commands:\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 printsw (ALL, popicmds, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 printf ("type CTRL-D or use \"quit\" to leave %s\n", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 if (cp = index (buffer, ' '))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 switch (i = smatch (buffer, popicmds)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 ambigsw (buffer, popicmds);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 printf ("%s unknown -- type \"?\" for help\n", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 case QUITCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 case STATCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 case DELECMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 case NOOPCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 case LASTCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 case RSETCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 case TOPCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 if (cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 *cp = ' ';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 (void) pop_command ("%s%s", popicmds[i].sw, cp ? cp : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 printf ("%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 case LISTCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 if (cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 *cp = ' ';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 if (pop_command ("%s%s", popicmds[i].sw, cp ? cp : "")
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 == OK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 printf ("%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 if (!cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 switch (pop_multiline ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 case DONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 (void) strcpy (response, ".");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 /* and fall... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 printf ("%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 printf ("%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 case RETRCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 if (!cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 advise (NULLCP, "missing argument to %s", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 retr_action (NULLCP, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 (void) pop_retr (atoi (++cp), retr_action);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 retr_action (NULLCP, DONE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 printf ("%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 case SCANCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 char *dp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 *ep,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 if (width == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 width = sc_width ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 for (dp = nfs, i = 0; *dp; dp++, i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 if (*dp == '\\' || *dp == '"' || *dp == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 i++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 i++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 if ((ep = malloc ((unsigned) i)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 adios (NULLCP, "out of memory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 for (dp = nfs, fp = ep; *dp; dp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 if (*dp == '\n') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 *fp++ = '\\', *fp++ = 'n';
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 (*dp == '"' || *dp == '\\')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 *fp++ = '\\';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 *fp++ = *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 *fp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 (void) pop_command ("xtnd scan %d \"%s\"", width, ep);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 printf ("%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 free (ep);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 #if defined(BPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 case MSHCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 msh ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 static int retr_action (rsp, flag)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 char *rsp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 int flag;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 static FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 if (rsp == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 static int msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 static char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 if (flag == OK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 if ((mp = m_remsg (mp, 0, msgnum = mp -> hghmsg + 1)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 adios (NULLCP, "unable to allocate folder storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 cp = getcpy (m_name (mp -> hghmsg + 1));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 if ((fp = fopen (cp, "w+")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 adios (cp, "unable to write");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 (void) chmod (cp, m_gmprot ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 (void) fflush (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 if (fstat (fileno (fp), &st) != NOTOK && st.st_size > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 mp -> msgstats[msgnum] = EXISTS | UNSEEN;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 mp -> msgflags |= SEQMOD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 if (ferror (fp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 advise (cp, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 mp -> hghmsg = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 (void) unlink (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 (void) fclose (fp), fp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 free (cp), cp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 fprintf (fp, "%s\n", rsp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 #if defined(BPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 static msh ()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 int child_id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 vecp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 char buf1[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 buf2[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 *vec[9];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 if (pop_fd (buf1, buf2) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 adios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 vecp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 vec[vecp++] = r1bindex (mshproc, '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 switch (child_id = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 adios ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 vec[vecp++] = "-popread";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 vec[vecp++] = buf1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 vec[vecp++] = "-popwrite";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 vec[vecp++] = buf2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 vec[vecp++] = "-idname";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 vec[vecp++] = mailname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 vec[vecp++] = mailname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 vec[vecp] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 (void) execvp (mshproc, vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 perror (mshproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 (void) pidXwait (child_id, mshproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 #ifdef SMTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 #include "../zotnet/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 #include "../mts/sendmail/smail.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 static int dselect (d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 register struct dirent *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 register struct direct *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 if ((i = strlen (d -> d_name)) < sizeof "smtp"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 || strncmp (d -> d_name, "smtp", sizeof "smtp" - 1))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 return ((i -= (sizeof ".bulk" - 1)) > 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 && !strcmp (d -> d_name + i, ".bulk"));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 static int dcompar (d1, d2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 struct dirent **d1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 **d2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 struct direct **d1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 **d2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 struct stat s1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 s2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 if (stat ((*d1) -> d_name, &s1) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 if (stat ((*d2) -> d_name, &s2) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 return -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 return ((int) (s1.st_mtime - s2.st_mtime));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 static do_bulk (host)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 char *host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 int n,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 retval,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 sm;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 struct dirent **namelist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 struct direct **namelist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 if (chdir (bulksw) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 adios (bulksw, "unable to change directory to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 if ((n = scandir (".", &namelist, dselect, dcompar)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 adios (bulksw, "unable to scan directory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 sm = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 for (i = 0; i < n; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 register struct dirent *d = namelist[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 register struct direct *d = namelist[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 if (sm == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 if (rp_isbad (retval = sm_init (NULLCP, host, 1, 1, snoop)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 adios (NULLCP, "problem initializing server: %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 sm = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 switch (retval = sm_bulk (d -> d_name)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 if (rp_isbad (retval))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 adios (NULLCP, "problem delivering msg %s: %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 d -> d_name, rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 /* else fall... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 case RP_OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 case RP_NO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 case RP_NDEL:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 advise (NULLCP, "msg %s: %s", d -> d_name, rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 if (sm == OK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 register int j;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 int l,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 m;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 struct dirent **newlist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 struct direct **newlist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 while ((l = scandir (".", &newlist, dselect, dcompar)) > OK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 m = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 for (j = 0; j < l; j++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 register struct dirent *d = newlist[j];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 register struct direct *d = newlist[j];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 for (i = 0; i < n; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 if (strcmp (d -> d_name, namelist[i] -> d_name) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 if (i >= n) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 switch (retval = sm_bulk (d -> d_name)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 if (rp_isbad (retval))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 adios (NULLCP, "problem delivering msg %s: %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 d -> d_name, rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 /* else fall... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 case RP_OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 case RP_NO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 case RP_NDEL:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690 advise (NULLCP, "msg %s: %s", d -> d_name,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 m = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 for (i = 0; i < n; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 free ((char *) namelist[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 free ((char *) namelist);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 namelist = newlist, n = l;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 if (!m)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 newlist = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 if (sm == OK && rp_isbad (retval = sm_end (OK)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 adios (NULLCP, "problem finalizing server: %s", rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 for (i = 0; i < n; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714 free ((char *) namelist[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 free ((char *) namelist);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 free ((char *) namelist);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 #if defined(SYS5DIR) && !defined(BSD42) && !defined(hpux) && !defined(sgi) && !defined(linux)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724 * Copyright (c) 1983 Regents of the University of California.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 * All rights reserved.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 * Redistribution and use in source and binary forms, with or without
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 * modification, are permitted provided that the following conditions
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 * are met:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 * 1. Redistributions of source code must retain the above copyright
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 * notice, this list of conditions and the following disclaimer.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 * 2. Redistributions in binary form must reproduce the above copyright
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 * notice, this list of conditions and the following disclaimer in the
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 * documentation and/or other materials provided with the distribution.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 * 3. All advertising materials mentioning features or use of this software
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 * must display the following acknowledgement:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 * This product includes software developed by the University of
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 * California, Berkeley and its contributors.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 * 4. Neither the name of the University nor the names of its contributors
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 * may be used to endorse or promote products derived from this software
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 * without specific prior written permission.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 * SUCH DAMAGE.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 #if defined(LIBC_SCCS) && !defined(lint)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 static char sccsid[] = "@(#)scandir.c 5.10 (Berkeley) 2/23/91";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 #endif /* LIBC_SCCS and not lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 * Scan the directory dirname calling select to make a list of selected
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 * directory entries then sort using qsort and compare routine dcomp.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 * Returns the number of entries and a pointer to a list of pointers to
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 * struct dirent (through namelist). Returns -1 if there were any errors.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 * This code modified by Ted Nolan to take Solaris dirent structures
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 * and mollify gcc -traditional. In general, everything from BSD that
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 * didn't work is "ifdef notdef" ed out
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 * 3 Feb 94
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 #include <dirent.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 /* #include <stdlib.h> */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 #include <string.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777 * The DIRSIZ macro gives the minimum record length which will hold
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 * the directory entry. This requires the amount of space in struct dirent
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 * without the d_name field, plus enough space for the name with a terminating
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 #undef DIRSIZ
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 #define DIRSIZ(dp) \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 ((sizeof (struct dirent) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 #define DIRSIZ(dp) \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 ((sizeof (struct dirent) - (MAXNAMLEN+1)) + ((strlen(dp->d_name)+1 + 3) &~ 3))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 scandir(dirname, namelist, select, dcomp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 const char *dirname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 char *dirname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 struct dirent ***namelist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 int (*select) __P((struct dirent *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 int (*dcomp) __P((const void *, const void *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 int (*select)();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 int (*dcomp)();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 register struct dirent *d, *p, **names;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 register size_t nitems;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 struct stat stb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 long arraysz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 DIR *dirp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811 if ((dirp = opendir(dirname)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 return(-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 if (stat(dirname, &stb) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 return(-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 * estimate the array size by taking the size of the directory file
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 * and dividing it by a multiple of the minimum size entry.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 arraysz = (stb.st_size / 24);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 if (names == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 return(-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 nitems = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 while ((d = readdir(dirp)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 if (select != NULL && !(*select)(d))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 continue; /* just selected names */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 * Make a minimum size copy of the data
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 p = (struct dirent *)malloc(DIRSIZ(d));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 if (p == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 return(-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 p->d_ino = d->d_ino;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 p->d_reclen = d->d_reclen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 p->d_namlen = d->d_namlen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 bcopy(d->d_name, p->d_name, p->d_namlen + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 bcopy(d->d_name, p->d_name, strlen(p->d_name) + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 * Check to make sure the array has space left and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 * realloc the maximum size.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 if (++nitems >= arraysz) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 if (stat(dirname, &stb) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 return(-1); /* just might have grown */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 arraysz = stb.st_size / 12;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 names = (struct dirent **)realloc((char *)names,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 arraysz * sizeof(struct dirent *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 if (names == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852 return(-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 names[nitems-1] = p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856 closedir(dirp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857 if (nitems && dcomp != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 qsort(names, nitems, sizeof(struct dirent *), dcomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859 *namelist = names;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860 return(nitems);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 * Alphabetic order comparison routine for those who want it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865 int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866 alphasort(d1, d2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868 const void *d1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869 const void *d2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871 char *d1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 char *d2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 return(strcmp((*(struct dirent **)d1)->d_name,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 (*(struct dirent **)d2)->d_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 #endif