Mercurial > emacs
annotate lib-src/pop.c @ 112119:48f5ac42611a
Reconcile with changes in line movement behavior for long text lines
that cross more than a single physical window line, ie when truncate-lines
is nil.
(allout-next-visible-heading): Provide for change in line-move behavior on
long lines when truncate-lines is nil. In that case, line-move can wind up
on the same textual line when it moves to the next window line, and moving
to the bullet position after the move yields zero advancement. Add logic
to detect and compensate for the lack of progress.
(allout-current-topic-collapsed-p): move-end-of-line respect for field
boundaries is different when operating with body lines shorter than window
width versus ones greater than window width, which can yield false
negatives in this function. Avoid difference by applying move-end-of-line
while field-text-motion is inhibited.
author | Ken Manheimer <ken.manheimer@gmail.com> |
---|---|
date | Tue, 04 Jan 2011 14:44:10 -0500 |
parents | fdbd24f8d999 |
children | 417b1e4d63cd 7df2e30d72ec |
rev | line source |
---|---|
9158 | 1 /* pop.c: client routines for talking to a POP3-protocol post-office server |
75250
6d19c76d81c5
Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents:
70857
diff
changeset
|
2 Copyright (C) 1991, 1993, 1996, 1997, 1999, 2001, 2002, 2003, 2004, |
106815 | 3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
94828
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
4 |
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
5 Author: Jonathan Kamens <jik@security.ov.com> |
9158 | 6 |
7 This file is part of GNU Emacs. | |
8 | |
94828
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
9 GNU Emacs is free software: you can redistribute it and/or modify |
9158 | 10 it under the terms of the GNU General Public License as published by |
94828
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
11 the Free Software Foundation, either version 3 of the License, or |
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
12 (at your option) any later version. |
9158 | 13 |
14 GNU Emacs is distributed in the hope that it will be useful, | |
15 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 GNU General Public License for more details. | |
18 | |
19 You should have received a copy of the GNU General Public License | |
94828
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
20 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
21 |
9158 | 22 |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
23 #ifdef HAVE_CONFIG_H |
42412 | 24 #include <config.h> |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
25 #else |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
26 #define MAIL_USE_POP |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
27 #endif |
9592
132798b0352b
Include ../src/config.h.
Richard M. Stallman <rms@gnu.org>
parents:
9591
diff
changeset
|
28 |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
29 #ifdef MAIL_USE_POP |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
30 |
9158 | 31 #include <sys/types.h> |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
32 #ifdef WINDOWSNT |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
33 #include "ntlib.h" |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
34 #include <winsock.h> |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
35 #undef SOCKET_ERROR |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
36 #define RECV(s,buf,len,flags) recv(s,buf,len,flags) |
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
37 #define SEND(s,buf,len,flags) send(s,buf,len,flags) |
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
38 #define CLOSESOCKET(s) closesocket(s) |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
39 #else |
9158 | 40 #include <netinet/in.h> |
41 #include <sys/socket.h> | |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
42 #define RECV(s,buf,len,flags) read(s,buf,len) |
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
43 #define SEND(s,buf,len,flags) write(s,buf,len) |
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
44 #define CLOSESOCKET(s) close(s) |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
45 #endif |
9158 | 46 #include <pop.h> |
9600
f0d3266e07d7
Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents:
9594
diff
changeset
|
47 |
9158 | 48 #ifdef sun |
49 #include <malloc.h> | |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
50 #endif /* sun */ |
9600
f0d3266e07d7
Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents:
9594
diff
changeset
|
51 |
9158 | 52 #ifdef HESIOD |
53 #include <hesiod.h> | |
54 /* | |
55 * It really shouldn't be necessary to put this declaration here, but | |
56 * the version of hesiod.h that Athena has installed in release 7.2 | |
57 * doesn't declare this function; I don't know if the 7.3 version of | |
58 * hesiod.h does. | |
59 */ | |
60 extern struct servent *hes_getservbyname (/* char *, char * */); | |
61 #endif | |
9600
f0d3266e07d7
Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents:
9594
diff
changeset
|
62 |
9158 | 63 #include <pwd.h> |
64 #include <netdb.h> | |
65 #include <errno.h> | |
66 #include <stdio.h> | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
67 #ifdef STDC_HEADERS |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
68 #include <string.h> |
19978
83050d7e3f64
Use system header files instead of declaring C-library
Karl Heuer <kwzh@gnu.org>
parents:
19018
diff
changeset
|
69 #define index strchr |
83050d7e3f64
Use system header files instead of declaring C-library
Karl Heuer <kwzh@gnu.org>
parents:
19018
diff
changeset
|
70 #endif |
83050d7e3f64
Use system header files instead of declaring C-library
Karl Heuer <kwzh@gnu.org>
parents:
19018
diff
changeset
|
71 #ifdef HAVE_UNISTD_H |
83050d7e3f64
Use system header files instead of declaring C-library
Karl Heuer <kwzh@gnu.org>
parents:
19018
diff
changeset
|
72 #include <unistd.h> |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
73 #endif |
9600
f0d3266e07d7
Fix mismatch in conditionals.
Richard M. Stallman <rms@gnu.org>
parents:
9594
diff
changeset
|
74 |
9158 | 75 #ifdef KERBEROS |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
76 # ifdef HAVE_KRB5_H |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
77 # include <krb5.h> |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
78 # endif |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
79 # ifdef HAVE_KRB_H |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
80 # include <krb.h> |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
81 # else |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
82 # ifdef HAVE_KERBEROSIV_KRB_H |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
83 # include <kerberosIV/krb.h> |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
84 # else |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
85 # ifdef HAVE_KERBEROS_KRB_H |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
86 # include <kerberos/krb.h> |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
87 # endif |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
88 # endif |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
89 # endif |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
90 # ifdef HAVE_COM_ERR_H |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
91 # include <com_err.h> |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
92 # endif |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
93 #endif /* KERBEROS */ |
9158 | 94 |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
95 #ifdef KERBEROS |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
96 #ifndef KERBEROS5 |
9158 | 97 extern int krb_sendauth (/* long, int, KTEXT, char *, char *, char *, |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
98 u_long, MSG_DAT *, CREDENTIALS *, Key_schedule, |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
99 struct sockaddr_in *, struct sockaddr_in *, |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
100 char * */); |
9158 | 101 extern char *krb_realmofhost (/* char * */); |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
102 #endif /* ! KERBEROS5 */ |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
103 #endif /* KERBEROS */ |
9158 | 104 |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
105 #ifndef WINDOWSNT |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
106 #if !defined(HAVE_H_ERRNO) || !defined(HAVE_CONFIG_H) |
9158 | 107 extern int h_errno; |
108 #endif | |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
109 #endif |
9158 | 110 |
109100
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
106815
diff
changeset
|
111 static int socket_connection (char *, int); |
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
106815
diff
changeset
|
112 static int pop_getline (popserver, char **); |
109744
fdbd24f8d999
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
Jan D <jan.h.d@swipnet.se>
parents:
109315
diff
changeset
|
113 static int sendline (popserver, const char *); |
109100
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
106815
diff
changeset
|
114 static int fullwrite (int, char *, int); |
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
106815
diff
changeset
|
115 static int getok (popserver); |
9158 | 116 #if 0 |
109100
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
106815
diff
changeset
|
117 static int gettermination (popserver); |
9158 | 118 #endif |
109100
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
106815
diff
changeset
|
119 static void pop_trash (popserver); |
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
106815
diff
changeset
|
120 static char *find_crlf (char *, int); |
9591
0774e217e8aa
Don't declare malloc, realloc, free.
Richard M. Stallman <rms@gnu.org>
parents:
9158
diff
changeset
|
121 |
29047 | 122 #define ERROR_MAX 160 /* a pretty arbitrary size, but needs |
29784 | 123 to be bigger than the original |
124 value of 80 */ | |
9158 | 125 #define POP_PORT 110 |
126 #define KPOP_PORT 1109 | |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
127 #define POP_SERVICE "pop3" /* we don't want the POP2 port! */ |
9158 | 128 #ifdef KERBEROS |
70857
d2542ee8a5c9
(pop_open, socket_connection, KPOP_SERVICE): Added
Francesco Potortì <pot@gnu.org>
parents:
68647
diff
changeset
|
129 #define KPOP_SERVICE "kpop" /* never used: look for 20060515 to see why */ |
9158 | 130 #endif |
131 | |
132 char pop_error[ERROR_MAX]; | |
133 int pop_debug = 0; | |
134 | |
135 #ifndef min | |
136 #define min(a,b) (((a) < (b)) ? (a) : (b)) | |
137 #endif | |
138 | |
139 /* | |
140 * Function: pop_open (char *host, char *username, char *password, | |
141 * int flags) | |
142 * | |
143 * Purpose: Establishes a connection with a post-office server, and | |
144 * completes the authorization portion of the session. | |
145 * | |
146 * Arguments: | |
147 * host The server host with which the connection should be | |
148 * established. Optional. If omitted, internal | |
149 * heuristics will be used to determine the server host, | |
150 * if possible. | |
151 * username | |
152 * The username of the mail-drop to access. Optional. | |
153 * If omitted, internal heuristics will be used to | |
154 * determine the username, if possible. | |
155 * password | |
156 * The password to use for authorization. If omitted, | |
157 * internal heuristics will be used to determine the | |
158 * password, if possible. | |
159 * flags A bit mask containing flags controlling certain | |
160 * functions of the routine. Valid flags are defined in | |
161 * the file pop.h | |
162 * | |
163 * Return value: Upon successful establishment of a connection, a | |
164 * non-null popserver will be returned. Otherwise, null will be | |
165 * returned, and the string variable pop_error will contain an | |
166 * explanation of the error. | |
167 */ | |
168 popserver | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
169 pop_open (char *host, char *username, char *password, int flags) |
9158 | 170 { |
171 int sock; | |
172 popserver server; | |
173 | |
174 /* Determine the user name */ | |
175 if (! username) | |
176 { | |
177 username = getenv ("USER"); | |
178 if (! (username && *username)) | |
179 { | |
180 username = getlogin (); | |
181 if (! (username && *username)) | |
182 { | |
183 struct passwd *passwd; | |
184 passwd = getpwuid (getuid ()); | |
185 if (passwd && passwd->pw_name && *passwd->pw_name) | |
186 { | |
187 username = passwd->pw_name; | |
188 } | |
189 else | |
190 { | |
191 strcpy (pop_error, "Could not determine username"); | |
192 return (0); | |
193 } | |
194 } | |
195 } | |
196 } | |
197 | |
198 /* | |
199 * Determine the mail host. | |
200 */ | |
201 | |
202 if (! host) | |
203 { | |
204 host = getenv ("MAILHOST"); | |
205 } | |
206 | |
207 #ifdef HESIOD | |
208 if ((! host) && (! (flags & POP_NO_HESIOD))) | |
209 { | |
210 struct hes_postoffice *office; | |
211 office = hes_getmailhost (username); | |
212 if (office && office->po_type && (! strcmp (office->po_type, "POP")) | |
213 && office->po_name && *office->po_name && office->po_host | |
214 && *office->po_host) | |
215 { | |
216 host = office->po_host; | |
217 username = office->po_name; | |
218 } | |
219 } | |
220 #endif | |
221 | |
222 #ifdef MAILHOST | |
223 if (! host) | |
224 { | |
225 host = MAILHOST; | |
226 } | |
227 #endif | |
228 | |
229 if (! host) | |
230 { | |
231 strcpy (pop_error, "Could not determine POP server"); | |
232 return (0); | |
233 } | |
234 | |
235 /* Determine the password */ | |
22236 | 236 #ifdef KERBEROS |
237 #define DONT_NEED_PASSWORD (! (flags & POP_NO_KERBEROS)) | |
9158 | 238 #else |
22236 | 239 #define DONT_NEED_PASSWORD 0 |
9158 | 240 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49053
diff
changeset
|
241 |
9158 | 242 if ((! password) && (! DONT_NEED_PASSWORD)) |
243 { | |
244 if (! (flags & POP_NO_GETPASS)) | |
245 { | |
246 password = getpass ("Enter POP password:"); | |
247 } | |
248 if (! password) | |
249 { | |
250 strcpy (pop_error, "Could not determine POP password"); | |
251 return (0); | |
252 } | |
253 } | |
70857
d2542ee8a5c9
(pop_open, socket_connection, KPOP_SERVICE): Added
Francesco Potortì <pot@gnu.org>
parents:
68647
diff
changeset
|
254 if (password) /* always true, detected 20060515 */ |
22236 | 255 flags |= POP_NO_KERBEROS; |
9158 | 256 else |
70857
d2542ee8a5c9
(pop_open, socket_connection, KPOP_SERVICE): Added
Francesco Potortì <pot@gnu.org>
parents:
68647
diff
changeset
|
257 password = username; /* dead code, detected 20060515 */ |
d2542ee8a5c9
(pop_open, socket_connection, KPOP_SERVICE): Added
Francesco Potortì <pot@gnu.org>
parents:
68647
diff
changeset
|
258 /** "kpop" service is never used: look for 20060515 to see why **/ |
9158 | 259 |
260 sock = socket_connection (host, flags); | |
261 if (sock == -1) | |
262 return (0); | |
263 | |
264 server = (popserver) malloc (sizeof (struct _popserver)); | |
265 if (! server) | |
266 { | |
267 strcpy (pop_error, "Out of memory in pop_open"); | |
268 return (0); | |
269 } | |
270 server->buffer = (char *) malloc (GETLINE_MIN); | |
271 if (! server->buffer) | |
272 { | |
273 strcpy (pop_error, "Out of memory in pop_open"); | |
274 free ((char *) server); | |
275 return (0); | |
276 } | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
277 |
9158 | 278 server->file = sock; |
279 server->data = 0; | |
280 server->buffer_index = 0; | |
281 server->buffer_size = GETLINE_MIN; | |
282 server->in_multi = 0; | |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
283 server->trash_started = 0; |
9158 | 284 |
285 if (getok (server)) | |
286 return (0); | |
287 | |
288 /* | |
289 * I really shouldn't use the pop_error variable like this, but.... | |
290 */ | |
291 if (strlen (username) > ERROR_MAX - 6) | |
292 { | |
293 pop_close (server); | |
294 strcpy (pop_error, | |
295 "Username too long; recompile pop.c with larger ERROR_MAX"); | |
296 return (0); | |
297 } | |
298 sprintf (pop_error, "USER %s", username); | |
299 | |
300 if (sendline (server, pop_error) || getok (server)) | |
301 { | |
302 return (0); | |
303 } | |
304 | |
305 if (strlen (password) > ERROR_MAX - 6) | |
306 { | |
307 pop_close (server); | |
308 strcpy (pop_error, | |
309 "Password too long; recompile pop.c with larger ERROR_MAX"); | |
310 return (0); | |
311 } | |
312 sprintf (pop_error, "PASS %s", password); | |
313 | |
314 if (sendline (server, pop_error) || getok (server)) | |
315 { | |
316 return (0); | |
317 } | |
318 | |
319 return (server); | |
320 } | |
321 | |
322 /* | |
323 * Function: pop_stat | |
324 * | |
325 * Purpose: Issue the STAT command to the server and return (in the | |
326 * value parameters) the number of messages in the maildrop and | |
327 * the total size of the maildrop. | |
328 * | |
329 * Return value: 0 on success, or non-zero with an error in pop_error | |
330 * in failure. | |
331 * | |
332 * Side effects: On failure, may make further operations on the | |
333 * connection impossible. | |
334 */ | |
335 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
336 pop_stat (popserver server, int *count, int *size) |
9158 | 337 { |
338 char *fromserver; | |
79817
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
339 char *end_ptr; |
9158 | 340 |
341 if (server->in_multi) | |
342 { | |
343 strcpy (pop_error, "In multi-line query in pop_stat"); | |
344 return (-1); | |
345 } | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
346 |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
347 if (sendline (server, "STAT") || (pop_getline (server, &fromserver) < 0)) |
9158 | 348 return (-1); |
349 | |
350 if (strncmp (fromserver, "+OK ", 4)) | |
351 { | |
352 if (0 == strncmp (fromserver, "-ERR", 4)) | |
353 { | |
354 strncpy (pop_error, fromserver, ERROR_MAX); | |
355 } | |
356 else | |
357 { | |
358 strcpy (pop_error, | |
359 "Unexpected response from POP server in pop_stat"); | |
360 pop_trash (server); | |
361 } | |
362 return (-1); | |
363 } | |
364 | |
79817
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
365 errno = 0; |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
366 *count = strtol (&fromserver[4], &end_ptr, 10); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
367 /* Check validity of string-to-integer conversion. */ |
79905
de27c7b1b268
(pop_stat, pop_last): Fix last fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
79817
diff
changeset
|
368 if (fromserver + 4 == end_ptr || *end_ptr != ' ' || errno) |
79817
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
369 { |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
370 strcpy (pop_error, "Unexpected response from POP server in pop_stat"); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
371 pop_trash (server); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
372 return (-1); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
373 } |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
374 |
79905
de27c7b1b268
(pop_stat, pop_last): Fix last fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
79817
diff
changeset
|
375 fromserver = end_ptr; |
9158 | 376 |
79817
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
377 errno = 0; |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
378 *size = strtol (fromserver + 1, &end_ptr, 10); |
79905
de27c7b1b268
(pop_stat, pop_last): Fix last fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
79817
diff
changeset
|
379 if (fromserver + 1 == end_ptr || errno) |
79817
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
380 { |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
381 strcpy (pop_error, "Unexpected response from POP server in pop_stat"); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
382 pop_trash (server); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
383 return (-1); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
384 } |
9158 | 385 |
386 return (0); | |
387 } | |
388 | |
389 /* | |
390 * Function: pop_list | |
391 * | |
392 * Purpose: Performs the POP "list" command and returns (in value | |
393 * parameters) two malloc'd zero-terminated arrays -- one of | |
394 * message IDs, and a parallel one of sizes. | |
395 * | |
396 * Arguments: | |
397 * server The pop connection to talk to. | |
398 * message The number of the one message about which to get | |
399 * information, or 0 to get information about all | |
400 * messages. | |
401 * | |
402 * Return value: 0 on success, non-zero with error in pop_error on | |
403 * failure. | |
404 * | |
405 * Side effects: On failure, may make further operations on the | |
406 * connection impossible. | |
407 */ | |
408 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
409 pop_list (popserver server, int message, int **IDs, int **sizes) |
9158 | 410 { |
411 int how_many, i; | |
412 char *fromserver; | |
413 | |
414 if (server->in_multi) | |
415 { | |
416 strcpy (pop_error, "In multi-line query in pop_list"); | |
417 return (-1); | |
418 } | |
419 | |
420 if (message) | |
421 how_many = 1; | |
422 else | |
423 { | |
424 int count, size; | |
425 if (pop_stat (server, &count, &size)) | |
426 return (-1); | |
427 how_many = count; | |
428 } | |
429 | |
430 *IDs = (int *) malloc ((how_many + 1) * sizeof (int)); | |
431 *sizes = (int *) malloc ((how_many + 1) * sizeof (int)); | |
432 if (! (*IDs && *sizes)) | |
433 { | |
434 strcpy (pop_error, "Out of memory in pop_list"); | |
435 return (-1); | |
436 } | |
437 | |
438 if (message) | |
439 { | |
440 sprintf (pop_error, "LIST %d", message); | |
441 if (sendline (server, pop_error)) | |
442 { | |
443 free ((char *) *IDs); | |
444 free ((char *) *sizes); | |
445 return (-1); | |
446 } | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
447 if (pop_getline (server, &fromserver) < 0) |
9158 | 448 { |
449 free ((char *) *IDs); | |
450 free ((char *) *sizes); | |
451 return (-1); | |
452 } | |
453 if (strncmp (fromserver, "+OK ", 4)) | |
454 { | |
455 if (! strncmp (fromserver, "-ERR", 4)) | |
456 strncpy (pop_error, fromserver, ERROR_MAX); | |
457 else | |
458 { | |
459 strcpy (pop_error, | |
460 "Unexpected response from server in pop_list"); | |
461 pop_trash (server); | |
462 } | |
463 free ((char *) *IDs); | |
464 free ((char *) *sizes); | |
465 return (-1); | |
466 } | |
467 (*IDs)[0] = atoi (&fromserver[4]); | |
109315
8f3464b85afb
Use strchr, strrchr instead of index, rindex
Andreas Schwab <schwab@linux-m68k.org>
parents:
109165
diff
changeset
|
468 fromserver = strchr (&fromserver[4], ' '); |
9158 | 469 if (! fromserver) |
470 { | |
471 strcpy (pop_error, | |
472 "Badly formatted response from server in pop_list"); | |
473 pop_trash (server); | |
474 free ((char *) *IDs); | |
475 free ((char *) *sizes); | |
476 return (-1); | |
477 } | |
478 (*sizes)[0] = atoi (fromserver); | |
479 (*IDs)[1] = (*sizes)[1] = 0; | |
480 return (0); | |
481 } | |
482 else | |
483 { | |
484 if (pop_multi_first (server, "LIST", &fromserver)) | |
485 { | |
486 free ((char *) *IDs); | |
487 free ((char *) *sizes); | |
488 return (-1); | |
489 } | |
490 for (i = 0; i < how_many; i++) | |
491 { | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
492 if (pop_multi_next (server, &fromserver) <= 0) |
9158 | 493 { |
494 free ((char *) *IDs); | |
495 free ((char *) *sizes); | |
496 return (-1); | |
497 } | |
498 (*IDs)[i] = atoi (fromserver); | |
109315
8f3464b85afb
Use strchr, strrchr instead of index, rindex
Andreas Schwab <schwab@linux-m68k.org>
parents:
109165
diff
changeset
|
499 fromserver = strchr (fromserver, ' '); |
9158 | 500 if (! fromserver) |
501 { | |
502 strcpy (pop_error, | |
503 "Badly formatted response from server in pop_list"); | |
504 free ((char *) *IDs); | |
505 free ((char *) *sizes); | |
506 pop_trash (server); | |
507 return (-1); | |
508 } | |
509 (*sizes)[i] = atoi (fromserver); | |
510 } | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
511 if (pop_multi_next (server, &fromserver) < 0) |
9158 | 512 { |
513 free ((char *) *IDs); | |
514 free ((char *) *sizes); | |
515 return (-1); | |
516 } | |
517 else if (fromserver) | |
518 { | |
519 strcpy (pop_error, | |
520 "Too many response lines from server in pop_list"); | |
521 free ((char *) *IDs); | |
522 free ((char *) *sizes); | |
523 return (-1); | |
524 } | |
525 (*IDs)[i] = (*sizes)[i] = 0; | |
526 return (0); | |
527 } | |
528 } | |
529 | |
530 /* | |
531 * Function: pop_retrieve | |
532 * | |
533 * Purpose: Retrieve a specified message from the maildrop. | |
534 * | |
535 * Arguments: | |
536 * server The server to retrieve from. | |
537 * message The message number to retrieve. | |
538 * markfrom | |
539 * If true, then mark the string "From " at the beginning | |
540 * of lines with '>'. | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
541 * msg_buf Output parameter to which a buffer containing the |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
542 * message is assigned. |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49053
diff
changeset
|
543 * |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
544 * Return value: The number of bytes in msg_buf, which may contain |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
545 * embedded nulls, not including its final null, or -1 on error |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
546 * with pop_error set. |
9158 | 547 * |
548 * Side effects: May kill connection on error. | |
549 */ | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
550 int |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
551 pop_retrieve (popserver server, int message, int markfrom, char **msg_buf) |
9158 | 552 { |
553 int *IDs, *sizes, bufsize, fromcount = 0, cp = 0; | |
554 char *ptr, *fromserver; | |
555 int ret; | |
556 | |
557 if (server->in_multi) | |
558 { | |
559 strcpy (pop_error, "In multi-line query in pop_retrieve"); | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
560 return (-1); |
9158 | 561 } |
562 | |
563 if (pop_list (server, message, &IDs, &sizes)) | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
564 return (-1); |
9158 | 565 |
566 if (pop_retrieve_first (server, message, &fromserver)) | |
567 { | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
568 return (-1); |
9158 | 569 } |
570 | |
571 /* | |
572 * The "5" below is an arbitrary constant -- I assume that if | |
573 * there are "From" lines in the text to be marked, there | |
574 * probably won't be more than 5 of them. If there are, I | |
575 * allocate more space for them below. | |
576 */ | |
577 bufsize = sizes[0] + (markfrom ? 5 : 0); | |
14238
b55e97028105
(pop_retrieve, getline): Avoid type clashes.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
578 ptr = (char *)malloc (bufsize); |
9158 | 579 free ((char *) IDs); |
580 free ((char *) sizes); | |
581 | |
582 if (! ptr) | |
583 { | |
584 strcpy (pop_error, "Out of memory in pop_retrieve"); | |
585 pop_retrieve_flush (server); | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
586 return (-1); |
9158 | 587 } |
588 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
589 while ((ret = pop_retrieve_next (server, &fromserver)) >= 0) |
9158 | 590 { |
591 if (! fromserver) | |
592 { | |
593 ptr[cp] = '\0'; | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
594 *msg_buf = ptr; |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
595 return (cp); |
9158 | 596 } |
597 if (markfrom && fromserver[0] == 'F' && fromserver[1] == 'r' && | |
598 fromserver[2] == 'o' && fromserver[3] == 'm' && | |
599 fromserver[4] == ' ') | |
600 { | |
601 if (++fromcount == 5) | |
602 { | |
603 bufsize += 5; | |
14238
b55e97028105
(pop_retrieve, getline): Avoid type clashes.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
604 ptr = (char *)realloc (ptr, bufsize); |
9158 | 605 if (! ptr) |
606 { | |
607 strcpy (pop_error, "Out of memory in pop_retrieve"); | |
608 pop_retrieve_flush (server); | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
609 return (-1); |
9158 | 610 } |
611 fromcount = 0; | |
612 } | |
613 ptr[cp++] = '>'; | |
614 } | |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109111
diff
changeset
|
615 memcpy (&ptr[cp], fromserver, ret); |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
616 cp += ret; |
9158 | 617 ptr[cp++] = '\n'; |
618 } | |
619 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
620 free (ptr); |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
621 return (-1); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49053
diff
changeset
|
622 } |
9158 | 623 |
624 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
625 pop_retrieve_first (popserver server, int message, char **response) |
9158 | 626 { |
627 sprintf (pop_error, "RETR %d", message); | |
628 return (pop_multi_first (server, pop_error, response)); | |
629 } | |
630 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
631 /* |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
632 Returns a negative number on error, 0 to indicate that the data has |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
633 all been read (i.e., the server has returned a "." termination |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
634 line), or a positive number indicating the number of bytes in the |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
635 returned buffer (which is null-terminated and may contain embedded |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
636 nulls, but the returned bytecount doesn't include the final null). |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
637 */ |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
638 |
9158 | 639 int |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
640 pop_retrieve_next (popserver server, char **line) |
9158 | 641 { |
642 return (pop_multi_next (server, line)); | |
643 } | |
644 | |
645 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
646 pop_retrieve_flush (popserver server) |
9158 | 647 { |
648 return (pop_multi_flush (server)); | |
649 } | |
650 | |
651 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
652 pop_top_first (popserver server, int message, int lines, char **response) |
9158 | 653 { |
654 sprintf (pop_error, "TOP %d %d", message, lines); | |
655 return (pop_multi_first (server, pop_error, response)); | |
656 } | |
657 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
658 /* |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
659 Returns a negative number on error, 0 to indicate that the data has |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
660 all been read (i.e., the server has returned a "." termination |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
661 line), or a positive number indicating the number of bytes in the |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
662 returned buffer (which is null-terminated and may contain embedded |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
663 nulls, but the returned bytecount doesn't include the final null). |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
664 */ |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
665 |
9158 | 666 int |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
667 pop_top_next (popserver server, char **line) |
9158 | 668 { |
669 return (pop_multi_next (server, line)); | |
670 } | |
671 | |
672 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
673 pop_top_flush (popserver server) |
9158 | 674 { |
675 return (pop_multi_flush (server)); | |
676 } | |
677 | |
678 int | |
109744
fdbd24f8d999
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
Jan D <jan.h.d@swipnet.se>
parents:
109315
diff
changeset
|
679 pop_multi_first (popserver server, const char *command, char **response) |
9158 | 680 { |
681 if (server->in_multi) | |
682 { | |
683 strcpy (pop_error, | |
684 "Already in multi-line query in pop_multi_first"); | |
685 return (-1); | |
686 } | |
687 | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
688 if (sendline (server, command) || (pop_getline (server, response) < 0)) |
9158 | 689 { |
690 return (-1); | |
691 } | |
692 | |
693 if (0 == strncmp (*response, "-ERR", 4)) | |
694 { | |
695 strncpy (pop_error, *response, ERROR_MAX); | |
696 return (-1); | |
697 } | |
698 else if (0 == strncmp (*response, "+OK", 3)) | |
699 { | |
700 for (*response += 3; **response == ' '; (*response)++) /* empty */; | |
701 server->in_multi = 1; | |
702 return (0); | |
703 } | |
704 else | |
705 { | |
706 strcpy (pop_error, | |
707 "Unexpected response from server in pop_multi_first"); | |
708 return (-1); | |
709 } | |
710 } | |
711 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
712 /* |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
713 Read the next line of data from SERVER and place a pointer to it |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
714 into LINE. Return -1 on error, 0 if there are no more lines to read |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
715 (i.e., the server has returned a line containing only "."), or a |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
716 positive number indicating the number of bytes in the LINE buffer |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
717 (not including the final null). The data in that buffer may contain |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
718 embedded nulls, but does not contain the final CRLF. When returning |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
719 0, LINE is set to null. */ |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
720 |
9158 | 721 int |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
722 pop_multi_next (popserver server, char **line) |
9158 | 723 { |
724 char *fromserver; | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
725 int ret; |
9158 | 726 |
727 if (! server->in_multi) | |
728 { | |
729 strcpy (pop_error, "Not in multi-line query in pop_multi_next"); | |
730 return (-1); | |
731 } | |
732 | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
733 if ((ret = pop_getline (server, &fromserver)) < 0) |
9158 | 734 { |
735 return (-1); | |
736 } | |
737 | |
738 if (fromserver[0] == '.') | |
739 { | |
740 if (! fromserver[1]) | |
741 { | |
742 *line = 0; | |
743 server->in_multi = 0; | |
744 return (0); | |
745 } | |
746 else | |
747 { | |
748 *line = fromserver + 1; | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
749 return (ret - 1); |
9158 | 750 } |
751 } | |
752 else | |
753 { | |
754 *line = fromserver; | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
755 return (ret); |
9158 | 756 } |
757 } | |
758 | |
759 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
760 pop_multi_flush (popserver server) |
9158 | 761 { |
762 char *line; | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
763 int ret; |
9158 | 764 |
765 if (! server->in_multi) | |
766 { | |
767 return (0); | |
768 } | |
769 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
770 while ((ret = pop_multi_next (server, &line))) |
9158 | 771 { |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
772 if (ret < 0) |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
773 return (-1); |
9158 | 774 } |
775 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
776 return (0); |
9158 | 777 } |
778 | |
779 /* Function: pop_delete | |
780 * | |
781 * Purpose: Delete a specified message. | |
782 * | |
783 * Arguments: | |
784 * server Server from which to delete the message. | |
785 * message Message to delete. | |
786 * | |
787 * Return value: 0 on success, non-zero with error in pop_error | |
788 * otherwise. | |
789 */ | |
790 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
791 pop_delete (popserver server, int message) |
9158 | 792 { |
793 if (server->in_multi) | |
794 { | |
795 strcpy (pop_error, "In multi-line query in pop_delete"); | |
796 return (-1); | |
797 } | |
798 | |
799 sprintf (pop_error, "DELE %d", message); | |
800 | |
801 if (sendline (server, pop_error) || getok (server)) | |
802 return (-1); | |
803 | |
804 return (0); | |
805 } | |
806 | |
807 /* | |
808 * Function: pop_noop | |
809 * | |
810 * Purpose: Send a noop command to the server. | |
811 * | |
812 * Argument: | |
813 * server The server to send to. | |
814 * | |
815 * Return value: 0 on success, non-zero with error in pop_error | |
816 * otherwise. | |
817 * | |
818 * Side effects: Closes connection on error. | |
819 */ | |
820 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
821 pop_noop (popserver server) |
9158 | 822 { |
823 if (server->in_multi) | |
824 { | |
825 strcpy (pop_error, "In multi-line query in pop_noop"); | |
826 return (-1); | |
827 } | |
828 | |
829 if (sendline (server, "NOOP") || getok (server)) | |
830 return (-1); | |
831 | |
832 return (0); | |
833 } | |
834 | |
835 /* | |
836 * Function: pop_last | |
837 * | |
838 * Purpose: Find out the highest seen message from the server. | |
839 * | |
840 * Arguments: | |
841 * server The server. | |
842 * | |
843 * Return value: If successful, the highest seen message, which is | |
844 * greater than or equal to 0. Otherwise, a negative number with | |
845 * the error explained in pop_error. | |
846 * | |
847 * Side effects: Closes the connection on error. | |
848 */ | |
849 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
850 pop_last (popserver server) |
9158 | 851 { |
852 char *fromserver; | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
853 |
9158 | 854 if (server->in_multi) |
855 { | |
856 strcpy (pop_error, "In multi-line query in pop_last"); | |
857 return (-1); | |
858 } | |
859 | |
860 if (sendline (server, "LAST")) | |
861 return (-1); | |
862 | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
863 if (pop_getline (server, &fromserver) < 0) |
9158 | 864 return (-1); |
865 | |
866 if (! strncmp (fromserver, "-ERR", 4)) | |
867 { | |
868 strncpy (pop_error, fromserver, ERROR_MAX); | |
869 return (-1); | |
870 } | |
871 else if (strncmp (fromserver, "+OK ", 4)) | |
872 { | |
873 strcpy (pop_error, "Unexpected response from server in pop_last"); | |
874 pop_trash (server); | |
875 return (-1); | |
876 } | |
877 else | |
878 { | |
79817
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
879 char *end_ptr; |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
880 int count; |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
881 errno = 0; |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
882 count = strtol (&fromserver[4], &end_ptr, 10); |
79905
de27c7b1b268
(pop_stat, pop_last): Fix last fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
79817
diff
changeset
|
883 if (fromserver + 4 == end_ptr || errno) |
79817
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
884 { |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
885 strcpy (pop_error, "Unexpected response from server in pop_last"); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
886 pop_trash (server); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
887 return (-1); |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
888 } |
dd778207ebb2
(pop_stat, pop_last): Check validity of string-to-integer
Chong Yidong <cyd@stupidchicken.com>
parents:
79748
diff
changeset
|
889 return count; |
9158 | 890 } |
891 } | |
892 | |
893 /* | |
894 * Function: pop_reset | |
895 * | |
896 * Purpose: Reset the server to its initial connect state | |
897 * | |
898 * Arguments: | |
899 * server The server. | |
900 * | |
901 * Return value: 0 for success, non-0 with error in pop_error | |
902 * otherwise. | |
903 * | |
904 * Side effects: Closes the connection on error. | |
905 */ | |
906 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
907 pop_reset (popserver server) |
9158 | 908 { |
909 if (pop_retrieve_flush (server)) | |
910 { | |
911 return (-1); | |
912 } | |
913 | |
914 if (sendline (server, "RSET") || getok (server)) | |
915 return (-1); | |
916 | |
917 return (0); | |
918 } | |
919 | |
920 /* | |
921 * Function: pop_quit | |
922 * | |
923 * Purpose: Quit the connection to the server, | |
924 * | |
925 * Arguments: | |
926 * server The server to quit. | |
927 * | |
928 * Return value: 0 for success, non-zero otherwise with error in | |
929 * pop_error. | |
930 * | |
14036 | 931 * Side Effects: The popserver passed in is unusable after this |
9158 | 932 * function is called, even if an error occurs. |
933 */ | |
934 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
935 pop_quit (popserver server) |
9158 | 936 { |
937 int ret = 0; | |
938 | |
939 if (server->file >= 0) | |
940 { | |
941 if (pop_retrieve_flush (server)) | |
942 { | |
943 ret = -1; | |
944 } | |
945 | |
946 if (sendline (server, "QUIT") || getok (server)) | |
947 { | |
948 ret = -1; | |
949 } | |
950 | |
951 close (server->file); | |
952 } | |
953 | |
95479
9588c3703f38
remove useless if-before-free tests
Jim Meyering <jim@meyering.net>
parents:
94828
diff
changeset
|
954 free (server->buffer); |
9158 | 955 free ((char *) server); |
956 | |
957 return (ret); | |
958 } | |
959 | |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
960 #ifdef WINDOWSNT |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
961 static int have_winsock = 0; |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
962 #endif |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
963 |
9158 | 964 /* |
965 * Function: socket_connection | |
966 * | |
967 * Purpose: Opens the network connection with the mail host, without | |
968 * doing any sort of I/O with it or anything. | |
969 * | |
970 * Arguments: | |
971 * host The host to which to connect. | |
972 * flags Option flags. | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
973 * |
9158 | 974 * Return value: A file descriptor indicating the connection, or -1 |
975 * indicating failure, in which case an error has been copied | |
976 * into pop_error. | |
977 */ | |
978 static int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
979 socket_connection (char *host, int flags) |
9158 | 980 { |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
981 #ifdef HAVE_GETADDRINFO |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
982 struct addrinfo *res, *it; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
983 struct addrinfo hints; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
984 int ret; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
985 #else /* !HAVE_GETADDRINFO */ |
9158 | 986 struct hostent *hostent; |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
987 #endif |
9158 | 988 struct servent *servent; |
989 struct sockaddr_in addr; | |
990 char found_port = 0; | |
109744
fdbd24f8d999
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
Jan D <jan.h.d@swipnet.se>
parents:
109315
diff
changeset
|
991 const char *service; |
9158 | 992 int sock; |
86235
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
993 char *realhost; |
9158 | 994 #ifdef KERBEROS |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
995 #ifdef KERBEROS5 |
9158 | 996 krb5_error_code rem; |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
997 krb5_context kcontext = 0; |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
998 krb5_auth_context auth_context = 0; |
9158 | 999 krb5_ccache ccdef; |
1000 krb5_principal client, server; | |
1001 krb5_error *err_ret; | |
1002 register char *cp; | |
1003 #else | |
1004 KTEXT ticket; | |
1005 MSG_DAT msg_data; | |
1006 CREDENTIALS cred; | |
1007 Key_schedule schedule; | |
1008 int rem; | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1009 #endif /* KERBEROS5 */ |
9158 | 1010 #endif /* KERBEROS */ |
1011 | |
1012 int try_count = 0; | |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1013 int connect_ok; |
9158 | 1014 |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1015 #ifdef WINDOWSNT |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1016 { |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1017 WSADATA winsockData; |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1018 if (WSAStartup (0x101, &winsockData) == 0) |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1019 have_winsock = 1; |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1020 } |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1021 #endif |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1022 |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109111
diff
changeset
|
1023 memset (&addr, 0, sizeof (addr)); |
9158 | 1024 addr.sin_family = AF_INET; |
1025 | |
70857
d2542ee8a5c9
(pop_open, socket_connection, KPOP_SERVICE): Added
Francesco Potortì <pot@gnu.org>
parents:
68647
diff
changeset
|
1026 /** "kpop" service is never used: look for 20060515 to see why **/ |
9158 | 1027 #ifdef KERBEROS |
1028 service = (flags & POP_NO_KERBEROS) ? POP_SERVICE : KPOP_SERVICE; | |
1029 #else | |
1030 service = POP_SERVICE; | |
1031 #endif | |
1032 | |
1033 #ifdef HESIOD | |
1034 if (! (flags & POP_NO_HESIOD)) | |
1035 { | |
1036 servent = hes_getservbyname (service, "tcp"); | |
1037 if (servent) | |
1038 { | |
1039 addr.sin_port = servent->s_port; | |
1040 found_port = 1; | |
1041 } | |
1042 } | |
1043 #endif | |
1044 if (! found_port) | |
1045 { | |
1046 servent = getservbyname (service, "tcp"); | |
1047 if (servent) | |
1048 { | |
1049 addr.sin_port = servent->s_port; | |
1050 } | |
1051 else | |
1052 { | |
70857
d2542ee8a5c9
(pop_open, socket_connection, KPOP_SERVICE): Added
Francesco Potortì <pot@gnu.org>
parents:
68647
diff
changeset
|
1053 /** "kpop" service is never used: look for 20060515 to see why **/ |
9158 | 1054 #ifdef KERBEROS |
1055 addr.sin_port = htons ((flags & POP_NO_KERBEROS) ? | |
1056 POP_PORT : KPOP_PORT); | |
1057 #else | |
1058 addr.sin_port = htons (POP_PORT); | |
1059 #endif | |
1060 } | |
1061 } | |
1062 | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1063 #define POP_SOCKET_ERROR "Could not create socket for POP connection: " |
9158 | 1064 |
1065 sock = socket (PF_INET, SOCK_STREAM, 0); | |
1066 if (sock < 0) | |
1067 { | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1068 strcpy (pop_error, POP_SOCKET_ERROR); |
9158 | 1069 strncat (pop_error, strerror (errno), |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1070 ERROR_MAX - sizeof (POP_SOCKET_ERROR)); |
9158 | 1071 return (-1); |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1072 |
9158 | 1073 } |
1074 | |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1075 #ifdef HAVE_GETADDRINFO |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1076 memset (&hints, 0, sizeof(hints)); |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1077 hints.ai_socktype = SOCK_STREAM; |
86504
8b582ee742ce
(socket_connection): Remove AI_ADDRCONFIG.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86235
diff
changeset
|
1078 hints.ai_flags = AI_CANONNAME; |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1079 hints.ai_family = AF_INET; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1080 do |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1081 { |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1082 ret = getaddrinfo (host, service, &hints, &res); |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1083 try_count++; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1084 if (ret != 0 && (ret != EAI_AGAIN || try_count == 5)) |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1085 { |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1086 strcpy (pop_error, "Could not determine POP server's address"); |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1087 return (-1); |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1088 } |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1089 } while (ret != 0); |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1090 |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1091 if (ret == 0) |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1092 { |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1093 it = res; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1094 while (it) |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1095 { |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1096 if (it->ai_addrlen == sizeof (addr)) |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1097 { |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1098 struct sockaddr_in *in_a = (struct sockaddr_in *) it->ai_addr; |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109111
diff
changeset
|
1099 memcpy (&addr.sin_addr, &in_a->sin_addr, sizeof (addr.sin_addr)); |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1100 if (! connect (sock, (struct sockaddr *) &addr, sizeof (addr))) |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1101 break; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1102 } |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1103 it = it->ai_next; |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1104 } |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1105 connect_ok = it != NULL; |
86235
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1106 if (connect_ok) |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1107 { |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1108 realhost = alloca (strlen (it->ai_canonname) + 1); |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1109 strcpy (realhost, it->ai_canonname); |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1110 } |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1111 freeaddrinfo (res); |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1112 } |
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1113 #else /* !HAVE_GETADDRINFO */ |
45328
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1114 do |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1115 { |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1116 hostent = gethostbyname (host); |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1117 try_count++; |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1118 if ((! hostent) && ((h_errno != TRY_AGAIN) || (try_count == 5))) |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1119 { |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1120 strcpy (pop_error, "Could not determine POP server's address"); |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1121 return (-1); |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1122 } |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1123 } while (! hostent); |
cbcc456b9a76
(socket_connection): Move the code to resolve the POP
Eli Zaretskii <eliz@gnu.org>
parents:
42439
diff
changeset
|
1124 |
9158 | 1125 while (*hostent->h_addr_list) |
1126 { | |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109111
diff
changeset
|
1127 memcpy (&addr.sin_addr, *hostent->h_addr_list, hostent->h_length); |
9158 | 1128 if (! connect (sock, (struct sockaddr *) &addr, sizeof (addr))) |
1129 break; | |
1130 hostent->h_addr_list++; | |
1131 } | |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1132 connect_ok = *hostent->h_addr_list != NULL; |
86235
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1133 if (! connect_ok) |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1134 { |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1135 realhost = alloca (strlen (hostent->h_name) + 1); |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1136 strcpy (realhost, hostent->h_name); |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1137 } |
79cf32b82b23
(socket_connection): Move realhost out of #ifdefs.
Jan Djärv <jan.h.d@swipnet.se>
parents:
86210
diff
changeset
|
1138 |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1139 #endif /* !HAVE_GETADDRINFO */ |
9158 | 1140 |
1141 #define CONNECT_ERROR "Could not connect to POP server: " | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1142 |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1143 if (! connect_ok) |
9158 | 1144 { |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
1145 CLOSESOCKET (sock); |
9158 | 1146 strcpy (pop_error, CONNECT_ERROR); |
1147 strncat (pop_error, strerror (errno), | |
1148 ERROR_MAX - sizeof (CONNECT_ERROR)); | |
1149 return (-1); | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1150 |
9158 | 1151 } |
1152 | |
1153 #ifdef KERBEROS | |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1154 |
9158 | 1155 #define KRB_ERROR "Kerberos error connecting to POP server: " |
1156 if (! (flags & POP_NO_KERBEROS)) | |
1157 { | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1158 #ifdef KERBEROS5 |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1159 if ((rem = krb5_init_context (&kcontext))) |
9158 | 1160 { |
1161 krb5error: | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1162 if (auth_context) |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1163 krb5_auth_con_free (kcontext, auth_context); |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1164 if (kcontext) |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1165 krb5_free_context (kcontext); |
9158 | 1166 strcpy (pop_error, KRB_ERROR); |
1167 strncat (pop_error, error_message (rem), | |
1168 ERROR_MAX - sizeof(KRB_ERROR)); | |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
1169 CLOSESOCKET (sock); |
9158 | 1170 return (-1); |
1171 } | |
1172 | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1173 if ((rem = krb5_auth_con_init (kcontext, &auth_context))) |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1174 goto krb5error; |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1175 |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1176 if (rem = krb5_cc_default (kcontext, &ccdef)) |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1177 goto krb5error; |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1178 |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1179 if (rem = krb5_cc_get_principal (kcontext, ccdef, &client)) |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1180 goto krb5error; |
9158 | 1181 |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1182 for (cp = realhost; *cp; cp++) |
9158 | 1183 { |
1184 if (isupper (*cp)) | |
1185 { | |
1186 *cp = tolower (*cp); | |
1187 } | |
1188 } | |
1189 | |
86210
7ae58179773b
(socket_connection): Use getaddrinfo if available.
Jan Djärv <jan.h.d@swipnet.se>
parents:
78257
diff
changeset
|
1190 if (rem = krb5_sname_to_principal (kcontext, realhost, |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1191 POP_SERVICE, FALSE, &server)) |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1192 goto krb5error; |
9158 | 1193 |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1194 rem = krb5_sendauth (kcontext, &auth_context, |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1195 (krb5_pointer) &sock, "KPOPV1.0", client, server, |
9158 | 1196 AP_OPTS_MUTUAL_REQUIRED, |
1197 0, /* no checksum */ | |
1198 0, /* no creds, use ccache instead */ | |
1199 ccdef, | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1200 &err_ret, |
9158 | 1201 0, /* don't need subsession key */ |
1202 0); /* don't need reply */ | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1203 krb5_free_principal (kcontext, server); |
9158 | 1204 if (rem) |
1205 { | |
97309
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1206 strcpy (pop_error, KRB_ERROR); |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1207 strncat (pop_error, error_message (rem), |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1208 ERROR_MAX - sizeof (KRB_ERROR)); |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1209 #if defined HAVE_KRB5_ERROR_TEXT |
9158 | 1210 if (err_ret && err_ret->text.length) |
1211 { | |
1212 strncat (pop_error, " [server says '", | |
1213 ERROR_MAX - strlen (pop_error) - 1); | |
1214 strncat (pop_error, err_ret->text.data, | |
1215 min (ERROR_MAX - strlen (pop_error) - 1, | |
1216 err_ret->text.length)); | |
1217 strncat (pop_error, "']", | |
1218 ERROR_MAX - strlen (pop_error) - 1); | |
1219 } | |
97309
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1220 #elif defined HAVE_KRB5_ERROR_E_TEXT |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1221 if (err_ret && err_ret->e_text && strlen(*err_ret->e_text)) |
9158 | 1222 { |
97309
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1223 strncat (pop_error, " [server says '", |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1224 ERROR_MAX - strlen (pop_error) - 1); |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1225 strncat (pop_error, *err_ret->e_text, |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1226 ERROR_MAX - strlen (pop_error) - 1); |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1227 strncat (pop_error, "']", |
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1228 ERROR_MAX - strlen (pop_error) - 1); |
9158 | 1229 } |
97309
9e7bd13d8b05
(socket_connection): Add conditionals for HAVE_KRB5_ERROR_TEXT and
Chong Yidong <cyd@stupidchicken.com>
parents:
95479
diff
changeset
|
1230 #endif |
9158 | 1231 if (err_ret) |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1232 krb5_free_error (kcontext, err_ret); |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1233 krb5_auth_con_free (kcontext, auth_context); |
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1234 krb5_free_context (kcontext); |
9158 | 1235 |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
1236 CLOSESOCKET (sock); |
9158 | 1237 return (-1); |
1238 } | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1239 #else /* ! KERBEROS5 */ |
9158 | 1240 ticket = (KTEXT) malloc (sizeof (KTEXT_ST)); |
16603
a12b8815bcf0
gethostbyname() may return a pointer to static data, which is
Charles Hannum <mycroft@gnu.org>
parents:
15934
diff
changeset
|
1241 rem = krb_sendauth (0L, sock, ticket, "pop", realhost, |
a12b8815bcf0
gethostbyname() may return a pointer to static data, which is
Charles Hannum <mycroft@gnu.org>
parents:
15934
diff
changeset
|
1242 (char *) krb_realmofhost (realhost), |
9158 | 1243 (unsigned long) 0, &msg_data, &cred, schedule, |
1244 (struct sockaddr_in *) 0, | |
1245 (struct sockaddr_in *) 0, | |
1246 "KPOPV0.1"); | |
1247 free ((char *) ticket); | |
1248 if (rem != KSUCCESS) | |
1249 { | |
1250 strcpy (pop_error, KRB_ERROR); | |
1251 strncat (pop_error, krb_err_txt[rem], | |
1252 ERROR_MAX - sizeof (KRB_ERROR)); | |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
1253 CLOSESOCKET (sock); |
9158 | 1254 return (-1); |
1255 } | |
19018
f1f7c254aa77
Support auto-configuration of both Kerberos V4 and
Richard M. Stallman <rms@gnu.org>
parents:
17683
diff
changeset
|
1256 #endif /* KERBEROS5 */ |
9158 | 1257 } |
1258 #endif /* KERBEROS */ | |
1259 | |
1260 return (sock); | |
1261 } /* socket_connection */ | |
1262 | |
1263 /* | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
1264 * Function: pop_getline |
9158 | 1265 * |
1266 * Purpose: Get a line of text from the connection and return a | |
1267 * pointer to it. The carriage return and linefeed at the end of | |
1268 * the line are stripped, but periods at the beginnings of lines | |
1269 * are NOT dealt with in any special way. | |
1270 * | |
1271 * Arguments: | |
1272 * server The server from which to get the line of text. | |
1273 * | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1274 * Returns: The number of characters in the line, which is returned in |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1275 * LINE, not including the final null. A return value of 0 |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1276 * indicates a blank line. A negative return value indicates an |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1277 * error (in which case the contents of LINE are undefined. In |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1278 * case of error, an error message is copied into pop_error. |
9158 | 1279 * |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
1280 * Notes: The line returned is overwritten with each call to pop_getline. |
9158 | 1281 * |
1282 * Side effects: Closes the connection on error. | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1283 * |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1284 * THE RETURNED LINE MAY CONTAIN EMBEDDED NULLS! |
9158 | 1285 */ |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1286 static int |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
1287 pop_getline (popserver server, char **line) |
9158 | 1288 { |
1289 #define GETLINE_ERROR "Error reading from server: " | |
1290 | |
1291 int ret; | |
9674
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1292 int search_offset = 0; |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1293 |
9158 | 1294 if (server->data) |
1295 { | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1296 char *cp = find_crlf (server->buffer + server->buffer_index, |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1297 server->data); |
9158 | 1298 if (cp) |
1299 { | |
1300 int found; | |
1301 int data_used; | |
1302 | |
1303 found = server->buffer_index; | |
1304 data_used = (cp + 2) - server->buffer - found; | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1305 |
9158 | 1306 *cp = '\0'; /* terminate the string to be returned */ |
1307 server->data -= data_used; | |
1308 server->buffer_index += data_used; | |
1309 | |
1310 if (pop_debug) | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1311 /* Embedded nulls will truncate this output prematurely, |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1312 but that's OK because it's just for debugging anyway. */ |
9158 | 1313 fprintf (stderr, "<<< %s\n", server->buffer + found); |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1314 *line = server->buffer + found; |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1315 return (data_used - 2); |
9158 | 1316 } |
1317 else | |
1318 { | |
109165
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109111
diff
changeset
|
1319 memmove (server->buffer, server->buffer + server->buffer_index, |
750db9f3e6d8
Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents:
109111
diff
changeset
|
1320 server->data); |
9674
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1321 /* Record the fact that we've searched the data already in |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1322 the buffer for a CRLF, so that when we search below, we |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1323 don't have to search the same data twice. There's a "- |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1324 1" here to account for the fact that the last character |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1325 of the data we have may be the CR of a CRLF pair, of |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1326 which we haven't read the second half yet, so we may have |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1327 to search it again when we read more data. */ |
e5a897cf215d
(getline): When a search of already-read input for CRLF
Richard M. Stallman <rms@gnu.org>
parents:
9613
diff
changeset
|
1328 search_offset = server->data - 1; |
9158 | 1329 server->buffer_index = 0; |
1330 } | |
1331 } | |
1332 else | |
1333 { | |
1334 server->buffer_index = 0; | |
1335 } | |
1336 | |
1337 while (1) | |
1338 { | |
22236 | 1339 /* There's a "- 1" here to leave room for the null that we put |
1340 at the end of the read data below. We put the null there so | |
1341 that find_crlf knows where to stop when we call it. */ | |
1342 if (server->data == server->buffer_size - 1) | |
9158 | 1343 { |
22236 | 1344 server->buffer_size += GETLINE_INCR; |
1345 server->buffer = (char *)realloc (server->buffer, server->buffer_size); | |
1346 if (! server->buffer) | |
9158 | 1347 { |
22236 | 1348 strcpy (pop_error, "Out of memory in pop_getline"); |
1349 pop_trash (server); | |
1350 return (-1); | |
9158 | 1351 } |
1352 } | |
22236 | 1353 ret = RECV (server->file, server->buffer + server->data, |
1354 server->buffer_size - server->data - 1, 0); | |
9158 | 1355 if (ret < 0) |
1356 { | |
1357 strcpy (pop_error, GETLINE_ERROR); | |
1358 strncat (pop_error, strerror (errno), | |
1359 ERROR_MAX - sizeof (GETLINE_ERROR)); | |
1360 pop_trash (server); | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1361 return (-1); |
9158 | 1362 } |
1363 else if (ret == 0) | |
1364 { | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
1365 strcpy (pop_error, "Unexpected EOF from server in pop_getline"); |
9158 | 1366 pop_trash (server); |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1367 return (-1); |
9158 | 1368 } |
1369 else | |
1370 { | |
9591
0774e217e8aa
Don't declare malloc, realloc, free.
Richard M. Stallman <rms@gnu.org>
parents:
9158
diff
changeset
|
1371 char *cp; |
9158 | 1372 server->data += ret; |
9591
0774e217e8aa
Don't declare malloc, realloc, free.
Richard M. Stallman <rms@gnu.org>
parents:
9158
diff
changeset
|
1373 server->buffer[server->data] = '\0'; |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1374 |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1375 cp = find_crlf (server->buffer + search_offset, |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1376 server->data - search_offset); |
9158 | 1377 if (cp) |
1378 { | |
1379 int data_used = (cp + 2) - server->buffer; | |
1380 *cp = '\0'; | |
1381 server->data -= data_used; | |
1382 server->buffer_index = data_used; | |
1383 | |
1384 if (pop_debug) | |
1385 fprintf (stderr, "<<< %s\n", server->buffer); | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1386 *line = server->buffer; |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1387 return (data_used - 2); |
9158 | 1388 } |
17683
975d093d45fb
(getline): Don't miss CRLF pairs when the CR and LF are
Richard M. Stallman <rms@gnu.org>
parents:
16697
diff
changeset
|
1389 /* As above, the "- 1" here is to account for the fact that |
975d093d45fb
(getline): Don't miss CRLF pairs when the CR and LF are
Richard M. Stallman <rms@gnu.org>
parents:
16697
diff
changeset
|
1390 we may have read a CR without its accompanying LF. */ |
975d093d45fb
(getline): Don't miss CRLF pairs when the CR and LF are
Richard M. Stallman <rms@gnu.org>
parents:
16697
diff
changeset
|
1391 search_offset += ret - 1; |
9158 | 1392 } |
1393 } | |
1394 | |
1395 /* NOTREACHED */ | |
1396 } | |
1397 | |
1398 /* | |
1399 * Function: sendline | |
1400 * | |
1401 * Purpose: Sends a line of text to the POP server. The line of text | |
1402 * passed into this function should NOT have the carriage return | |
1403 * and linefeed on the end of it. Periods at beginnings of lines | |
1404 * will NOT be treated specially by this function. | |
1405 * | |
1406 * Arguments: | |
1407 * server The server to which to send the text. | |
1408 * line The line of text to send. | |
1409 * | |
1410 * Return value: Upon successful completion, a value of 0 will be | |
1411 * returned. Otherwise, a non-zero value will be returned, and | |
1412 * an error will be copied into pop_error. | |
1413 * | |
1414 * Side effects: Closes the connection on error. | |
1415 */ | |
1416 static int | |
109744
fdbd24f8d999
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
Jan D <jan.h.d@swipnet.se>
parents:
109315
diff
changeset
|
1417 sendline (popserver server, const char *line) |
9158 | 1418 { |
1419 #define SENDLINE_ERROR "Error writing to POP server: " | |
1420 int ret; | |
64293
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1421 char *buf; |
9158 | 1422 |
64293
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1423 /* Combine the string and the CR-LF into one buffer. Otherwise, two |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1424 reasonable network stack optimizations, Nagle's algorithm and |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1425 delayed acks, combine to delay us a fraction of a second on every |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1426 message we send. (Movemail writes line without \r\n, client |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1427 kernel sends packet, server kernel delays the ack to see if it |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1428 can combine it with data, movemail writes \r\n, client kernel |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1429 waits because it has unacked data already in its outgoing queue, |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1430 client kernel eventually times out and sends.) |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1431 |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1432 This can be something like 0.2s per command, which can add up |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1433 over a few dozen messages, and is a big chunk of the time we |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1434 spend fetching mail from a server close by. */ |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1435 buf = alloca (strlen (line) + 3); |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1436 strcpy (buf, line); |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1437 strcat (buf, "\r\n"); |
0238a53b950b
Don't include des.h (or variants thereof); krb.h will do it.
Ken Raeburn <raeburn@raeburn.org>
parents:
64083
diff
changeset
|
1438 ret = fullwrite (server->file, buf, strlen (buf)); |
9158 | 1439 |
1440 if (ret < 0) | |
1441 { | |
1442 pop_trash (server); | |
1443 strcpy (pop_error, SENDLINE_ERROR); | |
1444 strncat (pop_error, strerror (errno), | |
1445 ERROR_MAX - sizeof (SENDLINE_ERROR)); | |
1446 return (ret); | |
1447 } | |
1448 | |
1449 if (pop_debug) | |
1450 fprintf (stderr, ">>> %s\n", line); | |
1451 | |
1452 return (0); | |
1453 } | |
1454 | |
1455 /* | |
1456 * Procedure: fullwrite | |
1457 * | |
1458 * Purpose: Just like write, but keeps trying until the entire string | |
1459 * has been written. | |
1460 * | |
1461 * Return value: Same as write. Pop_error is not set. | |
1462 */ | |
1463 static int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
1464 fullwrite (int fd, char *buf, int nbytes) |
9158 | 1465 { |
1466 char *cp; | |
20204
44f91b648e03
(fullwrite): Get rid of an extra call to write. Problem
Karl Heuer <kwzh@gnu.org>
parents:
19978
diff
changeset
|
1467 int ret = 0; |
9158 | 1468 |
1469 cp = buf; | |
20204
44f91b648e03
(fullwrite): Get rid of an extra call to write. Problem
Karl Heuer <kwzh@gnu.org>
parents:
19978
diff
changeset
|
1470 while (nbytes && ((ret = SEND (fd, cp, nbytes, 0)) > 0)) |
9158 | 1471 { |
1472 cp += ret; | |
1473 nbytes -= ret; | |
1474 } | |
1475 | |
1476 return (ret); | |
1477 } | |
1478 | |
1479 /* | |
1480 * Procedure getok | |
1481 * | |
1482 * Purpose: Reads a line from the server. If the return indicator is | |
1483 * positive, return with a zero exit status. If not, return with | |
1484 * a negative exit status. | |
1485 * | |
1486 * Arguments: | |
1487 * server The server to read from. | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1488 * |
9158 | 1489 * Returns: 0 for success, else for failure and puts error in pop_error. |
1490 * | |
14036 | 1491 * Side effects: On failure, may make the connection unusable. |
9158 | 1492 */ |
1493 static int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
1494 getok (popserver server) |
9158 | 1495 { |
1496 char *fromline; | |
1497 | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
1498 if (pop_getline (server, &fromline) < 0) |
9158 | 1499 { |
1500 return (-1); | |
1501 } | |
1502 | |
1503 if (! strncmp (fromline, "+OK", 3)) | |
1504 return (0); | |
1505 else if (! strncmp (fromline, "-ERR", 4)) | |
1506 { | |
1507 strncpy (pop_error, fromline, ERROR_MAX); | |
1508 pop_error[ERROR_MAX-1] = '\0'; | |
1509 return (-1); | |
1510 } | |
1511 else | |
1512 { | |
1513 strcpy (pop_error, | |
1514 "Unexpected response from server; expecting +OK or -ERR"); | |
1515 pop_trash (server); | |
1516 return (-1); | |
1517 } | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1518 } |
9158 | 1519 |
1520 #if 0 | |
1521 /* | |
1522 * Function: gettermination | |
1523 * | |
1524 * Purpose: Gets the next line and verifies that it is a termination | |
1525 * line (nothing but a dot). | |
1526 * | |
1527 * Return value: 0 on success, non-zero with pop_error set on error. | |
1528 * | |
1529 * Side effects: Closes the connection on error. | |
1530 */ | |
1531 static int | |
1532 gettermination (server) | |
1533 popserver server; | |
1534 { | |
1535 char *fromserver; | |
1536 | |
21295
f399e51d6d11
(pop_getline): Renamed from getline.
Richard M. Stallman <rms@gnu.org>
parents:
20418
diff
changeset
|
1537 if (pop_getline (server, &fromserver) < 0) |
9158 | 1538 return (-1); |
1539 | |
1540 if (strcmp (fromserver, ".")) | |
1541 { | |
1542 strcpy (pop_error, | |
1543 "Unexpected response from server in gettermination"); | |
1544 pop_trash (server); | |
1545 return (-1); | |
1546 } | |
1547 | |
1548 return (0); | |
1549 } | |
1550 #endif | |
1551 | |
1552 /* | |
1553 * Function pop_close | |
1554 * | |
1555 * Purpose: Close a pop connection, sending a "RSET" command to try to | |
1556 * preserve any changes that were made and a "QUIT" command to | |
1557 * try to get the server to quit, but ignoring any responses that | |
1558 * are received. | |
1559 * | |
14036 | 1560 * Side effects: The server is unusable after this function returns. |
9158 | 1561 * Changes made to the maildrop since the session was started (or |
1562 * since the last pop_reset) may be lost. | |
1563 */ | |
42439
d8a417105504
Remove unnecessary whitespaces.
Pavel Janík <Pavel@Janik.cz>
parents:
42412
diff
changeset
|
1564 void |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
1565 pop_close (popserver server) |
9158 | 1566 { |
1567 pop_trash (server); | |
1568 free ((char *) server); | |
1569 | |
1570 return; | |
1571 } | |
1572 | |
1573 /* | |
1574 * Function: pop_trash | |
1575 * | |
1576 * Purpose: Like pop_close or pop_quit, but doesn't deallocate the | |
80029
e1b6ef5c6464
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
79905
diff
changeset
|
1577 * memory associated with the server. It is valid to call |
9158 | 1578 * pop_close or pop_quit after this function has been called. |
1579 */ | |
1580 static void | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
1581 pop_trash (popserver server) |
9158 | 1582 { |
1583 if (server->file >= 0) | |
1584 { | |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1585 /* avoid recursion; sendline can call pop_trash */ |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1586 if (server->trash_started) |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1587 return; |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1588 server->trash_started = 1; |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
1589 |
9158 | 1590 sendline (server, "RSET"); |
1591 sendline (server, "QUIT"); | |
1592 | |
15108
442458addd50
(SEND, RECV): Renamed from send, recv.
Richard M. Stallman <rms@gnu.org>
parents:
15102
diff
changeset
|
1593 CLOSESOCKET (server->file); |
9158 | 1594 server->file = -1; |
1595 if (server->buffer) | |
1596 { | |
1597 free (server->buffer); | |
1598 server->buffer = 0; | |
1599 } | |
1600 } | |
15102
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1601 |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1602 #ifdef WINDOWSNT |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1603 if (have_winsock) |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1604 WSACleanup (); |
ed550d0805ca
[WINDOWSNT]: Include winsock.h and ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14238
diff
changeset
|
1605 #endif |
9158 | 1606 } |
1607 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1608 /* Return a pointer to the first CRLF in IN_STRING, which can contain |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1609 embedded nulls and has LEN characters in it not including the final |
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1610 null, or 0 if it does not contain one. */ |
9158 | 1611 |
1612 static char * | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109103
diff
changeset
|
1613 find_crlf (char *in_string, int len) |
9158 | 1614 { |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1615 while (len--) |
9158 | 1616 { |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1617 if (*in_string == '\r') |
9613
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
1618 { |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
1619 if (*++in_string == '\n') |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
1620 return (in_string - 1); |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
1621 } |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
1622 else |
530b4511e5b3
Only include ../src/config.h if HAVE_CONFIG_H is
Richard M. Stallman <rms@gnu.org>
parents:
9600
diff
changeset
|
1623 in_string++; |
9158 | 1624 } |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20204
diff
changeset
|
1625 return (0); |
9158 | 1626 } |
1627 | |
1628 #endif /* MAIL_USE_POP */ | |
52401 | 1629 |
1630 /* arch-tag: ceb37041-b7ad-49a8-a63d-286618b8367d | |
1631 (do not change this comment) */ |