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