From f5630296fb4dfef165c682c9723dd86f37551f3d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 23 Aug 2002 20:56:35 +0000 Subject: If we fail to send the EHLO/HELO command successfully, set 2002-08-23 Jeffrey Stedfast * providers/smtp/camel-smtp-transport.c (smtp_helo): If we fail to send the EHLO/HELO command successfully, set transport->connected to FALSE when we close the tcp connection. Also updated to work on an IPv6 network. (smtp_connect): transport->authtypes can be NULL, so NULL-protect the call to g_hash_table_size() - this should fix a warning that was reported on the evolution@ximian.com mailing list. (smtp_set_exception): If the status message is multi-line, add a \n between lines. (connect_to_server): If we are going to ignore the EHLO/HELO error as if it were non-fatal, then we should clear the exception. svn path=/trunk/; revision=17852 --- camel/ChangeLog | 14 ++++++++++++++ camel/providers/smtp/camel-smtp-transport.c | 27 ++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/camel/ChangeLog b/camel/ChangeLog index 20bdd64d8e..13d90e16bb 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,17 @@ +2002-08-23 Jeffrey Stedfast + + * providers/smtp/camel-smtp-transport.c (smtp_helo): If we fail to + send the EHLO/HELO command successfully, set transport->connected + to FALSE when we close the tcp connection. Also updated to work on + an IPv6 network. + (smtp_connect): transport->authtypes can be NULL, so NULL-protect + the call to g_hash_table_size() - this should fix a warning that + was reported on the evolution@ximian.com mailing list. + (smtp_set_exception): If the status message is multi-line, add a + \n between lines. + (connect_to_server): If we are going to ignore the EHLO/HELO error + as if it were non-fatal, then we should clear the exception. + 2002-08-22 Jeffrey Stedfast * providers/imap/camel-imap-store.c (imap_noop): If current_folder diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c index ef7ce57fa3..8b84c29354 100644 --- a/camel/providers/smtp/camel-smtp-transport.c +++ b/camel/providers/smtp/camel-smtp-transport.c @@ -305,7 +305,7 @@ connect_to_server (CamelService *service, int try_starttls, CamelException *ex) } while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */ g_free (respbuf); - /* send HELO (or EHLO, depending on the service type) */ + /* send EHLO (or HELO, depending on the service type) */ if (!(transport->flags & CAMEL_SMTP_TRANSPORT_IS_ESMTP)) { /* If we did not auto-detect ESMTP, we should still send EHLO */ transport->flags |= CAMEL_SMTP_TRANSPORT_IS_ESMTP; @@ -325,6 +325,9 @@ connect_to_server (CamelService *service, int try_starttls, CamelException *ex) return FALSE; } + /* clear any EHLO/HELO exception and assume that any SMTP errors encountered were non-fatal */ + camel_exception_clear (ex); + #ifdef HAVE_SSL if (transport->flags & CAMEL_SMTP_TRANSPORT_USE_SSL_WHEN_POSSIBLE) { /* try_starttls is always TRUE here */ @@ -454,7 +457,7 @@ smtp_connect (CamelService *service, CamelException *ex) return FALSE; /* check to see if AUTH is required, if so...then AUTH ourselves */ - has_authtypes = g_hash_table_size (transport->authtypes) > 0; + has_authtypes = transport->authtypes ? g_hash_table_size (transport->authtypes) > 0 : FALSE; if (service->url->authmech && (transport->flags & CAMEL_SMTP_TRANSPORT_IS_ESMTP) && has_authtypes) { CamelSession *session = camel_service_get_session (service); CamelServiceAuthType *authtype; @@ -824,6 +827,7 @@ smtp_set_exception (CamelSmtpTransport *transport, const char *respbuf, const ch if (*(rbuf + 3) == '-') { g_free (buffer); buffer = camel_stream_buffer_read_line (CAMEL_STREAM_BUFFER (transport->istream)); + g_string_append_c (string, '\n'); } else { g_free (buffer); buffer = NULL; @@ -857,23 +861,39 @@ smtp_helo (CamelSmtpTransport *transport, CamelException *ex) struct hostent *host; CamelException err; const char *token; + int af; camel_operation_start_transient (NULL, _("SMTP Greeting")); /* get the local host name */ camel_exception_init (&err); +#ifdef ENABLE_IPv6 + af = transport->localaddr->family == CAMEL_TCP_ADDRESS_IPv6 ? AF_INET6 : AF_INET; +#else + af = AF_INET; +#endif host = camel_gethostbyaddr ((char *) &transport->localaddr->address, - transport->localaddr->length, AF_INET, &err); + transport->localaddr->length, af, &err); + camel_exception_clear (&err); if (host && host->h_name) { name = g_strdup (host->h_name); } else { +#ifdef ENABLE_IPv6 + char ip[MAXHOSTNAMELEN + 1]; + + name = g_strdup_printf ("[%s]", inet_ntop (af, transport->localaddr->address, ip, MAXHOSTNAMELEN)); +#else + /* We *could* use inet_ntoa() here, but it's probably + not worth it since we would have to worry about + some systems not having inet_ntoa() */ name = g_strdup_printf ("[%d.%d.%d.%d]", transport->localaddr->address[0], transport->localaddr->address[1], transport->localaddr->address[2], transport->localaddr->address[3]); +#endif } camel_free_host (host); @@ -893,6 +913,7 @@ smtp_helo (CamelSmtpTransport *transport, CamelException *ex) g_strerror (errno)); camel_operation_end (NULL); + transport->connected = FALSE; camel_object_unref (transport->istream); transport->istream = NULL; camel_object_unref (transport->ostream); -- cgit v1.2.3