Added SOCKS proxy support.
[claws.git] / src / common / session.c
index 0e4a62d34aec731c088bdd7307742b91a3fba6d5..1342ef947f48e4b66697c46488929667f1a028dc 100644 (file)
@@ -102,6 +102,8 @@ void session_init(Session *session, const void *prefs_account, gboolean is_smtp)
        session->is_smtp = is_smtp;
 
        session->ping_tag = -1;
+
+       session->proxy_info = NULL;
 }
 
 /*!
@@ -123,6 +125,11 @@ gint session_connect(Session *session, const gchar *server, gushort port)
        session->server = g_strdup(server);
        session->port = port;
 
+       if (session->proxy_info) {
+               server = session->proxy_info->proxy_host;
+               port = session->proxy_info->proxy_port;
+       }
+
        session->conn_id = sock_connect_async(server, port, session_connect_cb,
                                              session);
        if (session->conn_id < 0) {
@@ -173,6 +180,18 @@ static gint session_connect_cb(SockInfo *sock, gpointer data)
        sock->is_smtp = session->is_smtp;
        sock->ssl_cert_auto_accept = session->ssl_cert_auto_accept;
 
+       if (session->proxy_info) {
+               debug_print("connecting through socks\n");
+               sock_set_nonblocking_mode(sock, FALSE);
+               if (proxy_connect(sock, session->server, session->port,
+                                       session->proxy_info) < 0) {
+                       g_warning("can't establish SOCKS connection.");
+                       session->state = SESSION_ERROR;
+                       return -1;
+               }
+       }
+
+
 #ifdef USE_GNUTLS
        sock->gnutls_priority = session->gnutls_priority;