From 130f58af6de1b8669c01ee873a4188b2ffd9c4d5 Mon Sep 17 00:00:00 2001 From: hiro Date: Tue, 5 Apr 2005 10:55:21 +0000 Subject: made a workaround for Gmail SMTP server. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@201 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 8 ++++++++ ChangeLog.ja | 8 ++++++++ src/procheader.c | 2 +- src/send_message.c | 5 +++++ src/socket.c | 18 ++++++++++++++---- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2e5af87a..362ad975 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-04-05 + + * src/send_messages.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. + * src/procheader.c: removed an unused variable. + 2005-04-01 * configure.in: changed -traditional-cpp to -no-cpp-precomp for newer diff --git a/ChangeLog.ja b/ChangeLog.ja index 015dea3e..cb28f91f 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,3 +1,11 @@ +2005-04-05 + + * src/send_messages.c: send_message_smtp(): QUIT 直後の EOF を成功と + みなすようにした(Gmail の SMTP サーバへの対処)。 + * src/socket.c: ssl_read(), ssl_peek(): SSL プロトコル違反の EOF を + チェック。 + * src/procheader.c: 未使用の変数を削除。 + 2005-04-01 * configure.in: 新しい Mac OS X に対応するために -traditional-cpp を diff --git a/src/procheader.c b/src/procheader.c index eff43f48..415bc59c 100644 --- a/src/procheader.c +++ b/src/procheader.c @@ -503,7 +503,7 @@ MsgInfo *procheader_parse_stream(FILE *fp, MsgFlags flags, gboolean full) MsgInfo *msginfo; gchar buf[BUFFSIZE]; - gchar *p, *q; + gchar *p; gchar *hp; HeaderEntry *hentry; gint hnum; diff --git a/src/send_message.c b/src/send_message.c index b2e5bd6b..efe6a66e 100644 --- a/src/send_message.c +++ b/src/send_message.c @@ -412,6 +412,11 @@ static gint send_message_smtp(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp) 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 || diff --git a/src/socket.c b/src/socket.c index f23dde62..2c337ccb 100644 --- a/src/socket.c +++ b/src/socket.c @@ -990,7 +990,7 @@ gint fd_read(gint fd, gchar *buf, gint len) #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) @@ -999,14 +999,19 @@ gint ssl_read(SSL *ssl, gchar *buf, gint len) 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; } } @@ -1233,7 +1238,7 @@ gint sock_puts(SockInfo *sock, const gchar *buf) #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) @@ -1242,14 +1247,19 @@ gint ssl_peek(SSL *ssl, gchar *buf, gint len) 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; } } -- cgit v1.2.3