annotate support/pop/popser.c @ 0:bce86c4163a3

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