2005-04-05 * src/send_message.c: send_message_smtp(): consider EOF right after QUIT successful (workaround for Gmail SMTP server). * src/socket.c: ssl_read(), ssl_peek(): check EOF which violates the SSL protocol. Index: src/send_message.c =================================================================== RCS file: /cvsroot/sylpheed/sylpheed/src/send_message.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -p -r1.16 -r1.17 --- src/send_message.c 7 Oct 2004 08:54:14 -0000 1.16 +++ src/send_message.c 5 Apr 2005 10:57:19 -0000 1.17 @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2003 Hiroyuki Yamamoto + * Copyright (C) 1999-2005 Hiroyuki Yamamoto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -412,6 +412,11 @@ static gint send_message_smtp(PrefsAccou ac_prefs->tmp_smtp_pass = NULL; } ret = -1; + } else if (session->state == SESSION_EOF && + SMTP_SESSION(session)->state == SMTP_QUIT) { + /* consider EOF right after QUIT successful */ + log_warning("%s\n", _("Connection closed by the remote host.")); + ret = 0; } else if (session->state == SESSION_ERROR || session->state == SESSION_EOF || session->state == SESSION_TIMEOUT || Index: src/socket.c =================================================================== RCS file: /cvsroot/sylpheed/sylpheed/src/socket.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -p -r1.34 -r1.35 --- src/socket.c 4 Aug 2004 09:07:57 -0000 1.34 +++ src/socket.c 5 Apr 2005 10:57:19 -0000 1.35 @@ -988,7 +988,7 @@ gint fd_read(gint fd, gchar *buf, gint l #if USE_SSL gint ssl_read(SSL *ssl, gchar *buf, gint len) { - gint ret; + gint err, ret; if (SSL_pending(ssl) == 0) { if (fd_check_io(SSL_get_rfd(ssl), G_IO_IN) < 0) @@ -997,14 +997,19 @@ gint ssl_read(SSL *ssl, gchar *buf, gint ret = SSL_read(ssl, buf, len); - switch (SSL_get_error(ssl, ret)) { + switch ((err = SSL_get_error(ssl, ret))) { case SSL_ERROR_NONE: return ret; case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: errno = EAGAIN; return -1; + case SSL_ERROR_ZERO_RETURN: + return 0; default: + g_warning("SSL_read() returned error %d, ret = %d\n", err, ret); + if (ret == 0) + return 0; return -1; } } @@ -1231,7 +1236,7 @@ gint sock_puts(SockInfo *sock, const gch #if USE_SSL gint ssl_peek(SSL *ssl, gchar *buf, gint len) { - gint ret; + gint err, ret; if (SSL_pending(ssl) == 0) { if (fd_check_io(SSL_get_rfd(ssl), G_IO_IN) < 0) @@ -1240,14 +1245,19 @@ gint ssl_peek(SSL *ssl, gchar *buf, gint ret = SSL_peek(ssl, buf, len); - switch (SSL_get_error(ssl, ret)) { + switch ((err = SSL_get_error(ssl, ret))) { case SSL_ERROR_NONE: return ret; case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: errno = EAGAIN; return -1; + case SSL_ERROR_ZERO_RETURN: + return 0; default: + g_warning("SSL_peek() returned error %d, ret = %d\n", err, ret); + if (ret == 0) + return 0; return -1; } }