]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
login: Proxy code API cleanup.
authorTimo Sirainen <tss@iki.fi>
Sun, 31 Jan 2010 14:13:07 +0000 (16:13 +0200)
committerTimo Sirainen <tss@iki.fi>
Sun, 31 Jan 2010 14:13:07 +0000 (16:13 +0200)
--HG--
branch : HEAD

src/login-common/client-common-auth.c
src/login-common/login-proxy.c
src/login-common/login-proxy.h

index f59e14f5dedb52c4298f2b0d2af4f078c89fc491..4f78ff01088d62c6d87b8fa965b2869aea3aa70f 100644 (file)
@@ -258,9 +258,8 @@ static int proxy_start(struct client *client,
        proxy_set.connect_timeout_msecs = reply->proxy_timeout_msecs;
        proxy_set.ssl_flags = reply->ssl_flags;
 
-       client->login_proxy =
-               login_proxy_new(client, &proxy_set, proxy_input, client);
-       if (client->login_proxy == NULL) {
+       if (login_proxy_new(client, &proxy_set, proxy_input,
+                           &client->login_proxy) < 0) {
                client_send_line(client, CLIENT_CMD_REPLY_AUTH_FAIL_TEMP,
                                 PROXY_FAILURE_MSG);
                return -1;
index dd945448946b61e093ab22701dd490742e482549..5e2491abba4cafd183d496df05eeaf8068be88d6 100644 (file)
@@ -37,7 +37,6 @@ struct login_proxy {
        enum login_proxy_ssl_flags ssl_flags;
 
        proxy_callback_t *callback;
-       void *context;
 
        unsigned int destroying:1;
        unsigned int disconnecting:1;
@@ -124,7 +123,7 @@ static int proxy_client_output(struct login_proxy *proxy)
 
 static void proxy_prelogin_input(struct login_proxy *proxy)
 {
-       proxy->callback(proxy->context);
+       proxy->callback(proxy->client);
 }
 
 static void proxy_plain_connected(struct login_proxy *proxy)
@@ -190,10 +189,9 @@ static void proxy_connect_timeout(struct login_proxy *proxy)
        login_proxy_free(&proxy);
 }
 
-#undef login_proxy_new
-struct login_proxy *
-login_proxy_new(struct client *client, const struct login_proxy_settings *set,
-               proxy_callback_t *callback, void *context)
+int login_proxy_new(struct client *client,
+                   const struct login_proxy_settings *set,
+                   proxy_callback_t *callback, struct login_proxy **proxy_r)
 {
        struct login_proxy *proxy;
        struct login_proxy_record *rec;
@@ -202,27 +200,27 @@ login_proxy_new(struct client *client, const struct login_proxy_settings *set,
 
        if (set->host == NULL) {
                i_error("proxy(%s): host not given", client->virtual_user);
-               return NULL;
+               return -1;
        }
 
        if (net_addr2ip(set->host, &ip) < 0) {
                i_error("proxy(%s): %s is not a valid IP",
                        client->virtual_user, set->host);
-               return NULL;
+               return -1;
        }
 
        rec = login_proxy_state_get(proxy_state, &ip, set->port);
        if (timeval_cmp(&rec->last_failure, &rec->last_success) > 0 &&
            rec->num_waiting_connections != 0) {
                /* the server is down. fail immediately */
-              return NULL;
+              return -1;
        }
 
        fd = net_connect_ip(&ip, set->port, NULL);
        if (fd < 0) {
                i_error("proxy(%s): connect(%s, %u) failed: %m",
                        client->virtual_user, set->host, set->port);
-               return NULL;
+               return -1;
        }
 
        proxy = i_new(struct login_proxy, 1);
@@ -240,15 +238,15 @@ login_proxy_new(struct client *client, const struct login_proxy_settings *set,
                proxy->to = timeout_add(set->connect_timeout_msecs,
                                        proxy_connect_timeout, proxy);
        }
-
        proxy->callback = callback;
-       proxy->context = context;
 
        proxy->client_fd = -1;
 
        proxy->state_rec = rec;
        rec->num_waiting_connections++;
-       return proxy;
+
+       *proxy_r = proxy;
+       return 0;
 }
 
 void login_proxy_free(struct login_proxy **_proxy)
@@ -296,7 +294,7 @@ void login_proxy_free(struct login_proxy **_proxy)
                i_assert(proxy->client_io == NULL);
                i_assert(proxy->client_output == NULL);
 
-               proxy->callback(proxy->context);
+               proxy->callback(proxy->client);
        }
 
        net_disconnect(proxy->server_fd);
@@ -384,7 +382,6 @@ void login_proxy_detach(struct login_proxy *proxy)
        i_stream_destroy(&proxy->server_input);
 
        proxy->callback = NULL;
-       proxy->context = NULL;
 
        DLLIST_PREPEND(&login_proxies, proxy);
 
index 87cbedb116802b9f79b03cb860733f05bb96472d..f1097809bb0fade57bae28df6e8df37141de2d5b 100644 (file)
@@ -21,22 +21,13 @@ struct login_proxy_settings {
 };
 
 /* Called when new input comes from proxy. */
-typedef void proxy_callback_t(void *context);
+typedef void proxy_callback_t(struct client *client);
 
 /* Create a proxy to given host. Returns NULL if failed. Given callback is
    called when new input is available from proxy. */
-struct login_proxy *
-login_proxy_new(struct client *client, const struct login_proxy_settings *set,
-               proxy_callback_t *callback, void *context);
-#ifdef CONTEXT_TYPE_SAFETY
-#  define login_proxy_new(client, set, callback, context) \
-       ({(void)(1 ? 0 : callback(context)); \
-         login_proxy_new(client, set, \
-               (proxy_callback_t *)callback, context); })
-#else
-#  define login_proxy_new(client, set, callback, context) \
-         login_proxy_new(client, set, (proxy_callback_t *)callback, context)
-#endif
+int login_proxy_new(struct client *client,
+                   const struct login_proxy_settings *set,
+                   proxy_callback_t *callback, struct login_proxy **proxy_r);
 /* Free the proxy. This should be called if authentication fails. */
 void login_proxy_free(struct login_proxy **proxy);