Re: [evolution-patches] ssl/tls patch (bug #65714)



yea, I know... jpr asked me to send in what I had since it's been
sitting in my tree for 2 days now waiting for the ipv6 stuff to go in

Jeff

On Wed, 2004-09-22 at 22:43, Not Zed wrote:
> On Wed, 2004-09-22 at 14:10 -0400, Jeffrey Stedfast wrote: 
> > the camel-tls.patch patch replaces the previous ipv6 patch for the
> > providers
> 
> 
> This patch should really be after the ipv6 one is applied and not
> contain the same diffs in some cases.  Its a bit hard to follow
> otherwise.
> 
> 
> > --- ChangeLog   16 Sep 2004 14:45:54 -0000      1.481.2.1
> > +++ ChangeLog   22 Sep 2004 18:00:14 -0000
> > @@ -1,3 +1,7 @@
> > +2004-09-22  Jeffrey Stedfast  <fejj novell com>
> > +
> > +       * e-account.c: s/use_ssl/ssl_mode/
> > +
> >  2004-08-27  Not Zed  <NotZed Ximian com>
> >  
> >         * e-passwords.c (e_passwords_ask_password): return cancelled
> if
> > Index: e-account.c
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/e-util/e-account.c,v
> > retrieving revision 1.10
> > diff -u -r1.10 e-account.c
> > --- e-account.c 9 Apr 2004 19:47:06 -0000       1.10
> > +++ e-account.c 22 Sep 2004 18:00:14 -0000
> > @@ -694,7 +694,7 @@
> >         { "imap_filter", 1<<EAP_FILTER_INBOX },
> >         { "imap_filter_junk", 1<<EAP_FILTER_JUNK },
> >         { "imap_filter_junk_inbox", 1<<EAP_FILTER_JUNK },
> > -       { "*_use_ssl", 1<<EAP_FORCE_SSL },
> > +       { "*_ssl_mode", 1<<EAP_FORCE_SSL },
> 
> I don't think we should change this at all if we can avoid it.  This
> impacts on the account configuration, and requires an incompatible
> account data version change.
> 
> We can just use the old values and the old name, without any impact on
> the actual function.  The only side effect is that if you look at the
> value inside gconf, which users shouldn't be anyway, it isn't as
> self-describing.
> 
> >         { "*_auth", 1<<EAP_LOCK_AUTH },
> >  };
> >  
> > 
> > 
> > text/plain attachment (mail-tls.patch)
> > 
> > ? camel-gpg.0.verify.data
> > ? camel-gpg.0.verify.signature
> > ? camel-gpg.1.verify.data
> > ? camel-gpg.1.verify.signature
> > ? evolution-mail-2.0.schemas
> > ? mail-tls.patch
> > Index: ChangeLog
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
> > retrieving revision 1.3444.2.9
> > diff -u -r1.3444.2.9 ChangeLog
> > --- ChangeLog   22 Sep 2004 01:31:16 -0000      1.3444.2.9
> > +++ ChangeLog   22 Sep 2004 17:59:52 -0000
> > @@ -1,3 +1,11 @@
> > +2004-09-22  Jeffrey Stedfast  <fejj novell com>
> > +
> > +       * mail-config.glade: Changed the names of the SSL mode
> option menus.
> > +
> > +       * mail-account-gui.c (setup_service): Updated to use
> "ssl_mode" as
> > +       the uri param rather than "use_ssl" which isn't very
> accurate
> > +       anymore. Also provide backward compat with old scheme.
> > +
> >  2004-09-03  Not Zed  <NotZed Ximian com>
> >  
> >         ** See bug #65058.
> > Index: mail-account-gui.c
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/mail/mail-account-gui.c,v
> > retrieving revision 1.171.14.2
> > diff -u -r1.171.14.2 mail-account-gui.c
> > --- mail-account-gui.c  16 Sep 2004 14:45:56 -0000      1.171.14.2
> > +++ mail-account-gui.c  22 Sep 2004 17:59:52 -0000
> > @@ -82,9 +82,9 @@
> >         char *label;
> >         char *value;
> >  } ssl_options[] = {
> > -       { N_("Always"), "always" },
> > -       { N_("Whenever Possible"), "when-possible" },
> > -       { N_("Never"), "never" }
> > +       { N_("SSL encryption"), "ssl"   },
> > +       { N_("TLS encryption"), "tls"   },
> > +       { N_("No encryption"),  "clear" }
> 
> Again this is a version change for the account info.
> 
> >  };
> >  
> >  static int num_ssl_options = sizeof (ssl_options) / sizeof
> (ssl_options[0]);
> > @@ -670,8 +670,8 @@
> >                 gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.authtype, writeable);
> >                 gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.check_supported, writeable);
> >                 
> > -               writeable = e_account_writable_option (gui->account,
> gui->source.provider->protocol, "use_ssl");
> > -               gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.use_ssl, writeable);
> > +               writeable = e_account_writable_option (gui->account,
> gui->source.provider->protocol, "ssl_mode");
> > +               gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.ssl_mode, writeable);
> >                 
> >                 writeable = e_account_writable (gui->account,
> E_ACCOUNT_SOURCE_SAVE_PASSWD);
> >                 gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.remember, writeable);
> > @@ -799,8 +799,8 @@
> >                 gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.authtype, writeable);
> >                 gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.check_supported, writeable);
> >                 
> > -               writeable = e_account_writable_option (gui->account,
> gui->transport.provider->protocol, "use_ssl");
> > -               gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.use_ssl, writeable);
> > +               writeable = e_account_writable_option (gui->account,
> gui->transport.provider->protocol, "ssl_mode");
> > +               gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.ssl_mode, writeable);
> >                 
> >                 writeable = e_account_writable (gui->account,
> E_ACCOUNT_TRANSPORT_SAVE_PASSWD);
> >                 gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.remember, writeable);
> > @@ -1382,19 +1382,28 @@
> >         
> >         if (gsvc->provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) {
> >                 GList *children, *item;
> > -               const char *use_ssl;
> > +               const char *ssl_mode;
> >                 int i;
> >                 
> > -               use_ssl = camel_url_get_param (url, "use_ssl");
> > -               if (!use_ssl)
> > -                       use_ssl = "never";
> > -               else if (!*use_ssl)  /* old config code just used an
> empty string as the value */
> > -                       use_ssl = "always";
> > +               if (!(ssl_mode = camel_url_get_param (url,
> "ssl_mode")))
> > +                       ssl_mode = camel_url_get_param (url,
> "use_ssl");
> >                 
> > -               children = gtk_container_get_children(GTK_CONTAINER
> (gtk_option_menu_get_menu (gsvc->use_ssl)));
> > +               /* backward compat */
> > +               if (!ssl_mode)
> > +                       ssl_mode = "clear";
> > +               else if (!*ssl_mode)  /* old config code just used
> an empty string as the value */
> > +                       ssl_mode = "ssl";
> > +               else if (!strcmp (ssl_mode, "always"))
> > +                       ssl_mode = "ssl";
> > +               else if (!strcmp (ssl_mode, "when-possible"))
> > +                       ssl_mode = "tls";
> > +               else
> > +                       ssl_mode = "clear";
> > +               
> > +               children = gtk_container_get_children(GTK_CONTAINER
> (gtk_option_menu_get_menu (gsvc->ssl_mode)));
> >                 for (item = children, i = 0; item; item =
> item->next, i++) {
> > -                       if (!strcmp (use_ssl, ssl_options[i].value))
> {
> > -                               gtk_option_menu_set_history
> (gsvc->use_ssl, i);
> > +                       if (!strcmp (ssl_mode,
> ssl_options[i].value)) {
> > +                               gtk_option_menu_set_history
> (gsvc->ssl_mode, i);
> >                                 g_signal_emit_by_name (item->data,
> "activate", gsvc);
> >                                 break;
> >                         }
> > @@ -1426,7 +1435,7 @@
> >         gtk_toggle_button_set_active (gsvc->remember,
> service->save_passwd);
> >  
> >         gtk_widget_set_sensitive((GtkWidget *)gsvc->authtype,
> e_account_writable_option(gui->account, gsvc->provider->protocol,
> "auth"));
> > -       gtk_widget_set_sensitive((GtkWidget *)gsvc->use_ssl,
> e_account_writable_option(gui->account, gsvc->provider->protocol,
> "use_ssl"));
> > +       gtk_widget_set_sensitive((GtkWidget *)gsvc->ssl_mode,
> e_account_writable_option(gui->account, gsvc->provider->protocol,
> "ssl_mode"));
> >         
> >         return has_auth;
> >  }
> > @@ -1464,16 +1473,16 @@
> >         
> >         for (i = 0; i < num_ssl_options; i++) {
> >                 item = gtk_menu_item_new_with_label
> (_(ssl_options[i].label));
> > -               g_object_set_data ((GObject *) item, "use_ssl",
> ssl_options[i].value);
> > +               g_object_set_data ((GObject *) item, "ssl_mode",
> ssl_options[i].value);
> >                 g_signal_connect (item, "activate", G_CALLBACK
> (ssl_option_activate), service);
> >                 gtk_widget_show (item);
> >                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
> >         }
> >         
> > -       gtk_option_menu_remove_menu (service->use_ssl);
> > -       gtk_option_menu_set_menu (service->use_ssl, menu);
> > +       gtk_option_menu_remove_menu (service->ssl_mode);
> > +       gtk_option_menu_set_menu (service->ssl_mode, menu);
> >         
> > -       gtk_option_menu_set_history (service->use_ssl, i - 1);
> > +       gtk_option_menu_set_history (service->ssl_mode, i - 1);
> >         g_signal_emit_by_name (item, "activate", service);
> >  }
> >  
> > @@ -1862,7 +1871,7 @@
> >         gui->source.ssl_frame = glade_xml_get_widget (gui->xml,
> "source_security_frame");
> >         gtk_widget_hide (gui->source.ssl_frame);
> >         gui->source.ssl_hbox = glade_xml_get_widget (gui->xml,
> "source_ssl_hbox");
> > -       gui->source.use_ssl = GTK_OPTION_MENU (glade_xml_get_widget
> (gui->xml, "source_use_ssl"));
> > +       gui->source.ssl_mode = GTK_OPTION_MENU (glade_xml_get_widget
> (gui->xml, "source_ssl_mode"));
> >         construct_ssl_menu (&gui->source);
> >         gui->source.no_ssl = glade_xml_get_widget (gui->xml,
> "source_ssl_disabled");
> >         gui->source.authtype = GTK_OPTION_MENU (glade_xml_get_widget
> (gui->xml, "source_auth_omenu"));
> > @@ -1887,7 +1896,7 @@
> >         gui->transport.ssl_frame = glade_xml_get_widget (gui->xml,
> "transport_security_frame");
> >         gtk_widget_hide (gui->transport.ssl_frame);
> >         gui->transport.ssl_hbox = glade_xml_get_widget (gui->xml,
> "transport_ssl_hbox");
> > -       gui->transport.use_ssl = GTK_OPTION_MENU
> (glade_xml_get_widget (gui->xml, "transport_use_ssl"));
> > +       gui->transport.ssl_mode = GTK_OPTION_MENU
> (glade_xml_get_widget (gui->xml, "transport_ssl_mode"));
> >         construct_ssl_menu (&gui->transport);
> >         gui->transport.no_ssl = glade_xml_get_widget (gui->xml,
> "transport_ssl_disabled");
> >         gui->transport_needs_auth = GTK_TOGGLE_BUTTON
> (glade_xml_get_widget (gui->xml, "transport_needs_auth"));
> > @@ -2187,8 +2196,8 @@
> >                         gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.authtype, writeable);
> >                         gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.check_supported, writeable);
> >                         
> > -                       writeable = e_account_writable_option
> (gui->account, gui->source.provider->protocol, "use_ssl");
> > -                       gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.use_ssl, writeable);
> > +                       writeable = e_account_writable_option
> (gui->account, gui->source.provider->protocol, "ssl_mode");
> > +                       gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.ssl_mode, writeable);
> >                         
> >                         writeable = e_account_writable
> (gui->account, E_ACCOUNT_SOURCE_SAVE_PASSWD);
> >                         gtk_widget_set_sensitive ((GtkWidget *)
> gui->source.remember, writeable);
> > @@ -2205,8 +2214,8 @@
> >                         gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.authtype, writeable);
> >                         gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.check_supported, writeable);
> >                         
> > -                       writeable = e_account_writable_option
> (gui->account, gui->transport.provider->protocol, "use_ssl");
> > -                       gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.use_ssl, writeable);
> > +                       writeable = e_account_writable_option
> (gui->account, gui->transport.provider->protocol, "ssl_mode");
> > +                       gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.ssl_mode, writeable);
> >                         
> >                         writeable = e_account_writable
> (gui->account, E_ACCOUNT_TRANSPORT_SAVE_PASSWD);
> >                         gtk_widget_set_sensitive ((GtkWidget *)
> gui->transport.remember, writeable);
> > @@ -2279,14 +2288,14 @@
> >         }
> >         
> >         if (gsvc->provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) {
> > -               const char *use_ssl;
> > +               const char *ssl_mode;
> >                 
> > -               use_ssl =
> g_object_get_data(G_OBJECT(gsvc->ssl_selected), "use_ssl");
> > +               ssl_mode =
> g_object_get_data(G_OBJECT(gsvc->ssl_selected), "ssl_mode");
> >                 
> > -               /* set the value to either "always" or
> "when-possible"
> > -                  but don't bother setting it for "never" */
> > -               if (strcmp (use_ssl, "never"))
> > -                       camel_url_set_param (url, "use_ssl",
> use_ssl);
> > +               /* set the value to either "ssl" or "tls"
> > +                  but don't bother setting it for "clear" */
> > +               if (strcmp (ssl_mode, "clear") != 0)
> > +                       camel_url_set_param (url, "ssl_mode",
> ssl_mode);
> >         }
> >         
> >         if (extra_config)
> > Index: mail-account-gui.h
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/mail/mail-account-gui.h,v
> > retrieving revision 1.31
> > diff -u -r1.31 mail-account-gui.h
> > --- mail-account-gui.h  1 Apr 2004 19:47:06 -0000       1.31
> > +++ mail-account-gui.h  22 Sep 2004 17:59:52 -0000
> > @@ -44,7 +44,7 @@
> >         struct _GtkEntry *username;
> >         struct _GtkEntry *path;
> >         struct _GtkWidget *ssl_frame;
> > -       struct _GtkOptionMenu *use_ssl;
> > +       struct _GtkOptionMenu *ssl_mode;
> >         struct _GtkWidget *ssl_selected;
> >         struct _GtkWidget *ssl_hbox;
> >         struct _GtkWidget *no_ssl;
> > Index: mail-config.glade
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/mail/mail-config.glade,v
> > retrieving revision 1.148.4.2
> > diff -u -r1.148.4.2 mail-config.glade
> > --- mail-config.glade   7 Sep 2004 21:06:39 -0000       1.148.4.2
> > +++ mail-config.glade   22 Sep 2004 17:59:54 -0000
> > @@ -1351,7 +1351,7 @@
> >                               <property name="spacing">12</property>
> >  
> >                               <child>
> > -                               <widget class="GtkLabel"
> id="lblSourceUseSSL">
> > +                               <widget class="GtkLabel"
> id="lblSourceSSLMode">
> >                                   <property
> name="visible">True</property>
> >                                   <property name="label"
> translatable="yes">_Use Secure Connection (SSL):</property>
> >                                   <property
> name="use_underline">True</property>
> > @@ -1363,7 +1363,7 @@
> >                                   <property
> name="yalign">0.5</property>
> >                                   <property name="xpad">0</property>
> >                                   <property name="ypad">0</property>
> > -                                 <property
> name="mnemonic_widget">source_use_ssl</property>
> > +                                 <property
> name="mnemonic_widget">source_ssl_mode</property>
> >                                 </widget>
> >                                 <packing>
> >                                   <property
> name="padding">0</property>
> > @@ -1373,7 +1373,7 @@
> >                               </child>
> >  
> >                               <child>
> > -                               <widget class="GtkOptionMenu"
> id="source_use_ssl">
> > +                               <widget class="GtkOptionMenu"
> id="source_ssl_mode">
> >                                   <property
> name="visible">True</property>
> >                                   <property
> name="can_focus">True</property>
> >                                   <property
> name="history">0</property>
> > @@ -2313,7 +2313,7 @@
> >                                   <property
> name="spacing">12</property>
> >  
> >                                   <child>
> > -                                   <widget class="GtkLabel"
> id="lblTransportUseSSL">
> > +                                   <widget class="GtkLabel"
> id="lblTransportSSLMode">
> >                                       <property
> name="visible">True</property>
> >                                       <property name="label"
> translatable="yes">_Use Secure Connection (SSL):</property>
> >                                       <property
> name="use_underline">True</property>
> > @@ -2325,7 +2325,7 @@
> >                                       <property
> name="yalign">0.5</property>
> >                                       <property
> name="xpad">0</property>
> >                                       <property
> name="ypad">0</property>
> > -                                     <property
> name="mnemonic_widget">transport_use_ssl</property>
> > +                                     <property
> name="mnemonic_widget">transport_ssl_mode</property>
> >                                     </widget>
> >                                     <packing>
> >                                       <property
> name="padding">0</property>
> > @@ -2335,7 +2335,7 @@
> >                                   </child>
> >  
> >                                   <child>
> > -                                   <widget class="GtkOptionMenu"
> id="transport_use_ssl">
> > +                                   <widget class="GtkOptionMenu"
> id="transport_ssl_mode">
> >                                       <property
> name="visible">True</property>
> >                                       <property
> name="can_focus">True</property>
> >                                       <property
> name="history">0</property>
> > 
> 
> You're going to need another patch for HEAD since this has all
> changed.  It is a gtkcombobox now.
> 
> > text/plain attachment (camel-tls.patch)
> > 
> > Index: providers/imap/camel-imap-store.c
> > ===================================================================
> > RCS file:
> /cvs/gnome/evolution/camel/providers/imap/camel-imap-store.c,v
> > retrieving revision 1.300
> > diff -u -r1.300 camel-imap-store.c
> > --- providers/imap/camel-imap-store.c   24 Aug 2004 14:02:22
> -0000      1.300
> > +++ providers/imap/camel-imap-store.c   22 Sep 2004 18:02:38 -0000
> > @@ -505,50 +505,36 @@
> >  }
> >  
> >  enum {
> > -       USE_SSL_NEVER,
> > -       USE_SSL_ALWAYS,
> > -       USE_SSL_WHEN_POSSIBLE
> > +       MODE_CLEAR,
> > +       MODE_SSL,
> > +       MODE_TLS,
> >  };
> >  
> >  #define SSL_PORT_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 |
> CAMEL_TCP_STREAM_SSL_ENABLE_SSL3)
> >  #define STARTTLS_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_TLS)
> >  
> >  static gboolean
> > -connect_to_server (CamelService *service, int ssl_mode, int
> try_starttls, CamelException *ex)
> > +connect_to_server (CamelService *service, struct addrinfo *ai, int
> ssl_mode, CamelException *ex)
> >  {
> >         CamelImapStore *store = (CamelImapStore *) service;
> >         CamelImapResponse *response;
> >         CamelStream *tcp_stream;
> >         CamelSockOptData sockopt;
> >         gboolean force_imap4 = FALSE;
> > -       struct hostent *h;
> > -       int clean_quit;
> > -       int port, ret;
> > +       int clean_quit, ret;
> >         char *buf;
> >         
> > -       if (!(h = camel_service_gethost (service, ex)))
> > -               return FALSE;
> > -       
> > -       port = service->url->port ? service->url->port : 143;
> > -       
> > -       if (ssl_mode != USE_SSL_NEVER) {
> > +       if (ssl_mode != MODE_CLEAR) {
> >  #ifdef HAVE_SSL
> > -               if (try_starttls) {
> > -                       tcp_stream = camel_tcp_stream_ssl_new_raw
> (service->session, service->url->host, STARTTLS_FLAGS);
> > +               if (ssl_mode == MODE_TLS) {
> > +                       tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, STARTTLS_FLAGS);
> >                 } else {
> > -                       port = service->url->port ?
> service->url->port : 993;
> >                         tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, SSL_PORT_FLAGS);
> >                 }
> >  #else
> > -               if (!try_starttls)
> > -                       port = service->url->port ?
> service->url->port : 993;
> > -               
> >                 camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                     _("Could not connect to %s
> (port %d): %s"),
> > -                                     service->url->host, port,
> > -                                     _("SSL unavailable"));
> > -               
> > -               camel_free_host (h);
> > +                                     _("Could not connect to %s:
> %s"),
> > +                                     service->url->host, _("SSL
> unavailable"));
> >                 
> >                 return FALSE;
> >  #endif /* HAVE_SSL */
> > @@ -556,16 +542,15 @@
> >                 tcp_stream = camel_tcp_stream_raw_new ();
> >         }
> >         
> > -       ret = camel_tcp_stream_connect (CAMEL_TCP_STREAM
> (tcp_stream), h, port);
> > -       camel_free_host (h);
> > -       if (ret == -1) {
> > +       if ((ret = camel_tcp_stream_connect ((CamelTcpStream *)
> tcp_stream, ai)) == -1) {
> >                 if (errno == EINTR)
> >                         camel_exception_set (ex,
> CAMEL_EXCEPTION_USER_CANCEL,
> >                                              _("Connection
> cancelled"));
> >                 else
> >                         camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                             _("Could not connect
> to %s (port %d): %s"),
> > -                                             service->url->host,
> port, g_strerror (errno));
> > +                                             _("Could not connect
> to %s: %s"),
> > +                                             service->url->host,
> > +                                             g_strerror (errno));
> >                 
> >                 camel_object_unref (tcp_stream);
> >                 
> > @@ -660,32 +645,18 @@
> >                 store->server_level = IMAP_LEVEL_IMAP4;
> >         }
> >         
> > -#ifdef HAVE_SSL
> > -       if (ssl_mode == USE_SSL_WHEN_POSSIBLE) {
> > -               if (store->capabilities & IMAP_CAPABILITY_STARTTLS)
> > -                       goto starttls;
> > -       } else if (ssl_mode == USE_SSL_ALWAYS) {
> > -               if (try_starttls) {
> > -                       if (store->capabilities &
> IMAP_CAPABILITY_STARTTLS) {
> > -                               /* attempt to toggle STARTTLS mode
> */
> > -                               goto starttls;
> > -                       } else {
> > -                               /* server doesn't support STARTTLS,
> abort */
> > -                               camel_exception_setv (ex,
> CAMEL_EXCEPTION_SYSTEM,
> > -                                                     _("Failed to
> connect to IMAP server %s in secure mode: %s"),
> > -                                                    
> service->url->host, _("SSL/TLS extension not supported."));
> > -                               /* we have the possibility of
> quitting cleanly here */
> > -                               clean_quit = TRUE;
> > -                               goto exception;
> > -                       }
> > -               }
> > +       if (ssl_mode != MODE_TLS) {
> > +               /* we're done */
> > +               return TRUE;
> >         }
> > -#endif /* HAVE_SSL */
> > -       
> > -       return TRUE;
> >         
> > -#ifdef HAVE_SSL
> > - starttls:
> > +       if (!(store->capabilities & IMAP_CAPABILITY_STARTTLS)) {
> > +               camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
> > +                                     _("Failed to connect to IMAP
> server %s in secure mode: STARTTLS not supported"),
> > +                                     service->url->host);
> > +               
> > +               goto exception;
> > +       }
> >         
> >         /* as soon as we send a STARTTLS command, all hope is lost
> of a clean QUIT if problems arise */
> >         clean_quit = FALSE;
> > @@ -750,7 +721,6 @@
> >         store->connected = FALSE;
> >         
> >         return FALSE;
> > -#endif /* HAVE_SSL */
> >  }
> >  
> >  static gboolean
> > @@ -898,60 +868,60 @@
> >  
> >  static struct {
> >         char *value;
> > +       char *serv;
> >         int mode;
> >  } ssl_options[] = {
> > -       { "",              USE_SSL_ALWAYS        },
> > -       { "always",        USE_SSL_ALWAYS        },
> > -       { "when-possible", USE_SSL_WHEN_POSSIBLE },
> > -       { "never",         USE_SSL_NEVER         },
> > -       { NULL,            USE_SSL_NEVER         },
> > +       { "",              "993", MODE_SSL   },  /* really old (1.x)
> */
> > +       { "ssl",           "993", MODE_SSL   },
> > +       { "always",        "993", MODE_SSL   },  /* old option (1.x)
> */
> > +       { "tls",           "143", MODE_TLS   },
> > +       { "when-possible", "143", MODE_TLS   },  /* old option (1.x)
> */
> > +       { "clear",         "143", MODE_CLEAR },
> > +       { "never",         "143", MODE_CLEAR },  /* old option (1.x)
> */
> > +       { NULL,            "143", MODE_CLEAR },
> 
> Don't use port numbers here.  Thats the whole point of having the
> service name.  The port numbers could potentially be altered by the
> local system administrator, they should not be hardcoded.
> 
> i.e. use imap and imaps as the service names like the ipv6 patch does.
> 
> >  };
> >  
> >  static gboolean
> >  connect_to_server_wrapper (CamelService *service, CamelException
> *ex)
> >  {
> > -       const char *command;
> > -#ifdef HAVE_SSL
> > -       const char *use_ssl;
> > -       int i, ssl_mode;
> > -#endif
> > -       command = camel_url_get_param (service->url, "command");
> > -       if (command)
> > +       const char *command, *ssl_mode;
> > +       struct addrinfo hints, *ai;
> > +       char *serv = NULL;
> > +       int mode, ret, i;
> > +       
> > +       if ((command = camel_url_get_param (service->url,
> "command")))
> >                 return connect_to_server_process (service, command,
> ex);
> > -
> > -#ifdef HAVE_SSL
> > -       use_ssl = camel_url_get_param (service->url, "use_ssl");
> > -       if (use_ssl) {
> > +       
> > +       if (service->url->port) {
> > +               serv = g_alloca (16);
> > +               sprintf (serv, "%d", service->url->port);
> > +       }
> > +       
> > +       if ((ssl_mode = camel_url_get_param (service->url,
> "ssl_mode"))
> > +           || (ssl_mode = camel_url_get_param (service->url,
>   "use_ssl"))) {
> 
> >                 for (i = 0; ssl_options[i].value; i++)
> > -                       if (!strcmp (ssl_options[i].value, use_ssl))
> > +                       if (!strcmp (ssl_options[i].value,
> ssl_mode))
> >                                 break;
> > -               ssl_mode = ssl_options[i].mode;
> > -       } else
> > -               ssl_mode = USE_SSL_NEVER;
> > -       
> > -       if (ssl_mode == USE_SSL_ALWAYS) {
> > -               /* First try the ssl port */
> > -               if (!connect_to_server (service, ssl_mode, FALSE,
> ex)) {
> > -                       if (camel_exception_get_id (ex) ==
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE) {
> > -                               /* The ssl port seems to be
> unavailable, lets try STARTTLS */
> > -                               camel_exception_clear (ex);
> > -                               return connect_to_server (service,
> ssl_mode, TRUE, ex);
> > -                       } else {
> > -                               return FALSE;
> > -                       }
> > -               }
> > -               
> > -               return TRUE;
> > -       } else if (ssl_mode == USE_SSL_WHEN_POSSIBLE) {
> > -               /* If the server supports STARTTLS, use it */
> > -               return connect_to_server (service, ssl_mode, TRUE,
> ex);
> > +               mode = ssl_options[i].mode;
> > +               if (!serv)
> > +                       serv = ssl_options[i].serv;
> >         } else {
> > -               /* User doesn't care about SSL */
> > -               return connect_to_server (service, ssl_mode, FALSE,
> ex);
> > +               mode = MODE_CLEAR;
> > +               if (!serv)
> > +                       serv = "143";
> >         }
> 
> This logic could be a little cleaner I think.
> 
> if (ssl_mode = camel_url_get_param("use_ssl")) {
>     for (i=...)
>       if ()
>         break;
> } else {
>     i = last;
> }
> mode=table[i].mode
> serv=table[i].serv
> if (port)
>    then set serv<-port
> 
> 
> > -#else
> > -       return connect_to_server (service, USE_SSL_NEVER, FALSE,
> ex);
> > -#endif
> > +       
> > +       memset (&hints, 0, sizeof (hints));
> > +       hints.ai_socktype = SOCK_STREAM;
> > +       hints.ai_family = PF_UNSPEC;
> > +       if (!(ai = camel_getaddrinfo (service->url->host, serv,
> &hints, ex)))
> > +               return FALSE;
> > +       ret = connect_to_server (service, ai, mode, ex);
> > +       
> > +       camel_freeaddrinfo (ai);
> > +       
> > +       return ret;
> >  }
> >  
> >  extern CamelServiceAuthType camel_imap_password_authtype;
> > Index: providers/imap4/camel-imap4-store.c
> > ===================================================================
> > RCS file:
> /cvs/gnome/evolution/camel/providers/imap4/camel-imap4-store.c,v
> > retrieving revision 1.22
> > diff -u -r1.22 camel-imap4-store.c
> > --- providers/imap4/camel-imap4-store.c 3 Aug 2004 16:31:47
> -0000       1.22
> > +++ providers/imap4/camel-imap4-store.c 22 Sep 2004 18:02:38 -0000
> > @@ -181,33 +181,34 @@
> >  }
> >  
> >  enum {
> > -       USE_SSL_NEVER,
> > -       USE_SSL_ALWAYS,
> > -       USE_SSL_WHEN_POSSIBLE
> > +       MODE_CLEAR,
> > +       MODE_SSL,
> > +       MODE_TLS,
> >  };
> >  
> >  #define SSL_PORT_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 |
> CAMEL_TCP_STREAM_SSL_ENABLE_SSL3)
> >  #define STARTTLS_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_TLS)
> >  
> >  static gboolean
> > -connect_to_server (CamelIMAP4Engine *engine, struct hostent *host,
> int ssl_mode, int try_starttls, CamelException *ex)
> > +connect_to_server (CamelIMAP4Engine *engine, struct addrinfo *ai,
> int ssl_mode, CamelException *ex)
> >  {
> >         CamelService *service = engine->service;
> >         CamelStream *tcp_stream;
> > -       int port, ret;
> > +       CamelIMAP4Command *ic;
> > +       int port, id, ret;
> >         
> >         port = service->url->port ? service->url->port : 143;
> >         
> > -       if (ssl_mode) {
> > +       if (ssl_mode != MODE_CLEAR) {
> >  #ifdef HAVE_SSL
> > -               if (try_starttls) {
> > +               if (ssl_mode == MODE_TLS) {
> >                         tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, STARTTLS_FLAGS);
> >                 } else {
> >                         port = service->url->port ?
> service->url->port : 993;
> >                         tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, SSL_PORT_FLAGS);
> >                 }
> >  #else
> > -               if (!try_starttls)
> > +               if (ssl_mode == MODE_SSL)
> >                         port = service->url->port ?
> service->url->port : 993;
> >                 
> >                 camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > @@ -221,7 +222,7 @@
> >                 tcp_stream = camel_tcp_stream_raw_new ();
> >         }
> >         
> > -       if ((ret = camel_tcp_stream_connect ((CamelTcpStream *)
> tcp_stream, host, port)) == -1) {
> > +       if ((ret = camel_tcp_stream_connect ((CamelTcpStream *)
> tcp_stream, ai)) == -1) {
> >                 if (errno == EINTR)
> >                         camel_exception_set (ex,
> CAMEL_EXCEPTION_USER_CANCEL,
> >                                              _("Connection
> cancelled"));
> > @@ -242,111 +243,94 @@
> >         if (camel_imap4_engine_capability (engine, ex) == -1)
> >                 return FALSE;
> >         
> > -#ifdef HAVE_SSL
> > -       if (ssl_mode == USE_SSL_WHEN_POSSIBLE) {
> > -               /* try_starttls is always TRUE here */
> > -               if (engine->capa & CAMEL_IMAP4_CAPABILITY_STARTTLS)
> > -                       goto starttls;
> > -       } else if (ssl_mode == USE_SSL_ALWAYS) {
> > -               if (try_starttls) {
> > -                       if (engine->capa &
> CAMEL_IMAP4_CAPABILITY_STARTTLS) {
> > -                               goto starttls;
> > -                       } else {
> > -                               /* server doesn't support STARTTLS,
> abort */
> > -                               camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                                     _("Failed to
> connect to IMAP server %s in secure mode: "
> > -                                                       "Server does
> not support STARTTLS"),
> > -                                                    
> service->url->host);
> > -                               return FALSE;
> > -                       }
> > -               }
> > +       if (ssl_mode != MODE_TLS) {
> > +               /* we're done */
> > +               return TRUE;
> >         }
> > -#endif /* HAVE_SSL */
> >         
> > -       return TRUE;
> > -       
> > -#ifdef HAVE_SSL
> > - starttls:
> > +       if (!(engine->capa & CAMEL_IMAP4_CAPABILITY_STARTTLS)) {
> > +               camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
> > +                                     _("Failed to connect to IMAP
> server %s in secure mode: %s"),
> > +                                     service->url->host, _("SSL
> negotiations failed"));
> > +               
> > +               return FALSE;
> > +       }
> >         
> > -       if (1) {
> > -               CamelIMAP4Command *ic;
> > -               int id;
> > -               
> > -               ic = camel_imap4_engine_prequeue (engine, NULL,
> "STARTTLS\r\n");
> > -               while ((id = camel_imap4_engine_iterate (engine)) <
> ic->id && id != -1)
> > -                       ;
> > -               
> > -               if (id == -1 || ic->result != CAMEL_IMAP4_RESULT_OK)
> {
> > -                       if (ic->result != CAMEL_IMAP4_RESULT_OK) {
> > -                               camel_exception_setv (ex,
> CAMEL_EXCEPTION_SYSTEM,
> > -                                                     _("Failed to
> connect to IMAP server %s in secure mode: %s"),
> > -                                                    
> service->url->host, _("Unknown error"));
> > -                       } else {
> > -                               camel_exception_xfer (ex, &ic->ex);
> > -                       }
> > -                       
> > -                       camel_imap4_command_unref (ic);
> > -                       
> > -                       return FALSE;
> > +       ic = camel_imap4_engine_prequeue (engine, NULL,
> "STARTTLS\r\n");
> > +       while ((id = camel_imap4_engine_iterate (engine)) < ic->id
> && id != -1)
> > +               ;
> > +       
> > +       if (id == -1 || ic->result != CAMEL_IMAP4_RESULT_OK) {
> > +               if (ic->result != CAMEL_IMAP4_RESULT_OK) {
> > +                       camel_exception_setv (ex,
> CAMEL_EXCEPTION_SYSTEM,
> > +                                             _("Failed to connect
> to IMAP server %s in secure mode: %s"),
> > +                                             service->url->host,
> _("Unknown error"));
> > +               } else {
> > +                       camel_exception_xfer (ex, &ic->ex);
> >                 }
> >                 
> >                 camel_imap4_command_unref (ic);
> > +               
> > +               return FALSE;
> >         }
> >         
> > +       camel_imap4_command_unref (ic);
> > +       
> >         return TRUE;
> > -#endif /* HAVE_SSL */
> >  }
> >  
> >  static struct {
> >         char *value;
> > +       char *serv;
> >         int mode;
> >  } ssl_options[] = {
> > -       { "",              USE_SSL_ALWAYS        },
> > -       { "always",        USE_SSL_ALWAYS        },
> > -       { "when-possible", USE_SSL_WHEN_POSSIBLE },
> > -       { "never",         USE_SSL_NEVER         },
> > -       { NULL,            USE_SSL_NEVER         },
> > +       { "",              "993", MODE_SSL   },  /* really old (1.x)
> */
> > +       { "ssl",           "993", MODE_SSL   },
> > +       { "always",        "993", MODE_SSL   },  /* old option (1.x)
> */
> > +       { "tls",           "143", MODE_TLS   },
> > +       { "when-possible", "143", MODE_TLS   },  /* old option (1.x)
> */
> > +       { "clear",         "143", MODE_CLEAR },
> > +       { "never",         "143", MODE_CLEAR },  /* old option (1.x)
> */
> > +       { NULL,            "143", MODE_CLEAR },
> >  };
> 
> Same.
> 
> >  static gboolean
> >  connect_to_server_wrapper (CamelIMAP4Engine *engine, CamelException
> *ex)
> >  {
> >         CamelService *service = engine->service;
> > -       const char *use_ssl;
> > -       struct hostent *h;
> > -       int ssl_mode;
> > -       int ret, i;
> > -       
> > -       if (!(h = camel_service_gethost (service, ex)))
> > -               return FALSE;
> > +       struct addrinfo *ai, hints;
> > +       const char *ssl_mode;
> > +       char *serv = NULL;
> > +       int mode, ret, i;
> > +       
> > +       if (service->url->port) {
> > +               serv = g_alloca (16);
> > +               sprintf (serv, "%d", service->url->port);
> > +       }
> >         
> > -       if ((use_ssl = camel_url_get_param (service->url,
> "use_ssl"))) {
> > +       if ((ssl_mode = camel_url_get_param (service->url,
> "ssl_mode"))
> > +           || (ssl_mode = camel_url_get_param (service->url,
> "use_ssl"))) {
> >                 for (i = 0; ssl_options[i].value; i++)
> > -                       if (!strcmp (ssl_options[i].value, use_ssl))
> > +                       if (!strcmp (ssl_options[i].value,
> ssl_mode))
> >                                 break;
> > -               ssl_mode = ssl_options[i].mode;
> > +               mode = ssl_options[i].mode;
> > +               if (!serv)
> > +                       serv = ssl_options[i].serv;
> >         } else {
> > -               ssl_mode = USE_SSL_NEVER;
> > +               mode = MODE_CLEAR;
> > +               if (!serv)
> > +                       serv = "143";
> >         }
> >         
> > -       if (ssl_mode == USE_SSL_ALWAYS) {
> > -               /* First try the ssl port */
> > -               if (!(ret = connect_to_server (engine, h, ssl_mode,
> FALSE, ex))) {
> > -                       if (camel_exception_get_id (ex) ==
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE) {
> > -                               /* The ssl port seems to be
> unavailable, lets try STARTTLS */
> > -                               camel_exception_clear (ex);
> > -                               ret = connect_to_server (engine, h,
> ssl_mode, TRUE, ex);
> > -                       }
> > -               }
> > -       } else if (ssl_mode == USE_SSL_WHEN_POSSIBLE) {
> > -               /* If the server supports STARTTLS, use it */
> > -               ret = connect_to_server (engine, h, ssl_mode, TRUE,
> ex);
> > -       } else {
> > -               /* User doesn't care about SSL */
> > -               ret = connect_to_server (engine, h, USE_SSL_NEVER,
> FALSE, ex);
> > -       }
> > +       memset (&hints, 0, sizeof (hints));
> > +       hints.ai_socktype = SOCK_STREAM;
> > +       hints.ai_family = PF_UNSPEC;
> > +       if (!(ai = camel_getaddrinfo (service->url->host, serv,
> &hints, ex)))
> > +               return FALSE;
> > +       
> > +       ret = connect_to_server (engine, ai, mode, ex);
> >         
> > -       camel_free_host (h);
> > +       camel_freeaddrinfo (ai);
> >         
> >         return ret;
> >  }
> > Index: providers/nntp/camel-nntp-store.c
> > ===================================================================
> > RCS file:
> /cvs/gnome/evolution/camel/providers/nntp/camel-nntp-store.c,v
> > retrieving revision 1.65.14.1
> > diff -u -r1.65.14.1 camel-nntp-store.c
> > --- providers/nntp/camel-nntp-store.c   16 Sep 2004 14:45:54
> -0000      1.65.14.1
> > +++ providers/nntp/camel-nntp-store.c   22 Sep 2004 18:02:38 -0000
> > @@ -81,12 +81,6 @@
> >         return TRUE;
> >  }
> >  
> > -enum {
> > -       USE_SSL_NEVER,
> > -       USE_SSL_ALWAYS,
> > -       USE_SSL_WHEN_POSSIBLE
> > -};
> > -
> >  static struct {
> >         const char *name;
> >         int type;
> > @@ -153,8 +147,17 @@
> >         return ret;
> >  }
> >  
> > +enum {
> > +       MODE_CLEAR,
> > +       MODE_SSL,
> > +       MODE_TLS,
> > +};
> > +
> > +#define SSL_PORT_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 |
> CAMEL_TCP_STREAM_SSL_ENABLE_SSL3)
> > +#define STARTTLS_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_TLS)
> > +
> >  static gboolean
> > -connect_to_server (CamelService *service, int ssl_mode,
> CamelException *ex)
> > +connect_to_server (CamelService *service, struct addrinfo *ai, int
> ssl_mode, CamelException *ex)
> >  {
> >         CamelNNTPStore *store = (CamelNNTPStore *) service;
> >         CamelDiscoStore *disco_store = (CamelDiscoStore*) service;
> > @@ -162,8 +165,7 @@
> >         gboolean retval = FALSE;
> >         unsigned char *buf;
> >         unsigned int len;
> > -       struct hostent *h;
> > -       int port, ret;
> > +       int ret;
> >         char *path;
> >         
> >         CAMEL_NNTP_STORE_LOCK(store, command_lock);
> > @@ -182,32 +184,33 @@
> >                 camel_data_cache_set_expire_access (store->cache,
> 60*60*24*5);
> >         }
> >         
> > -       if (!(h = camel_service_gethost (service, ex)))
> > -               goto fail;
> > -       
> > -       port = service->url->port ? service->url->port : NNTP_PORT;
> > -       
> > +       if (ssl_mode != MODE_CLEAR) {
> >  #ifdef HAVE_SSL
> > -       if (ssl_mode != USE_SSL_NEVER) {
> > -               port = service->url->port ? service->url->port :
> NNTPS_PORT;
> > -               tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host,
> CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 | CAMEL_TCP_STREAM_SSL_ENABLE_SSL3);
> > +               if (ssl_mode == MODE_TLS) {
> > +                       tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, STARTTLS_FLAGS);
> > +               } else {
> > +                       tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, SSL_PORT_FLAGS);
> > +               }
> > +#else
> > +               camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > +                                     _("Could not connect to %s:
> %s"),
> > +                                     service->url->host, _("SSL
> unavailable"));
> > +               
> > +               goto fail;
> > +#endif /* HAVE_SSL */
> >         } else {
> >                 tcp_stream = camel_tcp_stream_raw_new ();
> >         }
> > -#else
> > -       tcp_stream = camel_tcp_stream_raw_new ();
> > -#endif /* HAVE_SSL */
> >         
> > -       ret = camel_tcp_stream_connect (CAMEL_TCP_STREAM
> (tcp_stream), h, port);
> > -       camel_free_host (h);
> > -       if (ret == -1) {
> > +       if ((ret = camel_tcp_stream_connect ((CamelTcpStream *)
> tcp_stream, ai)) == -1) {
> >                 if (errno == EINTR)
> >                         camel_exception_set (ex,
> CAMEL_EXCEPTION_USER_CANCEL,
> >                                              _("Connection
> cancelled"));
> >                 else
> >                         camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                             _("Could not connect
> to %s (port %d): %s"),
> > -                                             service->url->host,
> port, g_strerror (errno));
> > +                                             _("Could not connect
> to %s: %s"),
> > +                                             service->url->host,
> > +                                             g_strerror (errno));
> >                 
> >                 camel_object_unref (tcp_stream);
> >                 
> > @@ -269,54 +272,57 @@
> >  
> >  static struct {
> >         char *value;
> > +       char *serv;
> >         int mode;
> >  } ssl_options[] = {
> > -       { "",              USE_SSL_ALWAYS        },
> > -       { "always",        USE_SSL_ALWAYS        },
> > -       { "when-possible", USE_SSL_WHEN_POSSIBLE },
> > -       { "never",         USE_SSL_NEVER         },
> > -       { NULL,            USE_SSL_NEVER         },
> > +       { "",              "563", MODE_SSL   },  /* really old (1.x)
> */
> > +       { "ssl",           "563", MODE_SSL   },
> > +       { "always",        "563", MODE_SSL   },  /* old option (1.x)
> */
> > +       { "tls",           "119", MODE_TLS   },
> > +       { "when-possible", "119", MODE_TLS   },  /* old option (1.x)
> */
> > +       { "clear",         "119", MODE_CLEAR },
> > +       { "never",         "119", MODE_CLEAR },  /* old option (1.x)
> */
> > +       { NULL,            "119", MODE_CLEAR },
> >  };
> 
> nntp and nntps
>   
> >  static gboolean
> >  nntp_connect_online (CamelService *service, CamelException *ex)
> >  {
> > -#ifdef HAVE_SSL
> > -       const char *use_ssl;
> > -       int i, ssl_mode;
> > +       struct addrinfo hints, *ai;
> > +       const char *ssl_mode;
> > +       char *serv = NULL;
> > +       int mode, ret, i;
> > +       
> > +       if (service->url->port) {
> > +               serv = g_alloca (16);
> > +               sprintf (serv, "%d", service->url->port);
> > +       }
> >         
> > -       use_ssl = camel_url_get_param (service->url, "use_ssl");
> > -       if (use_ssl) {
> > +       if ((ssl_mode = camel_url_get_param (service->url,
> "ssl_mode"))
> > +           || (ssl_mode = camel_url_get_param (service->url,
> "use_ssl"))) {
> >                 for (i = 0; ssl_options[i].value; i++)
> > -                       if (!strcmp (ssl_options[i].value, use_ssl))
> > +                       if (!strcmp (ssl_options[i].value,
> ssl_mode))
> >                                 break;
> > -               ssl_mode = ssl_options[i].mode;
> > -       } else
> > -               ssl_mode = USE_SSL_NEVER;
> > -       
> > -       if (ssl_mode == USE_SSL_ALWAYS) {
> > -               /* Connect via SSL */
> > -               return connect_to_server (service, ssl_mode, ex);
> > -       } else if (ssl_mode == USE_SSL_WHEN_POSSIBLE) {
> > -               /* If the server supports SSL, use it */
> > -               if (!connect_to_server (service, ssl_mode, ex)) {
> > -                       if (camel_exception_get_id (ex) ==
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE) {
> > -                               /* The ssl port seems to be
> unavailable, fall back to plain NNTP */
> > -                               camel_exception_clear (ex);
> > -                               return connect_to_server (service,
> USE_SSL_NEVER, ex);
> > -                       } else {
> > -                               return FALSE;
> > -                       }
> > -               }
> > -               
> > -               return TRUE;
> > +               mode = ssl_options[i].mode;
> > +               if (!serv)
> > +                       serv = ssl_options[i].serv;
> >         } else {
> > -               /* User doesn't care about SSL */
> > -               return connect_to_server (service, ssl_mode, ex);
> > +               mode = MODE_CLEAR;
> > +               if (!serv)
> > +                       serv = "119";
> >         }
> > -#else
> > -       return connect_to_server (service, USE_SSL_NEVER, ex);
> > -#endif
> > +       
> > +       memset (&hints, 0, sizeof (hints));
> > +       hints.ai_socktype = SOCK_STREAM;
> > +       hints.ai_family = PF_UNSPEC;
> > +       if (!(ai = camel_getaddrinfo (service->url->host, serv,
> &hints, ex)))
> > +               return FALSE;
> > +       
> > +       ret = connect_to_server (service, ai, mode, ex);
> > +       
> > +       camel_freeaddrinfo (ai);
> > +       
> > +       return ret;
> >  }
> >  
> >  static gboolean
> > Index: providers/pop3/camel-pop3-store.c
> > ===================================================================
> > RCS file:
> /cvs/gnome/evolution/camel/providers/pop3/camel-pop3-store.c,v
> > retrieving revision 1.106
> > diff -u -r1.106 camel-pop3-store.c
> > --- providers/pop3/camel-pop3-store.c   24 Jun 2004 21:49:41
> -0000      1.106
> > +++ providers/pop3/camel-pop3-store.c   22 Sep 2004 18:02:38 -0000
> > @@ -134,49 +134,35 @@
> >  }
> >  
> >  enum {
> > -       USE_SSL_NEVER,
> > -       USE_SSL_ALWAYS,
> > -       USE_SSL_WHEN_POSSIBLE
> > +       MODE_CLEAR,
> > +       MODE_SSL,
> > +       MODE_TLS,
> >  };
> >  
> >  #define SSL_PORT_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 |
> CAMEL_TCP_STREAM_SSL_ENABLE_SSL3)
> >  #define STARTTLS_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_TLS)
> >  
> >  static gboolean
> > -connect_to_server (CamelService *service, int ssl_mode, int
> try_starttls, CamelException *ex)
> > +connect_to_server (CamelService *service, struct addrinfo *ai, int
> ssl_mode, CamelException *ex)
> >  {
> >         CamelPOP3Store *store = CAMEL_POP3_STORE (service);
> >         CamelStream *tcp_stream;
> >         CamelPOP3Command *pc;
> > -       struct hostent *h;
> >         guint32 flags = 0;
> >         int clean_quit;
> > -       int ret, port;
> > +       int ret;
> >         
> > -       h = camel_service_gethost (service, ex);
> > -       if (!h)
> > -               return FALSE;
> > -       
> > -       port = service->url->port ? service->url->port : 110;
> > -       
> > -       if (ssl_mode != USE_SSL_NEVER) {
> > +       if (ssl_mode != MODE_CLEAR) {
> >  #ifdef HAVE_SSL
> > -               if (try_starttls) {
> > -                       tcp_stream = camel_tcp_stream_ssl_new_raw
> (service->session, service->url->host, STARTTLS_FLAGS);
> > +               if (ssl_mode == MODE_TLS) {
> > +                       tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, STARTTLS_FLAGS);
> >                 } else {
> > -                       port = service->url->port ?
> service->url->port : 995;
> >                         tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, SSL_PORT_FLAGS);
> >                 }
> >  #else
> > -               if (!try_starttls)
> > -                       port = service->url->port ?
> service->url->port : 995;
> > -               
> >                 camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                     _("Could not connect to %s
> (port %d): %s"),
> > -                                     service->url->host, port,
> > -                                     _("SSL unavailable"));
> > -               
> > -               camel_free_host (h);
> > +                                     _("Could not connect to %s:
> %s"),
> > +                                     service->url->host, _("SSL
> unavailable"));
> >                 
> >                 return FALSE;
> >  #endif /* HAVE_SSL */
> > @@ -184,16 +170,15 @@
> >                 tcp_stream = camel_tcp_stream_raw_new ();
> >         }
> >         
> > -       ret = camel_tcp_stream_connect (CAMEL_TCP_STREAM
> (tcp_stream), h, port);
> > -       camel_free_host (h);
> > -       if (ret == -1) {
> > +       if ((ret = camel_tcp_stream_connect ((CamelTcpStream *)
> tcp_stream, ai)) == -1) {
> >                 if (errno == EINTR)
> >                         camel_exception_set (ex,
> CAMEL_EXCEPTION_USER_CANCEL,
> >                                              _("Connection
> cancelled"));
> >                 else
> >                         camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                             _("Could not connect
> to POP server %s (port %d): %s"),
> > -                                             service->url->host,
> port, g_strerror (errno));
> > +                                             _("Could not connect
> to %s: %s"),
> > +                                             service->url->host,
> > +                                             g_strerror (errno));
> >                 
> >                 camel_object_unref (tcp_stream);
> >                 
> > @@ -211,41 +196,23 @@
> >         
> >         if (!(store->engine = camel_pop3_engine_new (tcp_stream,
> flags))) {
> >                 camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
> > -                                     _("Failed to read a valid
> greeting from POP server %s (port %d)"),
> > -                                     service->url->host, port);
> > +                                     _("Failed to read a valid
> greeting from POP server %s"),
> > +                                     service->url->host);
> >                 return FALSE;
> >         }
> >         
> > -#ifdef HAVE_SSL
> > -       if (store->engine) {
> > -               if (ssl_mode == USE_SSL_WHEN_POSSIBLE) {
> > -                       if (store->engine->capa &
> CAMEL_POP3_CAP_STLS)
> > -                               goto starttls;
> > -               } else if (ssl_mode == USE_SSL_ALWAYS) {
> > -                       if (try_starttls) {
> > -                               if (store->engine->capa &
> CAMEL_POP3_CAP_STLS) {
> > -                               /* attempt to toggle STARTTLS mode
> */
> > -                                       goto starttls;
> > -                               } else {
> > -                               /* server doesn't support STARTTLS,
> abort */
> > -                                       camel_exception_setv (ex,
> CAMEL_EXCEPTION_SYSTEM,
> > -                                                            
> _("Failed to connect to POP server %s in secure mode: %s"),
> > -                                                            
> service->url->host, _("SSL/TLS extension not supported."));
> > -                                       /* we have the possibility
> of quitting cleanly here */
> > -                                       clean_quit = TRUE;
> > -                                       goto stls_exception;
> > -                               }
> > -                       }
> > -               }
> > +       if (ssl_mode != MODE_TLS) {
> > +               camel_object_unref (tcp_stream);
> > +               return TRUE;
> >         }
> > -#endif /* HAVE_SSL */
> >         
> > -       camel_object_unref (tcp_stream);
> > -       
> > -       return store->engine != NULL;
> > +       if (!(store->engine->capa & CAMEL_POP3_CAP_STLS)) {
> > +               camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
> > +                                     _("Failed to connect to POP
> server %s in secure mode: STLS not supported"),
> > +                                     service->url->host);
> > +               goto stls_exception;
> > +       }
> >         
> > -#ifdef HAVE_SSL
> > - starttls:
> >         /* as soon as we send a STLS command, all hope is lost of a
> clean QUIT if problems arise */
> >         clean_quit = FALSE;
> >         
> > @@ -295,59 +262,61 @@
> >         store->engine = NULL;
> >         
> >         return FALSE;
> > -#endif /* HAVE_SSL */
> >  }
> >  
> >  static struct {
> >         char *value;
> > +       char *serv;
> >         int mode;
> >  } ssl_options[] = {
> > -       { "",              USE_SSL_ALWAYS        },
> > -       { "always",        USE_SSL_ALWAYS        },
> > -       { "when-possible", USE_SSL_WHEN_POSSIBLE },
> > -       { "never",         USE_SSL_NEVER         },
> > -       { NULL,            USE_SSL_NEVER         },
> > +       { "",              "995", MODE_SSL   },  /* really old (1.x)
> */
> > +       { "ssl",           "995", MODE_SSL   },
> > +       { "always",        "995", MODE_SSL   },  /* old option (1.x)
> */
> > +       { "tls",           "110", MODE_TLS   },
> > +       { "when-possible", "110", MODE_TLS   },  /* old option (1.x)
> */
> > +       { "clear",         "110", MODE_CLEAR },
> > +       { "never",         "110", MODE_CLEAR },  /* old option (1.x)
> */
> > +       { NULL,            "110", MODE_CLEAR },
> >  };
> 
> pop/pops
> 
> >  static gboolean
> >  connect_to_server_wrapper (CamelService *service, CamelException
> *ex)
> >  {
> > -#ifdef HAVE_SSL
> > -       const char *use_ssl;
> > -       int i, ssl_mode;
> > +       struct addrinfo hints, *ai;
> > +       const char *ssl_mode;
> > +       char *serv = NULL;
> > +       int mode, ret, i;
> > +       
> > +       if (service->url->port) {
> > +               serv = g_alloca (16);
> > +               sprintf (serv, "%d", service->url->port);
> > +       }
> >         
> > -       use_ssl = camel_url_get_param (service->url, "use_ssl");
> > -       if (use_ssl) {
> > +       if ((ssl_mode = camel_url_get_param (service->url,
> "ssl_mode"))
> > +           || (ssl_mode = camel_url_get_param (service->url,
> "use_ssl"))) {
> >                 for (i = 0; ssl_options[i].value; i++)
> > -                       if (!strcmp (ssl_options[i].value, use_ssl))
> > +                       if (!strcmp (ssl_options[i].value,
> ssl_mode))
> >                                 break;
> > -               ssl_mode = ssl_options[i].mode;
> > -       } else
> > -               ssl_mode = USE_SSL_NEVER;
> > -       
> > -       if (ssl_mode == USE_SSL_ALWAYS) {
> > -               /* First try the ssl port */
> > -               if (!connect_to_server (service, ssl_mode, FALSE,
> ex)) {
> > -                       if (camel_exception_get_id (ex) ==
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE) {
> > -                               /* The ssl port seems to be
> unavailable, lets try STARTTLS */
> > -                               camel_exception_clear (ex);
> > -                               return connect_to_server (service,
> ssl_mode, TRUE, ex);
> > -                       } else {
> > -                               return FALSE;
> > -                       }
> > -               }
> > -               
> > -               return TRUE;
> > -       } else if (ssl_mode == USE_SSL_WHEN_POSSIBLE) {
> > -               /* If the server supports STARTTLS, use it */
> > -               return connect_to_server (service, ssl_mode, TRUE,
> ex);
> > +               mode = ssl_options[i].mode;
> > +               if (!serv)
> > +                       serv = ssl_options[i].serv;
> >         } else {
> > -               /* User doesn't care about SSL */
> > -               return connect_to_server (service, ssl_mode, FALSE,
> ex);
> > +               mode = MODE_CLEAR;
> > +               if (!serv)
> > +                       serv = "110";
> >         }
> > -#else
> > -       return connect_to_server (service, USE_SSL_NEVER, FALSE,
> ex);
> > -#endif
> > +       
> > +       memset (&hints, 0, sizeof (hints));
> > +       hints.ai_socktype = SOCK_STREAM;
> > +       hints.ai_family = PF_UNSPEC;
> > +       if (!(ai = camel_getaddrinfo (service->url->host, serv,
> &hints, ex)))
> > +               return FALSE;
> > +       
> > +       ret = connect_to_server (service, ai, mode, ex);
> > +       
> > +       camel_freeaddrinfo (ai);
> > +       
> > +       return ret;
> >  }
> >  
> >  extern CamelServiceAuthType camel_pop3_password_authtype;
> > Index: providers/smtp/camel-smtp-transport.c
> > ===================================================================
> > RCS file:
> /cvs/gnome/evolution/camel/providers/smtp/camel-smtp-transport.c,v
> > retrieving revision 1.157
> > diff -u -r1.157 camel-smtp-transport.c
> > --- providers/smtp/camel-smtp-transport.c       14 Jun 2004 02:46:03
> -0000      1.157
> > +++ providers/smtp/camel-smtp-transport.c       22 Sep 2004 18:02:38
> -0000
> > @@ -145,18 +145,7 @@
> >                 CamelProvider *provider, CamelURL *url,
> >                 CamelException *ex)
> >  {
> > -       CamelSmtpTransport *smtp_transport = CAMEL_SMTP_TRANSPORT
> (service);
> > -       const char *use_ssl;
> > -       
> >         CAMEL_SERVICE_CLASS (parent_class)->construct (service,
> session, provider, url, ex);
> > -       
> > -       if ((use_ssl = camel_url_get_param (url, "use_ssl"))) {
> > -               /* Note: previous versions would use "" to toggle
> use_ssl to 'on' */
> > -               if (!*use_ssl || !strcmp (use_ssl, "always"))
> > -                       smtp_transport->flags |=
> CAMEL_SMTP_TRANSPORT_USE_SSL_ALWAYS;
> > -               else if (!strcmp (use_ssl, "when-possible"))
> > -                       smtp_transport->flags |=
> CAMEL_SMTP_TRANSPORT_USE_SSL_WHEN_POSSIBLE;
> > -       }
> >  }
> >  
> >  static const char *
> > @@ -228,49 +217,41 @@
> >         }
> >  }
> >  
> > +enum {
> > +       MODE_CLEAR,
> > +       MODE_SSL,
> > +       MODE_TLS,
> > +};
> > +
> >  #define SSL_PORT_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 |
> CAMEL_TCP_STREAM_SSL_ENABLE_SSL3)
> >  #define STARTTLS_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_TLS)
> >  
> >  static gboolean
> > -connect_to_server (CamelService *service, int try_starttls,
> CamelException *ex)
> > +connect_to_server (CamelService *service, struct addrinfo *ai, int
> ssl_mode, CamelException *ex)
> >  {
> >         CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT
> (service);
> >         CamelStream *tcp_stream;
> >         char *respbuf = NULL;
> > -       struct hostent *h;
> > -       int port, ret;
> > +       int ret;
> >         
> >         if (!CAMEL_SERVICE_CLASS (parent_class)->connect (service,
> ex))
> >                 return FALSE;
> >         
> > -       h = camel_service_gethost (service, ex);
> > -       if (!h)
> > -               return FALSE;
> > -       
> >         /* set some smtp transport defaults */
> > -       transport->flags &= CAMEL_SMTP_TRANSPORT_USE_SSL; /* reset
> all but ssl flags */
> > +       transport->flags = 0;
> >         transport->authtypes = NULL;
> >         
> > -       port = service->url->port ? service->url->port : SMTP_PORT;
> > -       
> > -       if (transport->flags & CAMEL_SMTP_TRANSPORT_USE_SSL) {
> > +       if (ssl_mode != MODE_CLEAR) {
> >  #ifdef HAVE_SSL
> > -               if (try_starttls) {
> > -                       tcp_stream = camel_tcp_stream_ssl_new_raw
> (service->session, service->url->host, STARTTLS_FLAGS);
> > +               if (ssl_mode == MODE_TLS) {
> > +                       tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, STARTTLS_FLAGS);
> >                 } else {
> > -                       port = service->url->port ?
> service->url->port : 465;
> >                         tcp_stream = camel_tcp_stream_ssl_new
> (service->session, service->url->host, SSL_PORT_FLAGS);
> >                 }
> >  #else
> > -               if (!try_starttls)
> > -                       port = service->url->port ?
> service->url->port : 465;
> > -               
> >                 camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                     _("Could not connect to %s
> (port %d): %s"),
> > -                                     service->url->host, port,
> > -                                     _("SSL unavailable"));
> > -               
> > -               camel_free_host (h);
> > +                                     _("Could not connect to %s:
> %s"),
> > +                                     service->url->host, _("SSL
> unavailable"));
> >                 
> >                 return FALSE;
> >  #endif /* HAVE_SSL */
> > @@ -278,13 +259,14 @@
> >                 tcp_stream = camel_tcp_stream_raw_new ();
> >         }
> >         
> > -       ret = camel_tcp_stream_connect (CAMEL_TCP_STREAM
> (tcp_stream), h, port);
> > -       camel_free_host (h);
> > -       if (ret == -1) {
> > -               camel_exception_setv (ex, errno == EINTR ?
> CAMEL_EXCEPTION_USER_CANCEL : CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > -                                     _("Could not connect to %s
> (port %d): %s"),
> > -                                     service->url->host, port,
> > -                                     g_strerror (errno));
> > +       if ((ret = camel_tcp_stream_connect ((CamelTcpStream *)
> tcp_stream, ai)) == -1) {
> > +               if (errno == EINTR)
> > +                       camel_exception_set (ex,
> CAMEL_EXCEPTION_USER_CANCEL,
> > +                                            _("Connection
> cancelled"));
> > +               else
> > +                       camel_exception_setv (ex,
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
> > +                                             _("Could not connect
> to %s: %s"),
> > +                                             service->url->host,
> g_strerror (errno));
> >                 
> >                 camel_object_unref (tcp_stream);
> >                 
> > @@ -294,7 +276,7 @@
> >         transport->connected = TRUE;
> >         
> >         /* get the localaddr - needed later by smtp_helo */
> > -       transport->localaddr = camel_tcp_stream_get_local_address
> (CAMEL_TCP_STREAM (tcp_stream));
> > +       transport->localaddr = camel_tcp_stream_get_local_address
> (CAMEL_TCP_STREAM (tcp_stream), &transport->localaddrlen);
> >         
> >         transport->ostream = tcp_stream;
> >         transport->istream = camel_stream_buffer_new (tcp_stream,
> CAMEL_STREAM_BUFFER_READ);
> > @@ -328,30 +310,19 @@
> >         /* 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 */
> > -               if (transport->flags &
> CAMEL_SMTP_TRANSPORT_STARTTLS)
> > -                       goto starttls;
> > -       } else if (transport->flags &
> CAMEL_SMTP_TRANSPORT_USE_SSL_ALWAYS) {
> > -               if (try_starttls) {
> > -                       if (transport->flags &
> CAMEL_SMTP_TRANSPORT_STARTTLS) {
> > -                               goto starttls;
> > -                       } else {
> > -                               /* server doesn't support STARTTLS,
> abort */
> > -                               camel_exception_setv (ex,
> CAMEL_EXCEPTION_SYSTEM,
> > -                                                     _("Failed to
> connect to SMTP server %s in secure mode: %s"),
> > -                                                    
> service->url->host, _("server does not appear to support SSL"));
> > -                               goto exception_cleanup;
> > -                       }
> > -               }
> > +       if (ssl_mode != MODE_TLS) {
> > +               /* we're done */
> > +               return TRUE;
> >         }
> > -#endif /* HAVE_SSL */
> >         
> > -       return TRUE;
> > +       if (!(transport->flags & CAMEL_SMTP_TRANSPORT_STARTTLS)) {
> > +               camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
> > +                                     _("Failed to connect to SMTP
> server %s in secure mode: STARTTLS not supported"),
> > +                                     service->url->host);
> > +               
> > +               goto exception_cleanup;
> > +       }
> >         
> > -#ifdef HAVE_SSL
> > - starttls:
> >         d(fprintf (stderr, "sending : STARTTLS\r\n"));
> >         if (camel_stream_write (tcp_stream, "STARTTLS\r\n", 10) ==
> -1) {
> >                 camel_exception_setv (ex, errno == EINTR ?
> CAMEL_EXCEPTION_USER_CANCEL : CAMEL_EXCEPTION_SYSTEM,
> > @@ -401,38 +372,61 @@
> >         transport->connected = FALSE;
> >         
> >         return FALSE;
> > -#endif /* HAVE_SSL */
> >  }
> >  
> > +static struct {
> > +       char *value;
> > +       char *serv;
> > +       int mode;
> > +} ssl_options[] = {
> > +       { "",              "465", MODE_SSL   },  /* really old (1.x)
> */
> > +       { "ssl",           "465", MODE_SSL   },
> > +       { "always",        "465", MODE_SSL   },  /* old option (1.x)
> */
> > +       { "tls",           "25",  MODE_TLS   },
> > +       { "when-possible", "25",  MODE_TLS   },  /* old option (1.x)
> */
> > +       { "clear",         "25",  MODE_CLEAR },
> > +       { "never",         "25",  MODE_CLEAR },  /* old option (1.x)
> */
> > +       { NULL,            "25",  MODE_CLEAR },
> > +};
> 
> smtp/smtps
> 
> >  static gboolean
> >  connect_to_server_wrapper (CamelService *service, CamelException
> *ex)
> >  {
> > -#ifdef HAVE_SSL
> > -       CamelSmtpTransport *transport = (CamelSmtpTransport *)
> service;
> > -       
> > -       if (transport->flags & CAMEL_SMTP_TRANSPORT_USE_SSL_ALWAYS)
> {
> > -               /* First try connecting to the SSL port  */
> > -               if (!connect_to_server (service, FALSE, ex)) {
> > -                       if (camel_exception_get_id (ex) ==
> CAMEL_EXCEPTION_SERVICE_UNAVAILABLE) {
> > -                               /* Seems the SSL port is
> unavailable, lets try STARTTLS */
> > -                               camel_exception_clear (ex);
> > -                               return connect_to_server (service,
> TRUE, ex);
> > -                       } else {
> > -                               return FALSE;
> > -                       }
> > -               }
> > -               
> > -               return TRUE;
> > -       } else if (transport->flags &
> CAMEL_SMTP_TRANSPORT_USE_SSL_WHEN_POSSIBLE) {
> > -               /* If the server supports STARTTLS, use it */
> > -               return connect_to_server (service, TRUE, ex);
> > +       struct addrinfo hints, *ai;
> > +       const char *ssl_mode;
> > +       int mode, ret, i;
> > +       char *serv = NULL;
> > +       
> > +       if (service->url->port) {
> > +               serv = g_alloca (16);
> > +               sprintf (serv, "%d", service->url->port);
> > +       }
> > +       
> > +       if ((ssl_mode = camel_url_get_param (service->url,
> "ssl_mode"))
> > +           || (ssl_mode = camel_url_get_param (service->url,
> "use_ssl"))) {
> > +               for (i = 0; ssl_options[i].value; i++)
> > +                       if (!strcmp (ssl_options[i].value,
> ssl_mode))
> > +                               break;
> > +               mode = ssl_options[i].mode;
> > +               if (!serv)
> > +                       serv = ssl_options[i].serv;
> >         } else {
> > -               /* User doesn't care about SSL */
> > -               return connect_to_server (service, FALSE, ex);
> > +               mode = MODE_CLEAR;
> > +               if (!serv)
> > +                       serv = "25";
> >         }
> > -#else
> > -       return connect_to_server (service, FALSE, ex);
> > -#endif
> > +       
> > +       memset (&hints, 0, sizeof (hints));
> > +       hints.ai_socktype = SOCK_STREAM;
> > +       hints.ai_family = PF_UNSPEC;
> > +       if (!(ai = camel_getaddrinfo (service->url->host, serv,
> &hints, ex)))
> > +               return FALSE;
> > +       
> > +       ret = connect_to_server (service, ai, mode, ex);
> > +       
> > +       camel_freeaddrinfo (ai);
> > +       
> > +       return ret;
> >  }
> >  
> >  static gboolean
> > @@ -580,7 +574,7 @@
> >                 transport->ostream = NULL;
> >         }
> >         
> > -       camel_tcp_address_free (transport->localaddr);
> > +       g_free(transport->localaddr);
> >         transport->localaddr = NULL;
> >         
> >         transport->connected = FALSE;
> > @@ -865,10 +859,7 @@
> >  {
> >         /* say hello to the server */
> >         char *name = NULL, *cmdbuf = NULL, *respbuf = NULL;
> > -       struct hostent *host;
> > -       CamelException err;
> >         const char *token;
> > -       int af;
> >         
> >         /* these are flags that we set, so unset them in case we
> >            are being called a second time (ie, after a STARTTLS) */
> > @@ -883,42 +874,10 @@
> >         }
> >         
> >         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, &err);
> > -       
> > -       camel_exception_clear (&err);
> > -       
> > -       if (host && host->h_name && *host->h_name) {
> > -               name = g_strdup (host->h_name);
> > -       } else {
> > -#ifdef ENABLE_IPv6
> > -               char ip[MAXHOSTNAMELEN + 1];
> > -               const char *proto;
> > -               
> > -               proto = transport->localaddr->family ==
> CAMEL_TCP_ADDRESS_IPv6 ? "IPv6:" : "";
> > -               name = g_strdup_printf ("[%s%s]", proto, 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
> > -       }
> > -       
> > -       if (host)
> > -               camel_free_host (host);
> > +
> > +       /* this can't really fail with the flags we're using, it
> should fallback to numerical */
> > +       if (camel_getnameinfo(transport->localaddr,
> transport->localaddrlen, &name, NULL, 0, NULL) != 0)
> > +               name = g_strdup("localhost.localdomain");
> >         
> >         /* hiya server! how are you today? */
> >         if (transport->flags & CAMEL_SMTP_TRANSPORT_IS_ESMTP)
> > Index: providers/smtp/camel-smtp-transport.h
> > ===================================================================
> > RCS file:
> /cvs/gnome/evolution/camel/providers/smtp/camel-smtp-transport.h,v
> > retrieving revision 1.17
> > diff -u -r1.17 camel-smtp-transport.h
> > --- providers/smtp/camel-smtp-transport.h       7 Oct 2002 18:13:53
> -0000       1.17
> > +++ providers/smtp/camel-smtp-transport.h       22 Sep 2004 18:02:38
> -0000
> > @@ -22,17 +22,14 @@
> >   * USA
> >   */
> >  
> > -
> >  #ifndef CAMEL_SMTP_TRANSPORT_H
> >  #define CAMEL_SMTP_TRANSPORT_H 1
> >  
> > -
> >  #ifdef __cplusplus
> >  extern "C" {
> >  #pragma }
> >  #endif /* __cplusplus */
> >  
> > -
> >  #include "camel-transport.h"
> >  #include "camel-tcp-stream.h"
> >  
> > @@ -41,19 +38,12 @@
> >  #define CAMEL_SMTP_TRANSPORT_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k),
> CAMEL_SMTP_TRANSPORT_TYPE, CamelSmtpTransportClass))
> >  #define CAMEL_IS_SMTP_TRANSPORT(o)    (CAMEL_CHECK_TYPE((o),
> CAMEL_SMTP_TRANSPORT_TYPE))
> >  
> > -
> >  #define CAMEL_SMTP_TRANSPORT_IS_ESMTP               (1 << 0)
> >  #define CAMEL_SMTP_TRANSPORT_8BITMIME               (1 << 1)
> >  #define CAMEL_SMTP_TRANSPORT_ENHANCEDSTATUSCODES    (1 << 2)
> >  #define CAMEL_SMTP_TRANSPORT_STARTTLS               (1 << 3)
> >  
> > -#define CAMEL_SMTP_TRANSPORT_USE_SSL_ALWAYS         (1 << 4)
> > -#define CAMEL_SMTP_TRANSPORT_USE_SSL_WHEN_POSSIBLE  (1 << 5)
> > -
> > -#define CAMEL_SMTP_TRANSPORT_USE_SSL               
> (CAMEL_SMTP_TRANSPORT_USE_SSL_ALWAYS | \
> > -                                                   
> CAMEL_SMTP_TRANSPORT_USE_SSL_WHEN_POSSIBLE)
> > -
> > -#define CAMEL_SMTP_TRANSPORT_AUTH_EQUAL             (1 << 6)  /*
> set if we are using authtypes from a broken AUTH= */
> > +#define CAMEL_SMTP_TRANSPORT_AUTH_EQUAL             (1 << 4)  /*
> set if we are using authtypes from a broken AUTH= */
> >  
> >  typedef struct {
> >         CamelTransport parent_object;
> > @@ -63,20 +53,17 @@
> >         guint32 flags;
> >         
> >         gboolean connected;
> > -       CamelTcpAddress *localaddr;
> > +       struct sockaddr *localaddr;
> > +       socklen_t localaddrlen;
> >         
> >         GHashTable *authtypes;
> > -       
> >  } CamelSmtpTransport;
> >  
> > -
> > -
> >  typedef struct {
> >         CamelTransportClass parent_class;
> >  
> >  } CamelSmtpTransportClass;
> >  
> > -
> >  /* Standard Camel function */
> >  CamelType camel_smtp_transport_get_type (void);
> >  
> > @@ -85,5 +72,3 @@
> >  #endif /* __cplusplus */
> >  
> >  #endif /* CAMEL_SMTP_TRANSPORT_H */
> > -
> > -




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]