* please see the file GPL in the top level source directory.
*/
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <lib-lib/lib-lib.h>
+
+#include <netinet/in.h>
+#include <netdb.h>
+#include <sys/socket.h>
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/macros.h>
-#include <lib-lib/debug.h>
+#include <lib-ui/curses.h>
#include "mutt.h"
#include "globals.h"
+
+#include "unix.h"
#include "mutt_socket.h"
#include "mutt_tunnel.h"
-#if defined(USE_SSL) || defined(USE_GNUTLS)
-# include "mutt_ssl.h"
-#endif
+#include "mutt_signal.h"
+#ifdef HAVE_LIBIDN
+#include <idna.h>
+#endif
#include "mutt_idna.h"
-
-#include <unistd.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <string.h>
-#include <errno.h>
-
/* support for multiple socket connections */
static CONNECTION *Connections = NULL;
{
int rc = -1;
- if (conn->fd < 0)
- debug_print (1, ("Attempt to close closed connection.\n"));
- else
+ if (conn->fd >= 0)
rc = conn->conn_close (conn);
conn->fd = -1;
return rc;
}
-int mutt_socket_read (CONNECTION * conn, char *buf, size_t len)
+int mutt_socket_read (CONNECTION * conn, char *buf, ssize_t len)
{
int rc;
if (conn->fd < 0) {
- debug_print (1, ("attempt to read from closed connection\n"));
return -1;
}
return rc;
}
-int mutt_socket_write_d (CONNECTION * conn, const char *buf, int dbg)
+int mutt_socket_write(CONNECTION * conn, const char *buf)
{
int rc;
int len;
- debug_print (dbg, ("> %s", buf));
-
if (conn->fd < 0) {
- debug_print (1, ("attempt to write to closed connection\n"));
return -1;
}
len = m_strlen(buf);
if ((rc = conn->conn_write (conn, buf, len)) < 0) {
- debug_print (1, ("error writing, closing socket\n"));
mutt_socket_close (conn);
return -1;
}
- if (rc < len) {
- debug_print (1, ("ERROR: wrote %d of %d bytes!\n", rc, len));
- }
-
return rc;
}
conn->available =
conn->conn_read (conn, conn->inbuf, sizeof (conn->inbuf));
else {
- debug_print (1, ("attempt to read from closed connection.\n"));
return -1;
}
conn->bufpos = 0;
return 1;
}
-int mutt_socket_readln_d (char *buf, ssize_t buflen, CONNECTION * conn,
- int dbg)
+int mutt_socket_readln(char *buf, ssize_t buflen, CONNECTION * conn)
{
char ch;
ssize_t i;
else
buf[i] = '\0';
- debug_print (dbg, ("< %s\n", buf));
-
/* number of bytes read, not m_strlen*/
return i + 1;
}
if (Tunnel && *Tunnel)
mutt_tunnel_socket_setup (conn);
else if (account->flags & M_ACCT_SSL) {
-#if defined (USE_SSL) || defined (USE_GNUTLS)
if (mutt_ssl_socket_setup (conn) < 0) {
mutt_socket_free (conn);
return NULL;
}
-#else
- mutt_error _("SSL is unavailable.");
-
- mutt_sleep (2);
- mutt_socket_free (conn);
-
- return NULL;
-#endif
- }
- else {
+ } else {
conn->conn_read = raw_socket_read;
conn->conn_write = raw_socket_write;
conn->conn_open = raw_socket_open;
int save_errno;
if (m_strlen(Preconnect)) {
- debug_print (2, ("Executing preconnect: %s\n", Preconnect));
rc = mutt_system (Preconnect);
- debug_print (2, ("Preconnect result: %d\n", rc));
if (rc) {
save_errno = errno;
mutt_perror (_("Preconnect command failed."));
if (sa->sa_family == AF_INET)
sa_size = sizeof (struct sockaddr_in);
-#ifdef HAVE_GETADDRINFO
else if (sa->sa_family == AF_INET6)
sa_size = sizeof (struct sockaddr_in6);
-#endif
else {
- debug_print (1, ("Unknown address family!\n"));
return -1;
}
if (connect (fd, sa, sa_size) < 0) {
save_errno = errno;
- debug_print (2, ("Connection failed. errno: %d...\n", errno));
SigInt = 0; /* reset in case we caught SIGINTR while in connect() */
}
return close (conn->fd);
}
-int raw_socket_read (CONNECTION * conn, char *buf, size_t len)
+int raw_socket_read (CONNECTION * conn, char *buf, ssize_t len)
{
int rc;
return rc;
}
-int raw_socket_write (CONNECTION * conn, const char *buf, size_t count)
+int raw_socket_write (CONNECTION * conn, const char *buf, ssize_t count)
{
int rc;
char *host_idna = NULL;
-#ifdef HAVE_GETADDRINFO
-/* --- IPv4/6 --- */
-
/* "65536\0" */
char port[6];
struct addrinfo hints;
mutt_message (_("Looking up %s..."), conn->account.host);
-
rc = getaddrinfo (host_idna, port, &hints, &res);
# ifdef HAVE_LIBIDN
freeaddrinfo (res);
-#else
- /* --- IPv4 only --- */
-
- struct sockaddr_in sin;
- struct hostent *he;
- int i;
-
- p_clear(&sin, 1);
- sin.sin_port = htons (conn->account.port);
- sin.sin_family = AF_INET;
-
-# ifdef HAVE_LIBIDN
- if (idna_to_ascii_lz (conn->account.host, &host_idna, 1) != IDNA_SUCCESS) {
- mutt_error (_("Bad IDN \"%s\"."), conn->account.host);
- return -1;
- }
-# else
- host_idna = conn->account.host;
-# endif
-
- mutt_message (_("Looking up %s..."), conn->account.host);
-
- if ((he = gethostbyname (host_idna)) == NULL) {
-# ifdef HAVE_LIBIDN
- p_delete(&host_idna);
-# endif
- mutt_error (_("Could not find the host \"%s\""), conn->account.host);
-
- return -1;
- }
-
-# ifdef HAVE_LIBIDN
- p_delete(&host_idna);
-# endif
-
- mutt_message (_("Connecting to %s..."), conn->account.host);
-
- rc = -1;
- for (i = 0; he->h_addr_list[i] != NULL; i++) {
- memcpy (&sin.sin_addr, he->h_addr_list[i], he->h_length);
- fd = socket (PF_INET, SOCK_STREAM, IPPROTO_IP);
-
- if (fd >= 0) {
- if ((rc = socket_connect (fd, (struct sockaddr *) &sin)) == 0) {
- fcntl (fd, F_SETFD, FD_CLOEXEC);
- conn->fd = fd;
- break;
- }
- else
- close (fd);
- }
- }
-
-#endif
if (rc) {
mutt_error (_("Could not connect to %s (%s)."), conn->account.host,
(rc > 0) ? strerror (rc) : _("unknown error"));