annotate uip/pshsbr.c @ 10:a6481689f99c

*** empty log message ***
author kono
date Wed, 06 Dec 2006 03:17:53 +0900
parents bce86c4163a3
children 441a2190cfae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* popsbr.c - POP client subroutines */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char ident[] = "@(#)$Id$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #if defined(NNTP) && !defined(PSHSBR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #undef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 /* LINTLIBRARY */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include "../h/strings.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #ifdef NNTP /* building pshsbr.o from popsbr.c */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include "../h/nntp.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #ifndef POPSERVICE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #define POPSERVICE "pop"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #define NOTOK (-1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #define OK 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #define DONE 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #define TRM "."
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #define TRMLEN (sizeof TRM - 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #if !defined(BSD44) && !defined(__GNU_LIBRARY__)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 extern int sys_nerr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 extern char *sys_errlist[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #ifdef __NetBSD__ /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 static int poprint = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 static int pophack = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 char response[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 static FILE *input;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 static FILE *output;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 #ifdef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 static int traverse (int (*)(), const char*, char *, char *, char *, char *);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 #define targ_t char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 static int traverse();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 #define targ_t int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 #if !defined(NNTP) && defined(MPOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #define command pop_command
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 #define multiline pop_multiline
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 int command(), multiline();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 static int command(), multiline();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 static int getline();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 static putline();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 #ifdef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 static int xtnd_last = -1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 xtnd_first = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 static char xtnd_name[512]; /* INCREDIBLE HACK!! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 #ifdef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 #include "md5.c"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 static char *pop_auth (user, pass)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 char *user,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 *pass;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 *lp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 register unsigned char *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 unsigned char *ep,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 digest[16];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 MD5_CTX mdContext;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 static char buffer[BUFSIZ * 2];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 if ((cp = index (response, '<')) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 || (lp = index (cp, '>')) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 (void) sprintf (buffer, "APOP not available: %s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 buffer[sizeof(response) - 1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 (void) strcpy (response, buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 *++lp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 (void) sprintf (buffer, "%s%s", cp, pass);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 MD5Init (&mdContext);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 MD5Update (&mdContext, (unsigned char *) buffer,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 (unsigned int) strlen (buffer));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 MD5Final (digest, &mdContext);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 (void) sprintf (cp = buffer, "%s ", user);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 cp += strlen (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 for (ep = (dp = digest) + sizeof digest / sizeof digest[0];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 dp < ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 cp += 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 (void) sprintf (cp, "%02x", *dp++ & 0xff);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 return buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 #endif /* APOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 #endif /* !NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 #if defined(RPOP) || defined(APOP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 int pop_init (host, user, pass, snoop, rpop)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 int rpop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 int pop_init (host, user, pass, snoop)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 char *host,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 *user,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 *pass;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 int snoop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 #ifdef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 int apop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 #ifndef RPOP /* !APOP && !RPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 int rpop = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 int fd1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 fd2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 #ifdef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 if ((apop = rpop) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 rpop = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 #endif /* APOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 #ifndef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 if ((fd1 = client (host, "tcp", POPSERVICE, rpop, response)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 #else /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 (void) sprintf (buffer, "%s/%s", POPSERVICE, "kpop");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 if ((fd1 = client (host, "tcp", buffer, rpop, response)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 if ((fd1 = client (host, "tcp", "nntp", rpop, response)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 if ((fd2 = dup (fd1)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 (void) sprintf (response, "unable to dup connection descriptor: %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 errno > 0 && errno < sys_nerr ? sys_errlist[errno]
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 : "unknown error");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 (void) close (fd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 if (pop_set (fd1, fd2, snoop) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 if (pop_set (fd1, fd2, snoop, (char *)0) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 (void) signal (SIGPIPE, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 switch (getline (response, sizeof response, input)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 if (poprint)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 fprintf (stderr, "<--- %s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 if (*response == '+') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 #ifndef KPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 #ifdef APOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 if (apop < 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 char *cp = pop_auth (user, pass);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 if (cp && command ("APOP %s", cp) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 #endif /* apop */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 if (command ("USER %s", user) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 && command ("%s %s", rpop ? "RPOP" : (pophack++, "PASS"),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 pass) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 #else /* KPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 if (command ("USER %s", user) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 && command ("PASS %s", pass) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 if (*response < CHAR_ERR) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 (void) command ("MODE READER");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 #ifdef NEWSAUTH
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 if (getenv("NEWSAUTH")) /* special for IDENT protocol */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 command("MODE IDENTIFY");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 (void) strcpy (buffer, response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 (void) command ("QUIT");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 (void) strcpy (response, buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 /* and fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 case DONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 if (poprint)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 fprintf (stderr, "%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 (void) fclose (input);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 (void) fclose (output);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 int pop_set (in, out, snoop)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 int pop_set (in, out, snoop, myname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 char *myname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 int in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 out,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 snoop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 #ifdef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 if (myname && *myname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 strcpy (xtnd_name, myname); /* interface from bbc to msh */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 if ((input = fdopen (in, "r")) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 || (output = fdopen (out, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 (void) strcpy (response, "fdopen failed on connection descriptor");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 if (input)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 (void) fclose (input);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 (void) close (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 (void) close (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 poprint = snoop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 int pop_fd (in, out)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 char *in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 *out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 (void) sprintf (in, "%d", fileno (input));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 (void) sprintf (out, "%d", fileno (output));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 int pop_stat (nmsgs, nbytes)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 int *nmsgs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 *nbytes;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 #ifdef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 char **ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 extern char **brkstring();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 if (command ("STAT") == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 *nmsgs = *nbytes = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 (void) sscanf (response, "+OK %d %d", nmsgs, nbytes);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 if (xtnd_last < 0) { /* in msh, xtnd_name is set from myname */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 if (command("GROUP %s", xtnd_name) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 ap = brkstring (response, " ", "\n"); /* "211 nart first last ggg" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 xtnd_first = atoi (ap[2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 xtnd_last = atoi (ap[3]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 /* nmsgs is not the real nart, but an incredible simuation */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 if (xtnd_last > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 *nmsgs = xtnd_last - xtnd_first + 1; /* because of holes... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 *nmsgs = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 *nbytes = xtnd_first; /* for subtracting offset in msh() */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 #ifdef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 int pop_exists (action)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 int (*action) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 int msgno,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 arg1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 arg2,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 #ifdef XMSGS /* hacked into NNTP 1.5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 if (traverse (action, "XMSGS %d-%d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 (targ_t)xtnd_first, (targ_t)xtnd_last, 0, 0) == OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 if (traverse (action, "LISTGROUP", /* provided by INN 1.4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 0, 0, 0, 0) == OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 if (traverse (action, "XHDR NONAME %d-%d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 (targ_t)xtnd_first, (targ_t)xtnd_last, 0, 0) == OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 status = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 for (msgno = xtnd_first; msgno <= xtnd_last; msgno++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 if (pop_list(msgno, (int *) 0, &arg1, &arg2, (int *) 0) == OK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 if ((cp = index(response, ' ')) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 (*action) (++cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 status = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 return status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 #if !defined(BPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 int pop_list (msgno, nmsgs, msgs, bytes)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 #else /* !BPOP && !NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 int pop_list (msgno, nmsgs, msgs, bytes, ids)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 int *ids;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 #endif /* !BPOP && !NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 int msgno,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 *nmsgs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 *msgs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 *bytes;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 #if !defined(BPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 int *ids = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 if (msgno) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 if (command ("LIST %d", msgno) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 *msgs = *bytes = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 if (ids) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 *ids = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 (void) sscanf (response, "+OK %d %d %d", msgs, bytes, ids);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 (void) sscanf (response, "+OK %d %d", msgs, bytes);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 *msgs = *bytes = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 if (command ("STAT %d", msgno) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 if (ids) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 *ids = msgno;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 if (command ("LIST") == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 for (i = 0; i < *nmsgs; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 switch (multiline ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 case DONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 *nmsgs = ++i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 *msgs = *bytes = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 if (ids) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 *ids = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 (void) sscanf (response, "%d %d %d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 msgs++, bytes++, ids++);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 (void) sscanf (response, "%d %d", msgs++, bytes++);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 for (;;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 switch (multiline ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 case DONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 int pop_retr (msgno, action)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 int msgno,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 (*action) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 return traverse (action, "RETR %d", (targ_t)msgno, 0, 0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 return traverse (action, "ARTICLE %d", (targ_t)msgno, 0, 0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 #endif /* NNTP */
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 /* VARARGS2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 static int traverse (action, fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 int (*action) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 #ifdef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 const char *fmt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 char *fmt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 char *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 char buffer[sizeof response];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 if (command (fmt, a, b, c, d) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 (void) strcpy (buffer, response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 for (;;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 switch (multiline ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 case DONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 (void) strcpy (response, buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 (*action) (response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 int pop_dele (msgno)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 int msgno;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 return command ("DELE %d", msgno);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 int pop_noop () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 return command ("NOOP");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 #ifdef MPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 int pop_last () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 return command ("LAST");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 #endif /* MPOP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 #endif /* !NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 int pop_rset () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 return command ("RSET");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 int pop_top (msgno, lines, action)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 int msgno,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 lines,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 (*action) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 return traverse (action, "TOP %d %d", (targ_t)msgno, (targ_t)lines, 0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 return traverse (action, "HEAD %d", (targ_t)msgno, 0, 0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 int pop_xtnd (action, fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 int (*action) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 #ifdef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 extern char **brkstring();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 char **ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 (void) sprintf (buffer, "XTND %s", fmt);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 return traverse (action, buffer, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 sprintf (buffer, fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 ap = brkstring (buffer, " ", "\n"); /* a hack, i know... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 if (uleq(ap[0], "x-bboards")) { /* XTND "X-BBOARDS group */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 /* most of these parameters are meaningless under NNTP.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 * bbc.c was modified to set AKA and LEADERS as appropriate,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 * the rest are left blank.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 if (uleq (ap[0], "archive") && ap[1]) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 sprintf (xtnd_name, "%s", ap[1]); /* save the name */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 xtnd_last = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 xtnd_first = 1; /* setup to fail in pop_stat */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 if (uleq (ap[0], "bboards")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 if (ap[1]) { /* XTND "BBOARDS group" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 sprintf (xtnd_name, "%s", ap[1]); /* save the name */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 if (command("GROUP %s", xtnd_name) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 strcpy (buffer, response); /* action must ignore extra args */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 ap = brkstring (response, " ", "\n");/* "211 nart first last g" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 xtnd_first = atoi (ap[2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 xtnd_last = atoi (ap[3]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 (*action) (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 } else { /* XTND "BBOARDS" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 return traverse (action, "LIST", a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 return NOTOK; /* unknown XTND command */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 int pop_quit () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 i = command ("QUIT");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 (void) pop_done ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 int pop_done () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 (void) fclose (input);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 (void) fclose (output);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 /* VARARGS1 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 #if defined(MPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 int command (fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 static int command (fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 (void) sprintf (buffer, fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 if (poprint)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 if (pophack) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 if (cp = index (buffer, ' '))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 fprintf (stderr, "---> %s ********\n", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 if (cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 *cp = ' ';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 pophack = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 fprintf (stderr, "---> %s\n", buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 if (putline (buffer, output) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 switch (getline (response, sizeof response, input)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 if (poprint)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 fprintf (stderr, "<--- %s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 return (*response == '+' ? OK : NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 return (*response < CHAR_ERR ? OK : NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 case DONE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 if (poprint)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 fprintf (stderr, "%s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 #if defined(MPOP) && !defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 int multiline () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 static int multiline () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 char buffer[BUFSIZ + TRMLEN];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 if (getline (buffer, sizeof buffer, input) != OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 #ifdef DEBUG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 if (poprint)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 fprintf (stderr, "<--- %s\n", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 #endif /* DEBUG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 if (strncmp (buffer, TRM, TRMLEN) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 if (buffer[TRMLEN] == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 return DONE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 (void) strcpy (response, buffer + TRMLEN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 (void) strcpy (response, buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 static int getline (s, n, iop)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 FILE * iop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 char *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 p = s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 while (--n > 0 && (c = fgetc (iop)) != EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 if ((*p++ = c) == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 if (ferror (iop) && c != EOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 (void) strcpy (response, "error on connection");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 if (c == EOF && p == s) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 (void) strcpy (response, "connection closed by foreign host");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 return DONE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 *p = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 if (*--p == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 *p = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 if (*--p == '\r')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 *p = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 static putline (s, iop)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 FILE * iop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 (void) fprintf (iop, "%s\r\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 (void) fflush (iop);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 if (ferror (iop)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 (void) strcpy (response, "lost connection");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 }