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