aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src
diff options
context:
space:
mode:
authorRichard M. Stallman1996-04-28 19:08:33 +0000
committerRichard M. Stallman1996-04-28 19:08:33 +0000
commitc2668a613fb385d8534352b83c9d79e40ce34a0b (patch)
tree37911db9d314deeeb2e7485591f0c74ddd752de5 /lib-src
parent7f75d5c619a6498b8d92816f1c1e5852e147a5fb (diff)
downloademacs-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.c57
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
5This file is part of GNU Emacs. 5This 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)
92extern int h_errno; 102extern int h_errno;
93#endif 103#endif
104#endif
94 105
95static int socket_connection (/* char *, int */); 106static int socket_connection (/* char *, int */);
96static char *getline (/* popserver */); 107static 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
959static 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,