diff options
| author | Richard M. Stallman | 1996-04-28 19:08:33 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1996-04-28 19:08:33 +0000 |
| commit | c2668a613fb385d8534352b83c9d79e40ce34a0b (patch) | |
| tree | 37911db9d314deeeb2e7485591f0c74ddd752de5 /lib-src | |
| parent | 7f75d5c619a6498b8d92816f1c1e5852e147a5fb (diff) | |
| download | emacs-c2668a613fb385d8534352b83c9d79e40ce34a0b.tar.gz emacs-c2668a613fb385d8534352b83c9d79e40ce34a0b.zip | |
[WINDOWSNT]: Include winsock.h and ntlib.h.
Macro SOCKET_ERROR undefined.
Don't declare h_errno.
[!WINDOWSNT]: Define macros recv and send.
[!WINDOWSNT] (POP_SERVICE): Change to pop3.
(pop_open) [WINDOWSNT]: Initialize trash_started.
(have_winsock) [WINDOWSNT]: New variable.
(socket_connection) [WINDOWSNT]: Initialize winsock.
(socket_connection): Use closesocket instead of close.
(getline): Use recv instead of read.
(fullwrite): Use send instead of write.
(pop_trash): Use closesocket instead of close.
(pop_trash) [WINDOWSNT]: Cleanup winsock.
Check if being called recursively by sendline.
Diffstat (limited to 'lib-src')
| -rw-r--r-- | lib-src/pop.c | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/lib-src/pop.c b/lib-src/pop.c index 77d7595801b..ac67abd08b1 100644 --- a/lib-src/pop.c +++ b/lib-src/pop.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* pop.c: client routines for talking to a POP3-protocol post-office server | 1 | /* pop.c: client routines for talking to a POP3-protocol post-office server |
| 2 | Copyright (c) 1991,1993 Free Software Foundation, Inc. | 2 | Copyright (c) 1991, 1993, 1996 Free Software Foundation, Inc. |
| 3 | Written by Jonathan Kamens, jik@security.ov.com. | 3 | Written by Jonathan Kamens, jik@security.ov.com. |
| 4 | 4 | ||
| 5 | This file is part of GNU Emacs. | 5 | This file is part of GNU Emacs. |
| @@ -37,8 +37,17 @@ Boston, MA 02111-1307, USA. */ | |||
| 37 | #endif | 37 | #endif |
| 38 | 38 | ||
| 39 | #include <sys/types.h> | 39 | #include <sys/types.h> |
| 40 | #ifdef WINDOWSNT | ||
| 41 | #include "ntlib.h" | ||
| 42 | #include <winsock.h> | ||
| 43 | #undef SOCKET_ERROR | ||
| 44 | #else | ||
| 40 | #include <netinet/in.h> | 45 | #include <netinet/in.h> |
| 41 | #include <sys/socket.h> | 46 | #include <sys/socket.h> |
| 47 | #define recv(s,buf,len,flags) read(s,buf,len) | ||
| 48 | #define send(s,buf,len,flags) write(s,buf,len) | ||
| 49 | #define closesocket close | ||
| 50 | #endif | ||
| 42 | #include <pop.h> | 51 | #include <pop.h> |
| 43 | 52 | ||
| 44 | #ifdef sun | 53 | #ifdef sun |
| @@ -88,9 +97,11 @@ extern char *krb_realmofhost (/* char * */); | |||
| 88 | #endif /* ! KRB5 */ | 97 | #endif /* ! KRB5 */ |
| 89 | #endif /* KERBEROS */ | 98 | #endif /* KERBEROS */ |
| 90 | 99 | ||
| 100 | #ifndef WINDOWSNT | ||
| 91 | #if !defined(HAVE_H_ERRNO) || !defined(HAVE_CONFIG_H) | 101 | #if !defined(HAVE_H_ERRNO) || !defined(HAVE_CONFIG_H) |
| 92 | extern int h_errno; | 102 | extern int h_errno; |
| 93 | #endif | 103 | #endif |
| 104 | #endif | ||
| 94 | 105 | ||
| 95 | static int socket_connection (/* char *, int */); | 106 | static int socket_connection (/* char *, int */); |
| 96 | static char *getline (/* popserver */); | 107 | static char *getline (/* popserver */); |
| @@ -106,7 +117,11 @@ static char *find_crlf (/* char * */); | |||
| 106 | #define ERROR_MAX 80 /* a pretty arbitrary size */ | 117 | #define ERROR_MAX 80 /* a pretty arbitrary size */ |
| 107 | #define POP_PORT 110 | 118 | #define POP_PORT 110 |
| 108 | #define KPOP_PORT 1109 | 119 | #define KPOP_PORT 1109 |
| 120 | #ifdef WINDOWSNT | ||
| 121 | #define POP_SERVICE "pop3" /* we don't want the POP2 port! */ | ||
| 122 | #else | ||
| 109 | #define POP_SERVICE "pop" | 123 | #define POP_SERVICE "pop" |
| 124 | #endif | ||
| 110 | #ifdef KERBEROS | 125 | #ifdef KERBEROS |
| 111 | #ifdef KRB5 | 126 | #ifdef KRB5 |
| 112 | #define KPOP_SERVICE "k5pop"; | 127 | #define KPOP_SERVICE "k5pop"; |
| @@ -269,6 +284,7 @@ pop_open (host, username, password, flags) | |||
| 269 | server->buffer_index = 0; | 284 | server->buffer_index = 0; |
| 270 | server->buffer_size = GETLINE_MIN; | 285 | server->buffer_size = GETLINE_MIN; |
| 271 | server->in_multi = 0; | 286 | server->in_multi = 0; |
| 287 | server->trash_started = 0; | ||
| 272 | 288 | ||
| 273 | if (getok (server)) | 289 | if (getok (server)) |
| 274 | return (0); | 290 | return (0); |
| @@ -939,6 +955,10 @@ pop_quit (server) | |||
| 939 | return (ret); | 955 | return (ret); |
| 940 | } | 956 | } |
| 941 | 957 | ||
| 958 | #ifdef WINDOWSNT | ||
| 959 | static int have_winsock = 0; | ||
| 960 | #endif | ||
| 961 | |||
| 942 | /* | 962 | /* |
| 943 | * Function: socket_connection | 963 | * Function: socket_connection |
| 944 | * | 964 | * |
| @@ -982,6 +1002,14 @@ socket_connection (host, flags) | |||
| 982 | 1002 | ||
| 983 | int try_count = 0; | 1003 | int try_count = 0; |
| 984 | 1004 | ||
| 1005 | #ifdef WINDOWSNT | ||
| 1006 | { | ||
| 1007 | WSADATA winsockData; | ||
| 1008 | if (WSAStartup (0x101, &winsockData) == 0) | ||
| 1009 | have_winsock = 1; | ||
| 1010 | } | ||
| 1011 | #endif | ||
| 1012 | |||
| 985 | do | 1013 | do |
| 986 | { | 1014 | { |
| 987 | hostent = gethostbyname (host); | 1015 | hostent = gethostbyname (host); |
| @@ -1056,7 +1084,7 @@ socket_connection (host, flags) | |||
| 1056 | 1084 | ||
| 1057 | if (! *hostent->h_addr_list) | 1085 | if (! *hostent->h_addr_list) |
| 1058 | { | 1086 | { |
| 1059 | (void) close (sock); | 1087 | (void) closesocket (sock); |
| 1060 | strcpy (pop_error, CONNECT_ERROR); | 1088 | strcpy (pop_error, CONNECT_ERROR); |
| 1061 | strncat (pop_error, strerror (errno), | 1089 | strncat (pop_error, strerror (errno), |
| 1062 | ERROR_MAX - sizeof (CONNECT_ERROR)); | 1090 | ERROR_MAX - sizeof (CONNECT_ERROR)); |
| @@ -1077,7 +1105,7 @@ socket_connection (host, flags) | |||
| 1077 | strcpy (pop_error, KRB_ERROR); | 1105 | strcpy (pop_error, KRB_ERROR); |
| 1078 | strncat (pop_error, error_message (rem), | 1106 | strncat (pop_error, error_message (rem), |
| 1079 | ERROR_MAX - sizeof(KRB_ERROR)); | 1107 | ERROR_MAX - sizeof(KRB_ERROR)); |
| 1080 | (void) close (sock); | 1108 | (void) closesocket (sock); |
| 1081 | return (-1); | 1109 | return (-1); |
| 1082 | } | 1110 | } |
| 1083 | 1111 | ||
| @@ -1134,7 +1162,7 @@ socket_connection (host, flags) | |||
| 1134 | if (err_ret) | 1162 | if (err_ret) |
| 1135 | krb5_free_error (err_ret); | 1163 | krb5_free_error (err_ret); |
| 1136 | 1164 | ||
| 1137 | (void) close (sock); | 1165 | (void) closesocket (sock); |
| 1138 | return (-1); | 1166 | return (-1); |
| 1139 | } | 1167 | } |
| 1140 | #else /* ! KRB5 */ | 1168 | #else /* ! KRB5 */ |
| @@ -1151,7 +1179,7 @@ socket_connection (host, flags) | |||
| 1151 | strcpy (pop_error, KRB_ERROR); | 1179 | strcpy (pop_error, KRB_ERROR); |
| 1152 | strncat (pop_error, krb_err_txt[rem], | 1180 | strncat (pop_error, krb_err_txt[rem], |
| 1153 | ERROR_MAX - sizeof (KRB_ERROR)); | 1181 | ERROR_MAX - sizeof (KRB_ERROR)); |
| 1154 | (void) close (sock); | 1182 | (void) closesocket (sock); |
| 1155 | return (-1); | 1183 | return (-1); |
| 1156 | } | 1184 | } |
| 1157 | #endif /* KRB5 */ | 1185 | #endif /* KRB5 */ |
| @@ -1243,8 +1271,8 @@ getline (server) | |||
| 1243 | return (0); | 1271 | return (0); |
| 1244 | } | 1272 | } |
| 1245 | } | 1273 | } |
| 1246 | ret = read (server->file, server->buffer + server->data, | 1274 | ret = recv (server->file, server->buffer + server->data, |
| 1247 | server->buffer_size - server->data - 1); | 1275 | server->buffer_size - server->data - 1, 0); |
| 1248 | if (ret < 0) | 1276 | if (ret < 0) |
| 1249 | { | 1277 | { |
| 1250 | strcpy (pop_error, GETLINE_ERROR); | 1278 | strcpy (pop_error, GETLINE_ERROR); |
| @@ -1349,7 +1377,7 @@ fullwrite (fd, buf, nbytes) | |||
| 1349 | int ret; | 1377 | int ret; |
| 1350 | 1378 | ||
| 1351 | cp = buf; | 1379 | cp = buf; |
| 1352 | while ((ret = write (fd, cp, nbytes)) > 0) | 1380 | while ((ret = send (fd, cp, nbytes, 0)) > 0) |
| 1353 | { | 1381 | { |
| 1354 | cp += ret; | 1382 | cp += ret; |
| 1355 | nbytes -= ret; | 1383 | nbytes -= ret; |
| @@ -1468,10 +1496,16 @@ pop_trash (server) | |||
| 1468 | { | 1496 | { |
| 1469 | if (server->file >= 0) | 1497 | if (server->file >= 0) |
| 1470 | { | 1498 | { |
| 1499 | #ifdef WINDOWSNT | ||
| 1500 | /* avoid recursion; sendline can call pop_trash */ | ||
| 1501 | if (server->trash_started) | ||
| 1502 | return; | ||
| 1503 | server->trash_started = 1; | ||
| 1504 | #endif | ||
| 1471 | sendline (server, "RSET"); | 1505 | sendline (server, "RSET"); |
| 1472 | sendline (server, "QUIT"); | 1506 | sendline (server, "QUIT"); |
| 1473 | 1507 | ||
| 1474 | close (server->file); | 1508 | closesocket (server->file); |
| 1475 | server->file = -1; | 1509 | server->file = -1; |
| 1476 | if (server->buffer) | 1510 | if (server->buffer) |
| 1477 | { | 1511 | { |
| @@ -1479,6 +1513,11 @@ pop_trash (server) | |||
| 1479 | server->buffer = 0; | 1513 | server->buffer = 0; |
| 1480 | } | 1514 | } |
| 1481 | } | 1515 | } |
| 1516 | |||
| 1517 | #ifdef WINDOWSNT | ||
| 1518 | if (have_winsock) | ||
| 1519 | WSACleanup (); | ||
| 1520 | #endif | ||
| 1482 | } | 1521 | } |
| 1483 | 1522 | ||
| 1484 | /* Return a pointer to the first CRLF in IN_STRING, | 1523 | /* Return a pointer to the first CRLF in IN_STRING, |