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;
enum login_proxy_ssl_flags ssl_flags;
proxy_callback_t *callback;
- void *context;
unsigned int destroying:1;
unsigned int disconnecting:1;
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)
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;
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);
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)
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);
i_stream_destroy(&proxy->server_input);
proxy->callback = NULL;
- proxy->context = NULL;
DLLIST_PREPEND(&login_proxies, proxy);
};
/* 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);