annotate support/pop/popser.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 /* popser.c - the POP service */
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: popser.c,v 1.2 2006/12/05 18:18:12 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif
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/dropsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include "../h/formatsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include "../h/scansbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include "../zotnet/bboards.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #include "../zotnet/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #include <pwd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #include "syslog.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #ifdef UNISTD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #ifdef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #include <krb.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 #endif /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #include <fcntl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #ifdef SHADOW
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #undef SHADOW
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #include <shadow.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #ifndef SHADOW
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #define SHADOW
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #endif /* SHADOW */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #if defined(UNISTD) || defined(SVR4)
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 #if defined(LOCKF) && !defined(F_ULOCK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 #include <sys/fcntl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #endif /* LOCKF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 #define TRUE 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 #define FALSE 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 #define NVEC 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #ifndef POPSERVICE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 #define POPSERVICE "pop"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 extern int debug;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 extern char myhost[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 extern char *myname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 #ifndef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 static enum state {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 auth1, auth2, trans, update, halt, error
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 } mystate;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 static enum state {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 auth1, auth2, trans, mbox, item, ack, update, halt, error
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 } mystate;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 static int user (), pass ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 static isguest(), getbbmax();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 #ifndef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 static int xtnd1(), xtnd2();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 static int xtnd1(), xtnd2(), xtnd3 ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 #else /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 static int xtnd3 ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 #ifdef RPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 static int rpop ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 #endif /* RPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 #ifdef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 static int apop ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 static int status (), list (), retrieve (), delete (), reset ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 static int top (), last ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 #if defined(BPOP) || defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 static int xtnd ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 #endif /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 static int quit ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 static int helo (), rdp2 (), acks (), ack2 (), fold (), nack ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 #endif /* POP2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 static struct vector {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 char *v_cmd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 int v_min, v_max;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 int (*v_vec) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 enum state v_valid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 enum state v_win, v_lose;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 } vectors[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 "user", 1, 1, user, auth1, auth2, auth1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 "pass", 1, 1, pass, auth2, trans, auth1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 #ifdef RPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 "rpop", 1, 1, rpop, auth2, trans, auth1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 #endif /* RPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 #ifdef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 "apop", 2, 2, apop, auth1, trans, auth1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 "quit", 0, 0, NULL, auth1, halt, halt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 "quit", 0, 0, NULL, auth2, halt, halt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 "stat", 0, 0, status, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 "list", 0, 1, list, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 "retr", 1, 1, retrieve, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 "dele", 1, 1, delete, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 "noop", 0, 0, NULL, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 "rset", 0, 0, reset, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 "top", 2, 2, top, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 "last", 0, 0, last, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 "xtnd", 1, 3, xtnd, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 #else /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 "xtnd", 1, 2, xtnd, trans, trans, trans,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 "quit", 0, 0, quit, trans, halt, halt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 "helo", 2, 2, helo, auth1, mbox, auth1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 "fold", 1, 1, fold, mbox, mbox, mbox,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 "quit", 0, 0, quit, mbox, halt, halt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 "read", 0, 1, rdp2, mbox, item, error,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 "fold", 1, 1, fold, item, mbox, mbox,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 "read", 0, 1, rdp2, item, item, error,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 "quit", 0, 0, quit, item, halt, halt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 "retr", 0, 0, retrieve, item, ack, error,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 "acks", 0, 0, ack2, ack, item, error,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 "ackd", 0, 0, ack2, ack, item, error,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 "nack", 0, 0, rdp2, ack, item, error,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 "quit", 0, 0, NULL, ack, halt, halt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 #endif /* POP2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 static struct vector *getvector ();
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 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 static int pop2 = NOTOK; /* current pop2 msg, or NOTOK if pop3 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 #endif /* POP2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 #ifdef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 static int pop_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 static int pop_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 static int rproto;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 static char *hostname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 static char server[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 static char timestamp[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 static char username[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 static char maildrop[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 static int mode;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 static time_t mtime;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 static FILE *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 static long lastseen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 static int rmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 #if defined(BPOP) || defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 static int xtnded;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 #endif /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 static int guest_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 static int guest_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 static struct bboard *BBhead = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 static struct bboard *BBtail = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 static time_t BBtime = 0L;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 static struct bboard *getbbaux ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 struct Msg { /* Msgs[0] contains info for entire maildrop */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 struct drop m_drop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 #define m_id m_drop.d_id
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 #define m_size m_drop.d_size
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 #define m_last m_drop.d_start /* Msgs[i = 0] */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 #define m_start m_drop.d_start /* Msgs[i > 0] */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 #define m_stop m_drop.d_stop
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 unsigned m_flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 #define MNULL 0x00
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 #define MDELE 0x01
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 #define MREAD 0x02
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 static int nMsgs = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 static struct Msg *Msgs = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 static int nmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 static int dmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 static int _sc_width = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 static char *nfs = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 #define TRM "."
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 #define TRMLEN (sizeof TRM - 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 #define IAC 255
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 static TYPESIG pipeser ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 FILE *input;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 FILE *output;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 #ifndef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 struct passwd *getpwnam();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 void padvise (), padios ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 char *crypt ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 #ifdef POPUUMBOX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 #define MBX_READ pmbx_read
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 static int pmbx_read ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 static char *p_copy(), *p_copyin(), *p_nextword();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 static p_cmatch(), p_isdate(), p_ishead(), p_parse(), any();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 #define MBX_READ mbx_read
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 extern int mbx_read ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 static int setup(), setupaux(), read_map(), read_file(), pmbx_size();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 static int quitaux(), quitfile(), respond(), getline();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 static m_gMsgs(), multiline(), multiend(), putline();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 popinit () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 padvise (NULLCP, LOG_INFO, "initialize list of BBoards");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 BBhead = BBtail = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 while (getbbaux (NULLCP))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 popassert () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 register char **p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 register struct bboard *bb,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 if (BBtime == getbbtime ())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 padvise (NULLCP, LOG_INFO, "list of BBoards has changed");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 for (bb = BBhead; bb; bb = bp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 bp = bb -> bb_next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 if (bb -> bb_name)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 free (bb -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 if (bb -> bb_file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 free (bb -> bb_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 if (bb -> bb_archive)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 free (bb -> bb_archive);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 if (bb -> bb_info)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 free (bb -> bb_info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 if (bb -> bb_map)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 free (bb -> bb_map);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 if (bb -> bb_passwd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 free (bb -> bb_passwd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 if (bb -> bb_date)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 free (bb -> bb_date);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 if (bb -> bb_addr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 free (bb -> bb_addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 if (bb -> bb_request)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 free (bb -> bb_request);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 if (bb -> bb_relay)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 free (bb -> bb_relay);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 for (p = bb -> bb_aka; *p; p++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 free (*p);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 free ((char *) bb -> bb_aka);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 for (p = bb -> bb_leader; *p; p++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 free (*p);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 free ((char *) bb -> bb_leader);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 for (p = bb -> bb_dist; *p; p++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 free (*p);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 free ((char *) bb -> bb_dist);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 free ((char *) bb);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 BBhead = BBtail = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 while (getbbaux (NULLCP))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 #ifdef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 static char *kusername;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 kpop (in, out, principal, rhost, auth)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 int in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 char *principal, *rhost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 int auth;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 #else /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 pop (in, out, priv, rhost)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 int in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 out,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 priv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 char *rhost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 #endif /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 char buffer[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 *vec[NVEC + 1];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 #if defined (DPOP) || defined (BPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 register struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 #endif /* defined (DPOP) || defined (BPOP) */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 register struct vector *v;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 m_foil (NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 mts_init (myname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 hostname = rhost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 #ifdef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 rproto = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 (void) sprintf (server, "%s KPOP server", myhost);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 rproto = priv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 (void) sprintf (server, "%s server", priv ? "RPOP" : "POP");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 #endif /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 if ((input = fdopen (in, "r")) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 || (output = fdopen (out, "w")) == NULL) {/* you lose big */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 (void) respond (NOTOK, "%s loses on initialization", server);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 (void) signal (SIGPIPE, pipeser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 #ifdef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 if (principal == NULLCP) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 char buf[512];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 strcpy(buf, "Authentication failed: ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 strcat(buf, krb_err_txt[auth]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 (void) respond (NOTOK, buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 kusername = principal;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 #endif /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 #ifdef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 if ((pw = getpwnam (POPUID)) == NULL || !setpwinfo (pw, POPDB, 1)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 (void) respond (NOTOK, "%s loses on DB initialization -- %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 server, pw ? getbberr () : "POP user-id unknown");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 pop_uid = pw -> pw_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 pop_gid = pw -> pw_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 if ((pw = getpwnam (popbbuser)) && pw -> pw_uid) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 guest_uid = pw -> pw_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 guest_gid = pw -> pw_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 guest_uid = guest_gid = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 time_t clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 (void) time (&clock);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 (void) sprintf (timestamp, "<%d.%ld@%s>", getpid (), (long)clock, myhost);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 (void) respond (OK, "%s ready %s", server, timestamp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 for (mystate = auth1; mystate != halt && mystate != error;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 switch (getline (buffer, sizeof buffer, input)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 if ((v = getvector (buffer, vec)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 mystate = (v -> v_vec ? (v -> v_vec) (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 : respond (OK, NULLCP)) == OK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 ? v -> v_win
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 : v -> v_lose;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 case DONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 mystate = error;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 (void) respond (NOTOK, "%s signing off", server);
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 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 static int helo (vec) /* sort of "user" and "pass" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 pop2 = 0; /* now we're talkin' pop2! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 make_lower (username, vec[1]); /* helo user pass */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 return pass (++vec); /* user pass */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 static int user (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 make_lower (username, vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 #ifdef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 if (!strcmp(username, kusername))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 return respond (OK, "Kerberos authentication succeeded. Send username as password (%s)", username);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 respond (NOTOK, "Wrong username supplied (%s vs. %s)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 kusername, username);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 return (NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 return respond (OK, "password required for %s", username);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 static int pass (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 int guest = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 register struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 #ifdef SHADOW
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 register struct spwd *shpw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 #endif /* SHADOW */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 register struct bboard *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 #ifdef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 if ((pw = getpwnam (username)) != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 return setup(pw, FALSE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 return respond (NOTOK, "no local password entry");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 static struct bboard entry;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 static char entry_file[BUFSIZ] = "/usr/spool/pop";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 pw = &entry;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 pw->bb_name = username;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 strcat(entry_file, username);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 pw->bb_file = entry_file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 return setup(pw, FALSE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 #else /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 if (isguest ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 static passwd gw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 gw.pw_name = popbbuser;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 gw.pw_uid = guest_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 pw = &gw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 guest = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 goto anonymous;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 if ((pw = getpwnam (username)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 #ifndef SHADOW
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 || pw -> pw_passwd == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 || strcmp (crypt (vec[1], pw -> pw_passwd), pw -> pw_passwd)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 #else /* SHADOW */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 || (shpw = getspnam (username)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 || shpw -> sp_pwdp == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 || strcmp (crypt (vec[1], shpw -> sp_pwdp), shpw -> sp_pwdp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 #endif /* SHADOW */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 trusted (0, hostname, NULLCP, 0, pw ? pw -> pw_name : username,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 pw && pw -> pw_uid == 0, POPSERVICE, "tcp", NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 return respond (NOTOK, "login incorrect");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 if (isguest ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 static struct bboard gw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 gw.bb_name = popbbuser;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 pw = &gw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 guest = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 goto anonymous;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 if (((pw = getbbnam (username)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 && (pw = getbbaka (username)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 || pw -> bb_passwd == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 || strcmp (crypt (vec[1], pw -> bb_passwd), pw -> bb_passwd)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 trusted (0, hostname, NULLCP, 0, pw ? pw -> bb_name : username,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 0, POPSERVICE, "tcp", NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 return respond (NOTOK, "login incorrect");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 anonymous: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 if (trusted (1, hostname, NULLCP, 0, myhost,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 pw -> pw_name, pw -> pw_uid == 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 pw -> bb_name, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 POPSERVICE, "tcp", NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 return respond (NOTOK, "permission denied");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 return setup (pw, guest);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 #endif /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 static isguest () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 register FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 if (strcmp (username, popbbuser) || !guest_uid)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 if (popbblist == NULL || (fp = fopen (popbblist, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 return TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 i = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 if (hostname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 while (fgets (buffer, sizeof buffer, fp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 if (cp = index (buffer, '\n'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 if (strcmp (buffer, hostname) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 i = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 break;
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 (void) fclose (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593
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 RPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 static int rpop (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 register struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 register int hostok = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 register char *bp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 register struct bboard *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 if (!rproto || (pw = getpwnam (username)) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 trusted (0, hostname, vec[1], 0, username, 0, "rpop", "tcp",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 return respond (NOTOK, "login incorrect");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 if (chdir (pw -> pw_dir) == NOTOK && chdir ("/") == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 return respond (NOTOK, "no remote directory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 if (ruserok (hostname, pw -> pw_uid == 0, vec[1], username) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 trusted (0, hostname, vec[1], 0, pw -> pw_name,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 pw -> pw_uid == 0, "rpop", "tcp", NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 return respond (NOTOK, "permission denied");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 if (!rproto
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 || ((pw = getbbnam (username)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 && (pw = getbbaka (username)) == NULL)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 trusted (0, hostname, vec[1], 0, username, 0, "rpop", "tcp",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 return respond (NOTOK, "login incorrect");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 * hacked by Dave Cohrs Tue Feb 4 14:12:15 CST 1986
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 * to allow the hostname to be a list: user@host1,user@host2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 * NOTE: the separator must be a comma -- no spaces are allowed
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 (void) sprintf (buffer, "%s@%s", vec[1], hostname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 for (bp = pw -> bb_addr; bp; bp = cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 if ((cp = index (bp, ',')))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 hostok = uleq (bp, buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 if (cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 *cp++ = ',';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 if (hostok)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 if (!hostok) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 trusted (0, hostname, vec[1], 0, pw -> bb_name, 0, "rpop",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 "tcp", NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 return respond (NOTOK, "permission denied");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 #ifdef TRUSTED
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 if (trusted (1, hostname, vec[1], 0, username,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 pw -> pw_uid == 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 "rpop", "tcp", NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 return respond (NOTOK, "permission denied");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 #endif /* TRUSTED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 return setup (pw, FALSE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 #endif /* RPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 #ifdef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 #include "popauth.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 #include "../../uip/md5.c"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 #undef DBM /* used by ndbm.h */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 #include <ndbm.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 #include <sys/file.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 #include <fcntl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 #ifdef DBM_SUFFIX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 #undef dbm_pagfno
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690 #define dbm_pagfno dbm_dirfno
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 static int apop (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 register unsigned char *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 unsigned char *ep,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 digest[16];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 register struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 register struct bboard *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 datum key,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 value;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 DBM *db;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 MD5_CTX mdContext;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 struct authinfo auth;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 (void) strcpy (username, vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 if ((pw = getpwnam (username)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 || pw -> pw_passwd == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 return respond (NOTOK, "user invalid");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 if (((pw = getbbnam (username)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 && (pw = getbbaka (username)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 || pw -> bb_passwd == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724 return respond (NOTOK, "subscriber invalid");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 #ifdef LOCKF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 if ((db = dbm_open (APOP, O_RDWR, 0)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 if ((db = dbm_open (APOP, O_RDONLY, 0)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 return respond (NOTOK, "POP authorization DB not available (%d)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 errno);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 if (fstat (dbm_pagfno (db), &st) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 && (st.st_mode & 0777) != 0600) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 dbm_close (db);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 return respond (NOTOK, "POP authorization DB has wrong mode (0%o)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 st.st_mode & 0777);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 #if defined(LOCKF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 if (lockf (dbm_pagfno (db), F_LOCK, 0) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 if (flock (dbm_pagfno (db), LOCK_SH) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 #endif /* !LOCKF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 dbm_close (db);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 return respond (NOTOK, "unable to lock POP authorization DB (%d)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 errno);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 key.dsize = strlen (key.dptr = vec[1]) + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 value = dbm_fetch (db, key);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 if (value.dptr == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 dbm_close (db);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 return respond (NOTOK, "not authorized");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 #if 0 /* core dump on some OS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 bcopy (value.dptr, (char *) &auth, sizeof auth);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 auth.auth_secretlen
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 = copy(value.dptr, auth.auth_secret) - auth.auth_secret;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 (void) sprintf (cp = buffer, "%s%*.*s", timestamp, auth.auth_secretlen,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 auth.auth_secretlen, auth.auth_secret);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 dbm_close (db);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 MD5Init (&mdContext);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 MD5Update (&mdContext, (unsigned char *) buffer,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 (unsigned int) (strlen (timestamp) + auth.auth_secretlen));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 MD5Final (digest, &mdContext);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 cp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 for (ep = (dp = digest) + sizeof digest / sizeof digest[0];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 dp < ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 cp += 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 (void) sprintf (cp, "%02x", *dp++ & 0xff);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 if (strcmp (vec[2], buffer))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 return respond (NOTOK, "authentication failure");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 return setup (pw, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 static int setup (pw, guest)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 register struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 register struct bboard *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 int guest;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 if (guest) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 (void) setgid (guest_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 (void) initgroups (popbbuser, guest_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 (void) setuid (guest_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 (void) setgid (pw -> pw_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 (void) initgroups (pw -> pw_name, pw -> pw_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811 (void) setuid (pw -> pw_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 (void) setgid (pop_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 (void) initgroups (POPUID, pop_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 (void) setuid (pop_uid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 #ifndef DPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 (void) sprintf (maildrop, "%s/%s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 mmdfldir && *mmdfldir ? mmdfldir : pw -> pw_dir,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 mmdflfil && *mmdflfil ? mmdflfil : pw -> pw_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 #else /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 (void) strcpy (maildrop, pw -> bb_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 #endif /* DPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 if (setupaux (guest) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 if (pop2 != NOTOK) { /* in response to pop2 "helo" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 pop2 = nmsgs > 0 ? 1 : 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 return respond ('#', "%d message%s (%d octets)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 nmsgs, nmsgs != 1 ? "s" : "", Msgs[0].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 #endif /* POP2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 return respond (OK,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 nmsgs ? "maildrop has %d message%s (%d octets)" : "maildrop empty",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 nmsgs, nmsgs != 1 ? "s" : "", Msgs[0].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 static int setupaux (readonly)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 int readonly;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856 #if defined(BPOP) || defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857 xtnded = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 #endif /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859 if ((dp = readonly ? fopen (maildrop, "r") : lkfopen (maildrop, "r"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860 == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861 switch (errno) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 case ENOENT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 m_gMsgs (msgp = 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 goto no_mail;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867 nmsgs = dmsgs = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868 return respond (NOTOK, "unable to %s maildrop: \"%s\"",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869 readonly ? "read" : "lock", maildrop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 if (fstat (fileno (dp), &st) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873 mode = (int) (st.st_mode & 0777), mtime = st.st_mtime;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 msgp = read_map (maildrop, (long) st.st_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 mode = 0600, mtime = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 msgp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
879 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
880
bce86c4163a3 Initial revision
kono
parents:
diff changeset
881 if ((msgp = read_file (msgp ? Msgs[msgp].m_stop : 0L, msgp + 1)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
882 m_gMsgs (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
883
bce86c4163a3 Initial revision
kono
parents:
diff changeset
884 no_mail: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
885 lastseen = Msgs[0].m_last;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
886 if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: lastseen=%d",lastseen);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
887 dmsgs = rmsgs = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
888 nmsgs = msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
889
bce86c4163a3 Initial revision
kono
parents:
diff changeset
890 Msgs[0].m_flags = readonly ? MREAD : MNULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
891 Msgs[0].m_size = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
892 for (i = 1; i <= nmsgs; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
893 if (Msgs[i].m_size == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
894 Msgs[i].m_size = pmbx_size (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
895 Msgs[0].m_size += Msgs[i].m_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
896 Msgs[i].m_flags = MNULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
897 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
898
bce86c4163a3 Initial revision
kono
parents:
diff changeset
899 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
900 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
901
bce86c4163a3 Initial revision
kono
parents:
diff changeset
902 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
903
bce86c4163a3 Initial revision
kono
parents:
diff changeset
904 static int read_map (file, pos)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
905 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
906 long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
907 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
908 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
909 msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
910 register struct drop *pp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
911 *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
912 struct drop *rp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
913
bce86c4163a3 Initial revision
kono
parents:
diff changeset
914 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
915 padvise (NULLCP, LOG_DEBUG, "read_map (%s, %ld)", file, pos);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
916
bce86c4163a3 Initial revision
kono
parents:
diff changeset
917 if ((i = map_read (file, pos, &rp, debug)) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
918 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
919
bce86c4163a3 Initial revision
kono
parents:
diff changeset
920 m_gMsgs (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
921
bce86c4163a3 Initial revision
kono
parents:
diff changeset
922 Msgs[0].m_last = rp -> d_start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
923
bce86c4163a3 Initial revision
kono
parents:
diff changeset
924 msgp = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
925 for (pp = rp + 1; i-- > 0; msgp++, pp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
926 mp = &Msgs[msgp].m_drop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
927 mp -> d_id = pp -> d_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
928 mp -> d_size = pp -> d_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
929 mp -> d_start = pp -> d_start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
930 mp -> d_stop = pp -> d_stop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
931 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
932 free ((char *) rp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
933
bce86c4163a3 Initial revision
kono
parents:
diff changeset
934 if (Msgs[0].m_last > msgp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
935 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
936 padvise (NULLCP, LOG_DEBUG, "lastseen adjusted from %d to %d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
937 Msgs[0].m_last, msgp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
938 Msgs[0].m_last = msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
939 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
940
bce86c4163a3 Initial revision
kono
parents:
diff changeset
941 return (msgp - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
942 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
943
bce86c4163a3 Initial revision
kono
parents:
diff changeset
944 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
945
bce86c4163a3 Initial revision
kono
parents:
diff changeset
946 static int read_file (pos, msgp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
947 register long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
948 register int msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
949 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
950 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
951 register struct drop *pp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
952 *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
953 struct drop *rp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
954
bce86c4163a3 Initial revision
kono
parents:
diff changeset
955 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
956 padvise (NULLCP, LOG_DEBUG, "read_file (%ld, %d)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
957 pos, msgp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
958
bce86c4163a3 Initial revision
kono
parents:
diff changeset
959 if ((i = MBX_READ (dp, pos, &rp, debug)) <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
960 return (msgp - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
961
bce86c4163a3 Initial revision
kono
parents:
diff changeset
962 m_gMsgs ((msgp - 1) + i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
963
bce86c4163a3 Initial revision
kono
parents:
diff changeset
964 for (pp = rp; i-- > 0; msgp++, pp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
965 mp = &Msgs[msgp].m_drop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
966 mp -> d_id = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
967 mp -> d_size = pp -> d_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
968 mp -> d_start = pp -> d_start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
969 mp -> d_stop = pp -> d_stop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
970 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
971 free ((char *) rp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
972
bce86c4163a3 Initial revision
kono
parents:
diff changeset
973 return (msgp - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
974 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
975
bce86c4163a3 Initial revision
kono
parents:
diff changeset
976 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
977
bce86c4163a3 Initial revision
kono
parents:
diff changeset
978 static m_gMsgs (n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
979 int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
980 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
981 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
982 padvise (NULLCP, LOG_DEBUG, "m_gMsgs (%d) 0x%x %d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
983 n, Msgs, nMsgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
984
bce86c4163a3 Initial revision
kono
parents:
diff changeset
985 if (Msgs == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
986 nMsgs = n + MAXFOLDER / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
987 Msgs = (struct Msg *) calloc ((unsigned) (nMsgs + 2), sizeof *Msgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
988 if (Msgs == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
989 padios (NULLCP, "unable to allocate Msgs structure");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
990 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
991 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
992
bce86c4163a3 Initial revision
kono
parents:
diff changeset
993 if (nMsgs >= n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
994 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
995
bce86c4163a3 Initial revision
kono
parents:
diff changeset
996 nMsgs = n + MAXFOLDER / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
997 Msgs = (struct Msg *) realloc ((char *) Msgs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
998 (unsigned) (nMsgs + 2) * sizeof *Msgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
999 if (Msgs == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1000 padios (NULLCP, "unable to reallocate Msgs structure");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1001 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1002
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1003 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1004
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1005 static int pmbx_size (m)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1006 register int m;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1007 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1008 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1009 register long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1010
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1011 (void) fseek (dp, Msgs[m].m_start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1012 for (i = 0, pos = Msgs[m].m_stop - Msgs[m].m_start; pos > 0; i++, pos--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1013 if (fgetc (dp) == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1014 i++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1015
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1016 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1017 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1018
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1019 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1020
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1021 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1022
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1023 static int status (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1024 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1025 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1026 return respond (OK, "%d %d", nmsgs - dmsgs, Msgs[0].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1027 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1028
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1029
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1030 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1031 static int rdp2 (vec) /* always returns OK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1032 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1033 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1034 if (vec[1]) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1035 if ((pop2 = atoi (vec[1])) <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1036 pop2 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1037 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1038 else if (pop2 == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1039 return NOTOK; /* close 'em down */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1040
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1041 if (pop2 <= 0 || pop2 > nmsgs) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1042 pop2 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1043 return respond ('=', "0 no message");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1044 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1045 if (Msgs[pop2].m_flags & MDELE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1046 pop2 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1047 return respond ('=', "0 message %d is deleted", pop2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1048 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1049
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1050 return respond ('=', "%d (message %d)", Msgs[pop2].m_size, pop2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1051 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1052
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1053 static int ack2 (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1054 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1055 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1056 if (strcmp (vec[0], "ackd") == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1057 Msgs[pop2].m_flags |= MDELE; /* ignored later if MREAD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1058 Msgs[0].m_size -= Msgs[pop2].m_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1059 dmsgs++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1060 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1061
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1062 if (pop2) { /* a current msg */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1063 rmsgs++; /* mark this one as read */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1064 if (++pop2 > nmsgs)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1065 pop2 = -1; /* let rdp2 reset */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1066 else if (Msgs[pop2].m_flags & MDELE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1067 pop2 = -1; /* let rdp2 reset */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1068 if (pop2 > Msgs[0].m_last)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1069 Msgs[0].m_last = pop2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1070 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1071 return rdp2 (vec); /* vec = { "acks", 0 } */
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 fold (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1075 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1076 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1077 pop2 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1078
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1079 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1080
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1081 /* This might work, or it might be a huge security hole. For my purpose,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1082 * it doesn't need to work, so I'm not going to make sure it's OK.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1083 * 16Nov90/JLR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1084 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1085
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1086 if (quitaux (NULLVP) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1087 return respond ('#', "0 unable to close folder");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1088
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1089 (void) sprintf (maildrop, vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1090 if (setupaux (access (maildrop, 2) ? 1 : 0) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1091 return respond ('#', "0 unable to read %s", maildrop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1092
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1093 pop2 = nmsgs > 0 ? 1 : 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1094 return respond ('#', "%d message%s in %s (%d octets)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1095 nmsgs, nmsgs != 1 ? "s" : "", maildrop, Msgs[0].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1096
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1097 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1098
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1099 respond ('#', "0 unable to change folders");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1100 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1101 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1102 #endif /* POP2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1103
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1104 static int list (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1105 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1106 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1107 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1108
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1109 if (vec[1]) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1110 if ((i = atoi (vec[1])) <= 0 || i > nmsgs)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1111 return respond (NOTOK, "no such message: \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1112 if (Msgs[i].m_flags & MDELE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1113 return respond (NOTOK, "message %d is deleted", i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1114
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1115 #if !defined(BPOP) && !defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1116 return respond (OK, "%d %d", i, Msgs[i].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1117 #else /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1118 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1119 if (nfs && !xtnded) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1120 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1121
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1122 (void) fseek (dp, Msgs[i].m_start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1123
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1124 switch (scan (dp, i, 0, nfs, 0, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1125 0, NULLCP, (long) Msgs[i].m_size, 0)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1126 case SCNMSG:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1127 case SCNENC:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1128 case SCNERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1129 if (cp = index (scanl, '\n'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1130 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1131 return respond (OK, "%d %d #%s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1132 i, Msgs[i].m_size, scanl);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1133
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1134 case SCNEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1135 return respond (OK, "%d %d #%*d empty",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1136 i, Msgs[i].m_size, DMAXFOLDER, i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1137
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1138 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1139 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1140 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1141 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1142 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1143 return respond (OK, xtnded ? "%d %d %d" : "%d %d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1144 i, Msgs[i].m_size, Msgs[i].m_id);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1145 #endif /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1146 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1148 (void) respond (OK, "%d message%s (%d octets)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1149 nmsgs - dmsgs, nmsgs - dmsgs != 1 ? "s" : "",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1150 Msgs[0].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1151 for (i = 1; i <= nmsgs; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1152 if (!(Msgs[i].m_flags & MDELE)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1153 #if !defined(BPOP) && !defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1154 multiline ("%d %d", i, Msgs[i].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1155 #else /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1156 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1157 if (nfs && !xtnded) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1158 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1159
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1160 (void) fseek (dp, Msgs[i].m_start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1161
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1162 switch (scan (dp, i, 0, nfs, 0, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1163 0, NULLCP, (long) Msgs[i].m_size, 0)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1164 case SCNMSG:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1165 case SCNENC:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1166 case SCNERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1167 if (cp = index (scanl, '\n'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1168 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1169 multiline ("%d %d #%s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1170 i, Msgs[i].m_size, scanl);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1171 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1172
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1173 case SCNEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1174 multiline ("%d %d #%*d empty",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1175 i, Msgs[i].m_size, DMAXFOLDER, i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1176 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1177
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1178 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1179 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1180 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1181 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1182 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1183 multiline (xtnded ? "%d %d %d" : "%d %d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1184 i, Msgs[i].m_size, Msgs[i].m_id);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1185 #endif /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1186 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1187 multiend ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1188
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1189 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1190 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1191
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1192 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1193
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1194 static int retrieve (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1195 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1196 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1197 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1198 register long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1199 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1200 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1201
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1202 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1203 if (pop2 == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1204 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1205 else if (pop2 == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1206 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1207 if ((i = atoi (vec[1])) <= 0 || i > nmsgs)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1208 return respond (NOTOK, "no such message: \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1209 if (Msgs[i].m_flags & MDELE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1210 return respond (NOTOK, "message %d is deleted", i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1211
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1212 (void) respond (OK, "%d octets", Msgs[i].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1213 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1214 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1215 else /* if called by pop2, vec = { "retr", 0 } */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1216 i = pop2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1217 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1218
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1219 for ((void) fseek (dp, pos = Msgs[i].m_start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1220 fgets (buffer, sizeof buffer, dp) != NULL && pos < Msgs[i].m_stop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1221 pos += (long) (cp - buffer + 1)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1222 if (*(cp = buffer + strlen (buffer) - 1) == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1223 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1224 multiline ("%s", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1225 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1226 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1227 if (pop2 == NOTOK) { /* then multiend */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1228 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1229 multiend ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1231 if (i > Msgs[0].m_last) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1232 Msgs[0].m_last = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1233 rmsgs++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1234 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1235 #ifdef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1236 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1237 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1238
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1239 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1240 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1241
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1242 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1243
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1244 static int delete (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1245 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1246 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1247 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1248
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1249 if (Msgs[0].m_flags & MREAD)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1250 return respond (NOTOK, "maildrop is read-only");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1251
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1252 if ((i = atoi (vec[1])) <= 0 || i > nmsgs)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1253 return respond (NOTOK, "no such message: \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1254 if (Msgs[i].m_flags & MDELE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1255 return respond (NOTOK, "message %d is deleted", i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1256
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1257 Msgs[i].m_flags |= MDELE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1258 Msgs[0].m_size -= Msgs[i].m_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1259 dmsgs++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1260
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1261 if (i > Msgs[0].m_last)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1262 Msgs[0].m_last = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1263
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1264 return respond (OK, "message %d deleted (%d octets)", i, Msgs[i].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1265 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1266
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1267
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1268 static int reset (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1269 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1270 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1271 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1272
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1273 for (i = 1; i <= nmsgs; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1274 if (Msgs[i].m_flags & MDELE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1275 Msgs[i].m_flags &= ~MDELE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1276 Msgs[0].m_size += Msgs[i].m_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1277 dmsgs--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1278 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1279
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1280 Msgs[0].m_last = lastseen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1281
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1282 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1283 if (nfs) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1284 if (scanl)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1285 free (scanl), scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1286 free (nfs), nfs = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1287 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1288 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1289
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1290 return status (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1291 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1292
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1293 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1294
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1295 static int top (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1296 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1297 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1298 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1299 j,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1300 body,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1301 lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1302 register long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1303 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1304 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1305
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1306 if ((i = atoi (vec[1])) <= 0 || i > nmsgs)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1307 return respond (NOTOK, "no such message: \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1308 if (Msgs[i].m_flags & MDELE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1309 return respond (NOTOK, "message %d is deleted", i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1310 if ((j = atoi (vec[2])) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1311 return respond (NOTOK, "bad number: \"%s\"", vec[2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1312
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1313 (void) respond (OK, vec[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1314
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1315 body = lines = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1316 for ((void) fseek (dp, pos = Msgs[i].m_start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1317 fgets (buffer, sizeof buffer, dp) != NULL && pos < Msgs[i].m_stop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1318 pos += (long) (cp - buffer + 1)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1319 if (*(cp = buffer + strlen (buffer) - 1) == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1320 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1321 if (body) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1322 if (lines++ >= j)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1323 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1324 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1325 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1326 if (*buffer == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1327 body++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1328 multiline ("%s", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1329 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1330 multiend ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1331
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1332 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1333 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1334
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1335 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1336
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1337 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1338
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1339 static int last (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1340 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1341 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1342 return respond (OK, "%d is the last msg seen", Msgs[0].m_last);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1343 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1344
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1345 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1346
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1347 #if defined(BPOP) || defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1348 static int xtnd (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1349 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1350 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1351 make_lower (vec[1], vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1352
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1353 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1354 if (strcmp (vec[1], "bboards") == 0 || strcmp (vec[1], "archive") == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1355 return xtnd1 (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1356 if (strcmp (vec[1], "x-bboards") == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1357 return xtnd2 (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1358 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1359 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1360 if (strcmp (vec[1], "scan") == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1361 return xtnd3 (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1362 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1363
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1364 return respond (NOTOK, "unknown XTND command: \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1365 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1366 #endif /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1367
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1368
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1369 #ifdef BPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1370 static int xtnd1 (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1371 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1372 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1373 register struct bboard *bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1374
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1375 if (vec[2]) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1376 make_lower (vec[2], vec[2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1377 if ((bb = getbbaux (vec[2])) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1378 return respond (NOTOK, "unknown BBoard: \"%s\"", vec[2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1379
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1380 if (quitaux (NULLVP) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1381 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1382 (void) strcpy (maildrop,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1383 strcmp (vec[1], "bboards") ? bb -> bb_archive : bb -> bb_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1384 if (setupaux (TRUE) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1385 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1386 xtnded++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1387 (void) respond (OK, "%s", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1388 multiline ("%s %d", bb -> bb_name, bb -> bb_maxima);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1389 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1390 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1391 if (strcmp (vec[1], "bboards"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1392 return respond (NOTOK, "too few arguments to XTND \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1393
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1394 (void) respond (OK, "%s", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1395 for (bb = BBhead; bb; bb = bb -> bb_next) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1396 getbbmax (bb);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1397 if (!(bb -> bb_flags & BB_INVIS))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1398 multiline ("%s %d", bb -> bb_name, bb -> bb_maxima);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1399 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1400 while (bb = getbbaux (NULLCP))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1401 if (!(bb -> bb_flags & BB_INVIS))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1402 multiline ("%s %d", bb -> bb_name, bb -> bb_maxima);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1403 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1404 multiend ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1405
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1406 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1407 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1408
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1409 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1410
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1411 static int xtnd2 (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1412 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1413 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1414 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1415 **ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1416 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1417 register struct bboard *bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1418
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1419 if (vec[2] == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1420 return respond (NOTOK, "too few arguments to XTND \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1421
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1422 make_lower (vec[2], vec[2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1423 if ((bb = getbbaux (vec[2])) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1424 return respond (NOTOK, "unknown BBoard: \"%s\"", vec[2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1425
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1426 (void) respond (OK, "%s", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1427 multiline ("%s", bb -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1428
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1429 cp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1430 for (ap = bb -> bb_aka; *ap; ap++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1431 (void) sprintf (cp, cp != buffer ? " %s" : "%s", *ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1432 cp += strlen (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1433 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1434 multiline ("%s", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1435
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1436 multiline ("%s", bb -> bb_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1437 multiline ("%s", bb -> bb_archive);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1438 multiline ("%s", bb -> bb_info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1439 multiline ("%s", bb -> bb_map);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1440 multiline ("%s", bb -> bb_passwd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1441
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1442 cp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1443 for (ap = bb -> bb_leader; *ap; ap++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1444 (void) sprintf (cp, cp != buffer ? " %s" : "%s", *ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1445 cp += strlen (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1446 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1447 multiline ("%s", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1448
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1449 multiline ("%s", bb -> bb_addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1450 multiline ("%s", bb -> bb_request);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1451 multiline ("%s", bb -> bb_relay);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1452
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1453 cp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1454 for (ap = bb -> bb_dist; *ap; ap++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1455 (void) sprintf (cp, cp != buffer ? " %s" : "%s", *ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1456 cp += strlen (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1457 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1458 multiline ("%s", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1459
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1460 getbbmax (bb);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1461 multiline ("0%o %d", bb -> bb_flags, bb -> bb_maxima);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1462 multiline ("%s", bb -> bb_date);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1463
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1464 multiend ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1465
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1466 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1467 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1468
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1469 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1470
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1471 static struct bboard *getbbaux (s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1472 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1473 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1474 register struct bboard *bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1475 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1476
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1477 if (BBhead == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1478 if (setbbinfo (BBOARDS, BBDB, 1))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1479 BBtime = getbbtime ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1480 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1481 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1482
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1483 if (s != NULLCP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1484 for (bb = BBhead; bb; bb = bb -> bb_next)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1485 if (strcmp (bb -> bb_name, s) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1486 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1487 padvise (NULLCP, LOG_DEBUG, "getbbaux: \"%s\" from cache",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1488 bb -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1489 getbbmax (bb);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1490 return bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1491 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1492
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1493 while (bb = getbbent ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1494 if ((bb = getbbcpy (bb)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1495 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1496
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1497 if (access (bb -> bb_file, 04) == NOTOK && errno == EACCES)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1498 bb -> bb_flags |= BB_INVIS;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1499 bb -> bb_mtime = stat (bb -> bb_info, &st) != NOTOK ? st.st_mtime : 0L;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1500
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1501 if (BBtail != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1502 BBtail -> bb_next = bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1503 if (BBhead == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1504 BBhead = bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1505 BBtail = bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1506
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1507 if (s == NULL || strcmp (bb -> bb_name, s) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1508 if (s && debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1509 padvise (NULLCP, LOG_DEBUG, "getbbaux: \"%s\" from scratch",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1510 bb -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1511 return bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1512 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1513 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1514
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1515 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1516 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1517
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1518 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1519
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1520 static getbbmax (bb)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1521 register struct bboard *bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1522 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1523 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1524 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1525 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1526 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1527 register FILE * fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1528
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1529 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1530 padvise (NULLCP, LOG_DEBUG, "getbbmax: \"%s\", 0%o, %d, %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1531 bb -> bb_name, bb -> bb_flags, bb -> bb_maxima, bb -> bb_date);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1532
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1533 if (!(bb -> bb_flags & BB_INVIS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1534 && access (bb -> bb_file, 04) == NOTOK && errno == EACCES)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1535 bb -> bb_flags |= BB_INVIS;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1536
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1537 if (stat (bb -> bb_info, &st) == NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1538 || bb -> bb_mtime == st.st_mtime
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1539 || (fp = fopen (bb -> bb_info, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1540 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1541 bb -> bb_mtime = st.st_mtime;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1542
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1543 if (fgets (buffer, sizeof buffer, fp) && (i = atoi (buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1544 bb -> bb_maxima = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1545 if (!feof (fp) && fgets (buffer, sizeof buffer, fp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1546 if (bb -> bb_date)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1547 free (bb -> bb_date);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1548 if (cp = index (buffer, '\n'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1549 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1550 bb -> bb_date = getcpy (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1551 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1552
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1553 (void) fclose (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1554
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1555 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1556 padvise (NULLCP, LOG_DEBUG, "updated: \"%s\", 0%o, %d, %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1557 bb -> bb_name, bb -> bb_flags, bb -> bb_maxima, bb -> bb_date);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1558 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1559
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1560 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1561
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1562 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1563 static int xtnd3 (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1564 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1565 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1566 if (vec[2] == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1567 return respond (NOTOK, "too few arguments to XTND \"%s\"", vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1568 if ((_sc_width = atoi (vec[2])) < WIDTH / 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1569 _sc_width = WIDTH / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1570 nfs = new_fs (NULLCP, vec[3], FORMAT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1571 if (scanl)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1572 (void) free (scanl), scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1573
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1574 return respond (OK, vec[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1575 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1576
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1577 int sc_width () { return _sc_width; }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1578 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1579 #endif /* BPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1580
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1581 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1582
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1583 static int quit (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1584 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1585 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1586 int d,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1587 n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1588
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1589 d = dmsgs, n = nmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1590
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1591 if (quitaux (vec) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1592 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1593
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1594 #if defined(BPOP) || defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1595 if (xtnded)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1596 return respond (OK, "%s signing off", server);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1597 #endif /* BPOP || MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1598
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1599 if (n == d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1600 return respond (OK, "%s signing off (maildrop empty)", server);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1601
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1602 return respond (OK,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1603 n ? "%s signing off (%d message%s, %d octets left)"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1604 : "%s signing off (maildrop empty)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1605 server, n - d, n - d != 1 ? "s" : "", Msgs[0].m_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1606 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1607
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1608
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1609 static int quitaux (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1610 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1611 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1612 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1613
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1614 if (dp == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1615 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1616
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1617 i = quitfile (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1618
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1619 nmsgs = dmsgs = rmsgs = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1620 (void) lkfclose (dp, maildrop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1621 dp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1622
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1623 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1624 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1625
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1626 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1627
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1628 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1629
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1630 static int quitfile (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1631 char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1632 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1633 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1634 j,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1635 tmpDR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1636 md;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1637 char tmpfil[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1638 map1[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1639 map2[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1640 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1641
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1642 if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: dmsgs=%d rmsgs=%d readonly=%d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1643 dmsgs, rmsgs, Msgs[0].m_flags & MREAD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1644
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1645 if (dmsgs == 0 || (Msgs[0].m_flags & MREAD))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1646 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1647
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1648 if (fstat (fileno (dp), &st) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1649 return respond (NOTOK, "unable to stat file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1650 if (mtime != st.st_mtime)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1651 return respond (NOTOK, "new messages have arrived, no update");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1652 mode = (int) (st.st_mode & 0777);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1653
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1654 if (nmsgs == dmsgs) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1655 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1656 i = truncate (maildrop, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1657 #else /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1658 i = open (maildrop, O_WRONLY | O_TRUNC);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1659 if (i != NOTOK) (void) close (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1660 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1661 (void) unlink (map_name (maildrop));/* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1662 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1663 return respond (NOTOK, "unable to zero %s", maildrop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1664 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1665 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1666
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1667 (void) strcpy (tmpfil, m_backup (maildrop));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1668 if ((md = mbx_open (tmpfil, st.st_uid, st.st_gid, mode)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1669 { char msgbuf0[256];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1670 sprintf(msgbuf0,"unable to create temporary file (%s)",tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1671 return respond (NOTOK, msgbuf0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1672 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1673
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1674 j = 0, tmpDR = Msgs[0].m_last;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1675 if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: last=%d",Msgs[0].m_last);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1676 for (i = 1; i <= nmsgs; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1677 if (!(Msgs[i].m_flags & MDELE))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1678 j++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1679 if (i == tmpDR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1680 Msgs[0].m_last = j;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1681 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1682 if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: last=%d",Msgs[0].m_last);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1683
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1684 for (i = 1; i <= nmsgs; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1685 if (!(Msgs[i].m_flags & MDELE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1686 && mbx_write (tmpfil, md, dp, Msgs[i].m_id, Msgs[0].m_last,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1687 Msgs[i].m_start, Msgs[i].m_stop, TRUE, debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1688 == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1689 (void) mbx_close (tmpfil, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1690 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1691 return respond (NOTOK, "error writing temporary file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1692 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1693 (void) mbx_close (tmpfil, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1694
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1695 if ((i = rename (tmpfil, maildrop)) == OK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1696 (void) strcpy (map1, map_name (tmpfil));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1697 (void) strcpy (map2, map_name (maildrop));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1698 if (rename (map1, map2) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1699 (void) unlink (map1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1700 (void) unlink (map2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1701 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1702 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1703
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1704 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1705 return respond (NOTOK, "unable to rename maildrop");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1706
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1707 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1708 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1709
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1710 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1711
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1712 static struct vector *getvector (bp, vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1713 register char *bp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1714 **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1715 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1716 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1717 register struct vector *v;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1718
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1719 for (i = 0; i < NVEC; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1720 while (isspace (*bp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1721 *bp++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1722 if (*bp == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1723 vec[i] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1724 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1725 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1726
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1727 if (*bp == '"') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1728 for (vec[i] = ++bp; *bp != '\0' && *bp != '"'; bp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1729 if (*bp == '\\') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1730 switch (*++bp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1731 case 'n':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1732 (void) strcpy (bp, bp + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1733 *--bp = '\n';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1734 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1735
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1736 case '\\':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1737 case '"':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1738 (void) strcpy (bp - 1, bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1739 /* and fall... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1740 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1741 bp--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1742 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1743 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1744 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1745 if (*bp == '"')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1746 *bp++ = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1747 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1748 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1749
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1750 vec[i] = bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1751 while (!isspace (*bp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1752 bp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1753 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1754 i--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1755 vec[NVEC] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1756
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1757 if (*bp != 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1758 (void) respond (NOTOK, "too many arguments");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1759 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1760 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1761 if (*vec[0] == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1762 (void) respond (NOTOK, "null command");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1763 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1764 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1765 make_lower (vec[0], vec[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1766
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1767 for (v = vectors; v -> v_cmd; v++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1768 if (strcmp (v -> v_cmd, vec[0]) == 0 && v -> v_valid == mystate) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1769 if (i < v -> v_min || v -> v_max < i) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1770 (void) respond (NOTOK, "too %s arguments to \"%s\"",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1771 i < v -> v_min ? "few" : "many", vec[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1772 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1773 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1774 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1775 return v;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1776 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1777
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1778 (void) respond (NOTOK, "unknown command: \"%s\"", vec[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1779 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1780 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1781
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1782 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1783
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1784 /* VARARGS2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1785
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1786 static int respond (code, fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1787 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1788 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1789 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1790 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1791 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1792 int code;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1793 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1794 register char *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1795 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1796
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1797 bp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1798 #ifndef POP2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1799 (void) sprintf (bp, "%s%s", code == OK ? "+OK" : "-ERR", fmt ? " " : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1800 bp += strlen (bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1801 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1802 switch (code) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1803 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1804 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1805 (void) sprintf (bp, "%s%s", code == OK ? "+OK" : "-ERR",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1806 fmt ? " " : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1807 bp += strlen (bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1808 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1809
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1810 default: /* only happens in pop2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1811 *bp++ = code;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1812 code = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1813 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1814 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1815 if (fmt) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1816 (void) sprintf (bp, fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1817 bp += strlen (bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1818 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1819 putline (buffer, output);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1820
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1821 return code;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1822 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1823
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1824
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1825 /* VARARGS1 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1826
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1827 static multiline (fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1828 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1829 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1830 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1831 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1832 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1833 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1834 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1835 char buffer[BUFSIZ + TRMLEN];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1836
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1837 (void) strcpy (buffer, TRM);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1838 (void) sprintf (cp = (buffer + TRMLEN), fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1839 if (strncmp (cp, TRM, TRMLEN) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1840 cp = buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1841
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1842 putline (cp, output);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1843 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1844
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1845
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1846 static multiend () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1847 putline (TRM, output);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1848 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1849
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1850 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1851
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1852 static int getline (s, n, iop)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1853 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1854 register int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1855 register FILE *iop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1856 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1857 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1858 register char *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1859
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1860 p = s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1861 while (--n > 0 && (c = fgetc (iop)) != EOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1862 while (c == IAC) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1863 (void) fgetc (iop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1864 c = fgetc (iop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1865 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1866 if ((*p++ = c) == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1867 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1868 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1869 if (ferror (iop))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1870 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1871 if (c == EOF && p == s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1872 return DONE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1873 if (debug) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1874 if (*--p == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1875 *p = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1876 padvise (NULLCP, LOG_DEBUG, "<--- %s", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1877 if (*p == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1878 *p = '\n';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1879 p++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1880 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1881 *p++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1882
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1883 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1884 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1885
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1886
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1887 static putline (s, iop)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1888 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1889 register FILE *iop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1890 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1891 (void) fprintf (iop, "%s\r\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1892 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1893 padvise (NULLCP, LOG_DEBUG, "---> %s", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1894
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1895 (void) fflush (iop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1896 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1897
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1898
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1899 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1900
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1901 static TYPESIG pipeser (sig, code, sc)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1902 int sig;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1903 long code;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1904 struct sigcontext *sc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1905 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1906 padvise (NULLCP, LOG_WARNING, "lost connection");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1907
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1908 _exit (NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1909 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1910
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1911 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1912
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1913 /* Some people don't want to use the POP delivery agent with Sendmail
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1914 * if they're going to run POP. Sendmail writes maildrops in the old
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1915 * UUCP format, and popd doesn't know how to read them. These people
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1916 * really should do what the MH manual says -- run the pop delivery
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1917 * agent and be done with it. Some things never die.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1918 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1919 * A real fix would be to make uip/dropsbr.c should use the same methods
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1920 * as sbr/m_getfld.c to determine the format of maildrops and read &
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1921 * write them. Unfortunately, it'll take a lot of work to bring it into
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1922 * the fold. 20Mar90/JLR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1923 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1924 * I really really hate to add this, but this lets stuff popd read
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1925 * UUCP style maildrops as well as MMDF (ctrl/A) style maildrops. It was
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1926 * contributed by Steve Dempsey <steved@longs.LANCE.ColoState.Edu>.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1927 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1928 * Here's what he says:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1929 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1930 * Ideally, one should be able to do it with the mmdelim strings, but
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1931 * the MH parser is not intelligent enough to do this. You have at
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1932 * least a couple of choices:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1933 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1934 * - use aliases to deliver mail to POP users (user: user@pop) and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1935 * install the POP delivery agent - should work well with sendmail.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1936 * - fix the POP server!
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1937 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1938 * We have all mail sent to one machine and users are given two options:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1939 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1940 * - MH on any machine.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1941 * - any user agent on the postoffice machine.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1942 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1943 * Most of our workstations run xmh and users find that to be sufficient.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1944 * New users are only taught to use MH, and a very few old timers stay
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1945 * with BSD mail. In any case, several agents are available at the cost
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1946 * of a telnet/rlogin if a user does not like MH.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1947 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1948 * I have made the changes to the POP server (MH-6.6/support/pop/popser.c)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1949 * to look for the `\n\nFrom ' delimiter instead of the ^A's, using some
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1950 * code from the BSD agent. Context diff is included below. When this
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1951 * is installed, you just go back to the normal localmail and get rid of
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1952 * slocal completely.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1953 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1954 * I have not tried this modification with anything but the MH client,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1955 * but it should work. Nothing in the POP protocol changes; the server
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1956 * just has different criteria for delimiting messages in the mailbox.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1957 * If you decide to use this, I'd like to know what happens.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1958 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1959 * Steve Dempsey, Center for Computer Assisted Engineering
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1960 * Colorado State University, Fort Collins, CO 80523 +1 303 491 0630
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1961 * INET: steved@longs.LANCE.ColoState.Edu, dempsey@handel.CS.ColoState.Edu
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1962 * boulder!ccncsu!longs.LANCE.ColoState.Edu!steved, ...!ncar!handel!dempsey
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1963 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1964 /* From: Jim Reid <jim@computer-science.strathclyde.ac.UK>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1965 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1966 * MH-6.7 does not support MMDF-style mailboxes with POP as claimed. It
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1967 * appears that when code was added to popser.c to support UNIX-style
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1968 * mailboxes, the old behaviour was lost. i.e. The new popd worked with
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1969 * UNIX-style mailboxes, but not MMDF ones. Users would get "format error"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1970 * error messages if they tried to inc a remote MMDF-style mailbox because
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1971 * the pop daemon didn't want to know or like the MMDF message delimiters.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1972 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1973
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1974 /* So... Now there's an incredible hack in mhconfig.c to define POPUUMBOX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1975 * in support/pop/Makefile if we're using Sendmail. This causes this
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1976 * UUCP-mbox reading code to be used here. Ugh. 05Nov90/JLR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1977 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1978
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1979 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1980 #ifdef POPUUMBOX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1981 /* from dropsbr.c - read from a mailbox - pop server version */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1982
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1983 /* ALMOST IDENTICAL to mbx_read */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1984
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1985 static int pmbx_read (fp, pos, drops, noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1986 register FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1987 register long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1988 struct drop **drops;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1989 int noisy;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1990 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1991 register int len,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1992 size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1993 register char *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1994 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1995 register struct drop *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1996 *dp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1997 *ep,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1998 *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1999
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2000 /* MTR: tsk, tsk, tsk... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2001 (void) fseek (fp, pos, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2002 if (fgets (buffer, sizeof buffer, fp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2003 && strcmp (buffer, mmdlm1) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2004 return mbx_read (fp, pos, drops, noisy);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2005
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2006 /* get drop storage */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2007 pp = (struct drop *) calloc ((unsigned) (len = MAXFOLDER), sizeof *dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2008
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2009 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2010 padvise (NULLCP, LOG_DEBUG, "pmbx_read (%d, %ld, %d, %d)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2011 fp, pos,drops,noisy);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2012
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2013 if (pp == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2014 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2015 admonish (NULLCP, "unable to allocate drop storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2016 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2017 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2018
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2019 /* rewind drop file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2020 (void) fseek (fp, pos, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2021
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2022 if (debug)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2023 padvise (NULLCP, LOG_DEBUG, "rewind maildrop");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2024
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2025 /* read a buffer */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2026 for (ep = (dp = pp) + len - 1; fgets (buffer, sizeof buffer, fp);) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2027 size = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2028
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2029 /* if beginning of msg then mark it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2030
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2031 if (p_ishead(buffer)) /*(strcmp (buffer, mmdlm1) == 0)*/ {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2032 /* (don't) inc pos to msg start, mark it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2033 /*pos += ld1;*/
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2034 dp -> d_start = pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2035 pos += strlen(buffer); /* inc pos after marking head */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2036 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2037 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2038 /* didn't find it; mark it anyway */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2039 dp -> d_start = pos, pos += (long) strlen (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2040
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2041 /* count newlines and inc size if any found */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2042 for (bp = buffer; *bp; bp++, size++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2043 if (*bp == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2044 size++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2045 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2046
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2047 /* read more lines... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2048 while (fgets (buffer, sizeof buffer, fp) != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2049
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2050 /* found end? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2051 if (p_ishead(buffer)) /*(strcmp (buffer, mmdlm2) == 0)*/ {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2052
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2053 /* out of loop */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2054 (void) fseek (fp, pos, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2055 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2056
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2057 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2058 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2059 /* add buffer size to pos */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2060 pos += (long) strlen (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2061
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2062 /* count newlines.... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2063 for (bp = buffer; *bp; bp++, size++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2064 if (*bp == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2065 size++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2066 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2067
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2068 if (dp -> d_start != pos) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2069 /* do this if pos was actually incremented; got some text */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2070 dp -> d_id = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2071 dp -> d_size = size; /* save the stuff we got */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2072 dp -> d_stop = pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2073 dp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2074 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2075
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2076 /* (don't) advance pos */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2077 /* pos += ld2; */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2078
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2079 /* need more storage.... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2080 if (dp >= ep) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2081 register int curlen = dp - pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2082
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2083 cp = (struct drop *) realloc ((char *) pp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2084 (unsigned) (len += MAXFOLDER) * sizeof *pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2085 if (cp == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2086 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2087 admonish (NULLCP, "unable to allocate drop storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2088 free ((char *) pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2089 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2090 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2091 dp = cp + curlen, ep = (pp = cp) + len - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2092 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2093 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2094
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2095 /* return unused stuff */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2096 if (dp == pp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2097 free ((char *) pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2098 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2099 *drops = pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2100 return (dp - pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2101 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2102
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2103 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2104 * The remainder of this file adapted from:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2105 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2106 * head.c 5.2 (Berkeley) 6/21/85
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2107 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2108
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2109 struct p_hdline {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2110 char *l_from; /* The name of the sender */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2111 char *l_tty; /* His tty string (if any) */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2112 char *l_date; /* The entire date string */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2113 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2114
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2115 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2116 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2117 * See if position in a file is a mail header.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2118 * Return true if yes. Note the extreme pains to
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2119 * accomodate all funny formats.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2120 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2121
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2122 #define NOSTR ((char *) 0) /* Null string pointer */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2123 static char *p_copyin();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2124 static char *p_copy();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2125
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2126
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2127 static p_ishead(buffer)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2128 char buffer[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2129 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2130 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2131 struct p_hdline hl;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2132 char linebuf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2133 char parbuf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2134
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2135 strcpy(linebuf,buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2136 cp = linebuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2137
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2138 if (linebuf[0]=='F')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2139 padvise (NULLCP, LOG_DEBUG, "ishead: '%s'",linebuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2140
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2141 if (strncmp("From ", cp, 5) != 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2142 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2143
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2144 padvise (NULLCP, LOG_DEBUG, "Fromline...");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2146 /* get full header */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2147 p_parse(cp, &hl, parbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2148
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2149 if (hl.l_from == NOSTR || hl.l_date == NOSTR) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2150 padvise (NULLCP, LOG_DEBUG, "Fromline...NODATE");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2151 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2152 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2153
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2154 if (!p_isdate(hl.l_date)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2155 padvise (NULLCP, LOG_DEBUG, "Fromline...BADDATE %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2156 hl.l_date);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2157 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2158 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2159
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2160 /* I guess we got it! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2161 padvise (NULLCP, LOG_DEBUG, "got a head.. ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2163 return(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2164 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2165
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2166 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2167 * Split a headline into its useful components.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2168 * Copy the line into dynamic string space, then set
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2169 * pointers into the copied line in the passed headline
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2170 * structure. Actually, it scans.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2171 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2172
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2173 static p_parse(line, hl, pbuf)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2174 char line[], pbuf[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2175 struct p_hdline *hl;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2176 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2177 register char *cp, *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2178 char *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2179 char word[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2180 char * p_nextword();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2182 hl->l_from = NOSTR;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2183 hl->l_tty = NOSTR;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2184 hl->l_date = NOSTR;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2185 cp = line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2186 sp = pbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2187
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2188 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2189 * Skip the first "word" of the line, which should be "From"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2190 * anyway.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2191 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2192 cp = p_nextword(cp, word);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2193 dp = p_nextword(cp, word);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2194 if (!(strcmp(word, "")==0))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2195 hl->l_from = p_copyin(word, &sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2196
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2197 /* UNLIKELY */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2198 if (strncmp(dp, "tty", 3) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2199 cp = p_nextword(dp, word);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2200 hl->l_tty = p_copyin(word, &sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2201 if (cp != NOSTR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2202 hl->l_date = p_copyin(cp, &sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2203 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2204
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2205 /* USUAL */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2206 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2207 if (dp != NOSTR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2208 hl->l_date = p_copyin(dp, &sp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2209 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2210
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2211 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2212 * Copy the string on the left into the string on the right
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2213 * and bump the right (reference) string pointer by the length.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2214 * Thus, dynamically allocate space in the right string, copying
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2215 * the left string into it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2216 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2217
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2218 static char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2219 p_copyin(src, space)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2220 char src[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2221 char **space;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2222 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2223 register char *cp, *top;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2224 register int s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2225
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2226 s = strlen(src);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2227 cp = *space;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2228 top = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2229 strcpy(cp, src);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2230 cp += s + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2231 *space = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2232 return(top);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2233 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2234
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2235 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2236 * Collect a liberal (space, tab delimited) word into the word buffer
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2237 * passed. Also, return a pointer to the next word following that,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2238 * or (empty) if none follow.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2239 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2241 static char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2242 p_nextword(wp, wbuf)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2243 char wp[], wbuf[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2244 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2245 register char *cp, *cp2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2246
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2247 if ((cp = wp) == NOSTR) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2248 p_copy("", wbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2249 return(NOSTR);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2250 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2251 cp2 = wbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2252 while (!any(*cp, " \t") && *cp != '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2253 if (*cp == '"') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2254 *cp2++ = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2255 while (*cp != '\0' && *cp != '"')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2256 *cp2++ = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2257 if (*cp == '"')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2258 *cp2++ = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2259 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2260 *cp2++ = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2261 *cp2 = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2262 while (any(*cp, " \t"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2263 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2264 if (*cp == '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2265 return(NOSTR);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2266 return(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2267 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2268
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2269 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2270 * Copy str1 to str2, return pointer to null in str2.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2271 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2272
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2273 static char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2274 p_copy(str1, str2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2275 char *str1, *str2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2276 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2277 register char *s1, *s2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2278
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2279 s1 = str1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2280 s2 = str2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2281 while (*s1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2282 *s2++ = *s1++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2283 *s2 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2284 return(s2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2285 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2286
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2287 #define L 1 /* A lower case char */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2288 #define S 2 /* A space */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2289 #define D 3 /* A digit */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2290 #define O 4 /* An optional digit or space */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2291 #define C 5 /* A colon */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2292 #define N 6 /* A new line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2293 #define U 7 /* An upper case char */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2294
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2295 static char p_ctypes[] =
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2296 {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,D,D,D,D,0};
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2297 /* T h u S e p 2 9 1 5 : 2 0 : 1 9 1 9 8 8 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2298
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2299 static char p_tmztyp[] =
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2300 {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,U,U,U,S,D,D,D,D,0};
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2301 /* T h u S e p 2 9 1 5 : 2 0 : 1 9 M S T 1 9 8 8 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2302
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2303 static p_isdate(date)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2304 char date[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2305 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2306 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2307
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2308 cp = date;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2309 if (p_cmatch(cp, p_ctypes))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2310 return(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2311
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2312 return(p_cmatch(cp, p_tmztyp));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2313 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2314
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2315 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2316 * Match the given string against the given template.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2317 * Return 1 if they match, 0 if they don't
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2318 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2319
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2320 static p_cmatch(str, temp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2321 char str[], temp[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2322 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2323 register char *cp, *tp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2324 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2325
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2326 cp = str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2327 tp = temp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2328 while (*cp != '\0' && *tp != 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2329 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2330 switch (*tp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2331 case L:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2332 if (c < 'a' || c > 'z')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2333 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2334 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2335
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2336 case U:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2337 if (c < 'A' || c > 'Z')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2338 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2339 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2340
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2341 case S:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2342 if (c != ' ')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2343 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2344 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2345
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2346 case D:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2347 if (!isdigit(c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2348 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2349 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2350
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2351 case O:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2352 if (c != ' ' && !isdigit(c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2353 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2354 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2355
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2356 case C:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2357 if (c != ':')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2358 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2359 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2360
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2361 case N:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2362 if (c != '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2363 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2364 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2365 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2366 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2367 if ((*cp != '\0' && *cp != '\n') || *tp != 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2368 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2369 return(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2370 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2371
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2372 static any(ch, str)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2373 char *str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2374 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2375 register char *f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2376 register c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2377
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2378 f = str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2379 c = ch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2380 while (*f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2381 if (c == *f++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2382 return(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2383 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2384 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2385 #endif