/* pop.c: client routines for talking to a POP3-protocol post-office server
- Copyright (c) 1991,1993 Free Software Foundation, Inc.
+ Copyright (c) 1991, 1993, 1996 Free Software Foundation, Inc.
Written by Jonathan Kamens, jik@security.ov.com.
This file is part of GNU Emacs.
#endif
#include <sys/types.h>
+#ifdef WINDOWSNT
+#include "ntlib.h"
+#include <winsock.h>
+#undef SOCKET_ERROR
+#define RECV(s,buf,len,flags) recv(s,buf,len,flags)
+#define SEND(s,buf,len,flags) send(s,buf,len,flags)
+#define CLOSESOCKET(s) closesocket(s)
+#else
#include <netinet/in.h>
#include <sys/socket.h>
+#define RECV(s,buf,len,flags) read(s,buf,len)
+#define SEND(s,buf,len,flags) write(s,buf,len)
+#define CLOSESOCKET(s) close(s)
+#endif
#include <pop.h>
#ifdef sun
#ifdef KERBEROS
#ifndef KRB5
+#ifndef SOLARIS2
#include <des.h>
#include <krb.h>
+#else /* not SOLARIS2 */
+#include <kerberos/des.h>
+#include <kerberos/krb.h>
+#endif /* not SOLARIS2 */
#else /* KRB5 */
#include <krb5/krb5.h>
#include <krb5/ext-proto.h>
extern char *getlogin (/* void */);
extern char *getpass (/* char * */);
extern char *strerror (/* int */);
+extern char *index ();
#ifdef KERBEROS
#ifndef KRB5
#endif /* ! KRB5 */
#endif /* KERBEROS */
+#ifndef WINDOWSNT
#if !defined(HAVE_H_ERRNO) || !defined(HAVE_CONFIG_H)
extern int h_errno;
#endif
+#endif
static int socket_connection (/* char *, int */);
static char *getline (/* popserver */);
#define ERROR_MAX 80 /* a pretty arbitrary size */
#define POP_PORT 110
#define KPOP_PORT 1109
+#ifdef WINDOWSNT
+#define POP_SERVICE "pop3" /* we don't want the POP2 port! */
+#else
#define POP_SERVICE "pop"
+#endif
#ifdef KERBEROS
#ifdef KRB5
#define KPOP_SERVICE "k5pop";
server->buffer_index = 0;
server->buffer_size = GETLINE_MIN;
server->in_multi = 0;
+ server->trash_started = 0;
if (getok (server))
return (0);
* allocate more space for them below.
*/
bufsize = sizes[0] + (markfrom ? 5 : 0);
- ptr = malloc (bufsize);
+ ptr = (char *)malloc (bufsize);
free ((char *) IDs);
free ((char *) sizes);
if (++fromcount == 5)
{
bufsize += 5;
- ptr = realloc (ptr, bufsize);
+ ptr = (char *)realloc (ptr, bufsize);
if (! ptr)
{
strcpy (pop_error, "Out of memory in pop_retrieve");
return (ret);
}
+#ifdef WINDOWSNT
+static int have_winsock = 0;
+#endif
+
/*
* Function: socket_connection
*
int try_count = 0;
+#ifdef WINDOWSNT
+ {
+ WSADATA winsockData;
+ if (WSAStartup (0x101, &winsockData) == 0)
+ have_winsock = 1;
+ }
+#endif
+
do
{
hostent = gethostbyname (host);
if (! *hostent->h_addr_list)
{
- (void) close (sock);
+ CLOSESOCKET (sock);
strcpy (pop_error, CONNECT_ERROR);
strncat (pop_error, strerror (errno),
ERROR_MAX - sizeof (CONNECT_ERROR));
strcpy (pop_error, KRB_ERROR);
strncat (pop_error, error_message (rem),
ERROR_MAX - sizeof(KRB_ERROR));
- (void) close (sock);
+ CLOSESOCKET (sock);
return (-1);
}
if (err_ret)
krb5_free_error (err_ret);
- (void) close (sock);
+ CLOSESOCKET (sock);
return (-1);
}
#else /* ! KRB5 */
strcpy (pop_error, KRB_ERROR);
strncat (pop_error, krb_err_txt[rem],
ERROR_MAX - sizeof (KRB_ERROR));
- (void) close (sock);
+ CLOSESOCKET (sock);
return (-1);
}
#endif /* KRB5 */
if (server->data == server->buffer_size - 1)
{
server->buffer_size += GETLINE_INCR;
- server->buffer = realloc (server->buffer, server->buffer_size);
+ server->buffer = (char *)realloc (server->buffer, server->buffer_size);
if (! server->buffer)
{
strcpy (pop_error, "Out of memory in getline");
return (0);
}
}
- ret = read (server->file, server->buffer + server->data,
- server->buffer_size - server->data - 1);
+ ret = RECV (server->file, server->buffer + server->data,
+ server->buffer_size - server->data - 1, 0);
if (ret < 0)
{
strcpy (pop_error, GETLINE_ERROR);
int ret;
cp = buf;
- while ((ret = write (fd, cp, nbytes)) > 0)
+ while ((ret = SEND (fd, cp, nbytes, 0)) > 0)
{
cp += ret;
nbytes -= ret;
{
if (server->file >= 0)
{
+ /* avoid recursion; sendline can call pop_trash */
+ if (server->trash_started)
+ return;
+ server->trash_started = 1;
+
sendline (server, "RSET");
sendline (server, "QUIT");
- close (server->file);
+ CLOSESOCKET (server->file);
server->file = -1;
if (server->buffer)
{
server->buffer = 0;
}
}
+
+#ifdef WINDOWSNT
+ if (have_winsock)
+ WSACleanup ();
+#endif
}
/* Return a pointer to the first CRLF in IN_STRING,