X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/3f86c085fa6eb34547ac04cf2be31f6cc3681e48..refs/heads/wip:/lib-src/pop.c diff --git a/lib-src/pop.c b/lib-src/pop.c index a94e06fbd8..ffe16c5f91 100644 --- a/lib-src/pop.c +++ b/lib-src/pop.c @@ -1,7 +1,7 @@ /* pop.c: client routines for talking to a POP3-protocol post-office server -Copyright (C) 1991, 1993, 1996-1997, 1999, 2001-2011 - Free Software Foundation, Inc. +Copyright (C) 1991, 1993, 1996-1997, 1999, 2001-2014 Free Software +Foundation, Inc. Author: Jonathan Kamens @@ -21,11 +21,7 @@ You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ -#ifdef HAVE_CONFIG_H #include -#else -#define MAIL_USE_POP -#endif #ifdef MAIL_USE_POP @@ -34,15 +30,15 @@ along with GNU Emacs. If not, see . */ #include "ntlib.h" #include #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) +#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 #include -#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) +#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 @@ -101,7 +97,7 @@ extern char *krb_realmofhost (/* char * */); #endif /* KERBEROS */ #ifndef WINDOWSNT -#if !defined(HAVE_H_ERRNO) || !defined(HAVE_CONFIG_H) +#ifndef HAVE_H_ERRNO extern int h_errno; #endif #endif @@ -128,7 +124,7 @@ static char *find_crlf (char *, int); #endif char pop_error[ERROR_MAX]; -int pop_debug = 0; +bool pop_debug = false; /* * Function: pop_open (char *host, char *username, char *password, @@ -273,8 +269,8 @@ pop_open (char *host, char *username, char *password, int flags) server->data = 0; server->buffer_index = 0; server->buffer_size = GETLINE_MIN; - server->in_multi = 0; - server->trash_started = 0; + server->in_multi = false; + server->trash_started = false; if (getok (server)) return (0); @@ -344,9 +340,7 @@ pop_stat (popserver server, int *count, int *size) if (strncmp (fromserver, "+OK ", 4)) { if (0 == strncmp (fromserver, "-ERR", 4)) - { - strncpy (pop_error, fromserver, ERROR_MAX); - } + snprintf (pop_error, ERROR_MAX, "%s", fromserver); else { strcpy (pop_error, @@ -447,7 +441,7 @@ pop_list (popserver server, int message, int **IDs, int **sizes) if (strncmp (fromserver, "+OK ", 4)) { if (! strncmp (fromserver, "-ERR", 4)) - strncpy (pop_error, fromserver, ERROR_MAX); + snprintf (pop_error, ERROR_MAX, "%s", fromserver); else { strcpy (pop_error, @@ -686,13 +680,13 @@ pop_multi_first (popserver server, const char *command, char **response) if (0 == strncmp (*response, "-ERR", 4)) { - strncpy (pop_error, *response, ERROR_MAX); + snprintf (pop_error, ERROR_MAX, "%s", *response); return (-1); } else if (0 == strncmp (*response, "+OK", 3)) { for (*response += 3; **response == ' '; (*response)++) /* empty */; - server->in_multi = 1; + server->in_multi = true; return (0); } else @@ -734,7 +728,7 @@ pop_multi_next (popserver server, char **line) if (! fromserver[1]) { *line = 0; - server->in_multi = 0; + server->in_multi = false; return (0); } else @@ -859,7 +853,7 @@ pop_last (popserver server) if (! strncmp (fromserver, "-ERR", 4)) { - strncpy (pop_error, fromserver, ERROR_MAX); + snprintf (pop_error, ERROR_MAX, "%s", fromserver); return (-1); } else if (strncmp (fromserver, "+OK ", 4)) @@ -1059,15 +1053,14 @@ socket_connection (char *host, int flags) sock = socket (PF_INET, SOCK_STREAM, 0); if (sock < 0) { - strcpy (pop_error, POP_SOCKET_ERROR); - strncat (pop_error, strerror (errno), - ERROR_MAX - sizeof (POP_SOCKET_ERROR)); + snprintf (pop_error, ERROR_MAX, "%s%s", + POP_SOCKET_ERROR, strerror (errno)); return (-1); } #ifdef HAVE_GETADDRINFO - memset (&hints, 0, sizeof(hints)); + memset (&hints, 0, sizeof (hints)); hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_CANONNAME; hints.ai_family = AF_INET; @@ -1082,28 +1075,22 @@ socket_connection (char *host, int flags) } } while (ret != 0); - if (ret == 0) - { - it = res; - while (it) - { - if (it->ai_addrlen == sizeof (addr)) - { - struct sockaddr_in *in_a = (struct sockaddr_in *) it->ai_addr; - memcpy (&addr.sin_addr, &in_a->sin_addr, sizeof (addr.sin_addr)); - if (! connect (sock, (struct sockaddr *) &addr, sizeof (addr))) - break; - } - it = it->ai_next; - } - connect_ok = it != NULL; - if (connect_ok) - { - realhost = alloca (strlen (it->ai_canonname) + 1); - strcpy (realhost, it->ai_canonname); - } - freeaddrinfo (res); + for (it = res; it; it = it->ai_next) + if (it->ai_addrlen == sizeof addr) + { + struct sockaddr_in *in_a = (struct sockaddr_in *) it->ai_addr; + addr.sin_addr = in_a->sin_addr; + if (! connect (sock, (struct sockaddr *) &addr, sizeof addr)) + break; + } + connect_ok = it != NULL; + if (connect_ok) + { + realhost = alloca (strlen (it->ai_canonname) + 1); + strcpy (realhost, it->ai_canonname); } + freeaddrinfo (res); + #else /* !HAVE_GETADDRINFO */ do { @@ -1137,9 +1124,7 @@ socket_connection (char *host, int flags) if (! connect_ok) { CLOSESOCKET (sock); - strcpy (pop_error, CONNECT_ERROR); - strncat (pop_error, strerror (errno), - ERROR_MAX - sizeof (CONNECT_ERROR)); + snprintf (pop_error, ERROR_MAX, "%s%s", CONNECT_ERROR, strerror (errno)); return (-1); } @@ -1157,9 +1142,8 @@ socket_connection (char *host, int flags) krb5_auth_con_free (kcontext, auth_context); if (kcontext) krb5_free_context (kcontext); - strcpy (pop_error, KRB_ERROR); - strncat (pop_error, error_message (rem), - ERROR_MAX - sizeof(KRB_ERROR)); + snprintf (pop_error, ERROR_MAX, "%s%s", + KRB_ERROR, error_message (rem)); CLOSESOCKET (sock); return (-1); } @@ -1197,30 +1181,19 @@ socket_connection (char *host, int flags) krb5_free_principal (kcontext, server); if (rem) { - strcpy (pop_error, KRB_ERROR); - strncat (pop_error, error_message (rem), - ERROR_MAX - sizeof (KRB_ERROR)); + int pop_error_len = snprintf (pop_error, ERROR_MAX, "%s%s", + KRB_ERROR, error_message (rem)); #if defined HAVE_KRB5_ERROR_TEXT if (err_ret && err_ret->text.length) { - strncat (pop_error, " [server says '", - ERROR_MAX - strlen (pop_error) - 1); - strncat (pop_error, err_ret->text.data, - min (ERROR_MAX - strlen (pop_error) - 1, - err_ret->text.length)); - strncat (pop_error, "']", - ERROR_MAX - strlen (pop_error) - 1); + int errlen = err_ret->text.length; + snprintf (pop_error + pop_error_len, ERROR_MAX - pop_error_len, + " [server says '.*%s']", errlen, err_ret->text.data); } #elif defined HAVE_KRB5_ERROR_E_TEXT - if (err_ret && err_ret->e_text && strlen(*err_ret->e_text)) - { - strncat (pop_error, " [server says '", - ERROR_MAX - strlen (pop_error) - 1); - strncat (pop_error, *err_ret->e_text, - ERROR_MAX - strlen (pop_error) - 1); - strncat (pop_error, "']", - ERROR_MAX - strlen (pop_error) - 1); - } + if (err_ret && err_ret->e_text && **err_ret->e_text) + snprintf (pop_error + pop_error_len, ERROR_MAX - pop_error_len, + " [server says '%s']", *err_ret->e_text); #endif if (err_ret) krb5_free_error (kcontext, err_ret); @@ -1241,9 +1214,7 @@ socket_connection (char *host, int flags) free ((char *) ticket); if (rem != KSUCCESS) { - strcpy (pop_error, KRB_ERROR); - strncat (pop_error, krb_err_txt[rem], - ERROR_MAX - sizeof (KRB_ERROR)); + snprintf (pop_error, ERROR_MAX, "%s%s", KRB_ERROR, krb_err_txt[rem]); CLOSESOCKET (sock); return (-1); } @@ -1348,9 +1319,8 @@ pop_getline (popserver server, char **line) server->buffer_size - server->data - 1, 0); if (ret < 0) { - strcpy (pop_error, GETLINE_ERROR); - strncat (pop_error, strerror (errno), - ERROR_MAX - sizeof (GETLINE_ERROR)); + snprintf (pop_error, ERROR_MAX, "%s%s", + GETLINE_ERROR, strerror (errno)); pop_trash (server); return (-1); } @@ -1434,9 +1404,7 @@ sendline (popserver server, const char *line) if (ret < 0) { pop_trash (server); - strcpy (pop_error, SENDLINE_ERROR); - strncat (pop_error, strerror (errno), - ERROR_MAX - sizeof (SENDLINE_ERROR)); + snprintf (pop_error, ERROR_MAX, "%s%s", SENDLINE_ERROR, strerror (errno)); return (ret); } @@ -1498,8 +1466,7 @@ getok (popserver server) return (0); else if (! strncmp (fromline, "-ERR", 4)) { - strncpy (pop_error, fromline, ERROR_MAX); - pop_error[ERROR_MAX-1] = '\0'; + snprintf (pop_error, ERROR_MAX, "%s", fromline); return (-1); } else @@ -1579,7 +1546,7 @@ pop_trash (popserver server) /* avoid recursion; sendline can call pop_trash */ if (server->trash_started) return; - server->trash_started = 1; + server->trash_started = true; sendline (server, "RSET"); sendline (server, "QUIT");