Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3308:3f090bcaffcc HEAD
Allow multiple master connections for a single listener.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 19 Apr 2005 16:11:12 +0300 |
parents | 38754475d3b6 |
children | 46ca6b941177 |
files | src/auth/Makefile.am src/auth/auth-client-connection.c src/auth/auth-client-connection.h src/auth/auth-master-connection.c src/auth/auth-master-connection.h src/auth/auth-master-listener.c src/auth/auth-master-listener.h src/auth/auth-request-handler.c src/auth/auth-request-handler.h src/auth/auth-request.h src/auth/main.c |
diffstat | 11 files changed, 312 insertions(+), 253 deletions(-) [+] |
line wrap: on
line diff
--- a/src/auth/Makefile.am Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/Makefile.am Tue Apr 19 16:11:12 2005 +0300 @@ -36,6 +36,7 @@ auth-cache.c \ auth-client-connection.c \ auth-master-connection.c \ + auth-master-listener.c \ auth-module.c \ auth-request.c \ auth-request-handler.c \ @@ -83,6 +84,7 @@ auth-client-interface.h \ auth-master-interface.h \ auth-master-connection.h \ + auth-master-listener.h \ auth-module.h \ auth-request.h \ auth-request-handler.h \
--- a/src/auth/auth-client-connection.c Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/auth-client-connection.c Tue Apr 19 16:11:12 2005 +0300 @@ -10,6 +10,7 @@ #include "auth-request-handler.h" #include "auth-client-interface.h" #include "auth-client-connection.h" +#include "auth-master-listener.h" #include "auth-master-connection.h" #include <stdlib.h> @@ -81,7 +82,7 @@ return FALSE; } - old = auth_client_connection_lookup(conn->master, pid); + old = auth_client_connection_lookup(conn->listener, pid); if (old != NULL) { /* already exists. it's possible that it just reconnected, see if the old connection is still there. */ @@ -100,17 +101,11 @@ /* handshake complete, we can now actually start serving requests */ conn->refcount++; - if (!AUTH_MASTER_IS_DUMMY(conn->master)) { - conn->request_handler = - auth_request_handler_create(conn->auth, FALSE, - auth_callback, conn, - auth_master_request_callback, conn->master); - } else { - conn->request_handler = - auth_request_handler_create(conn->auth, FALSE, - auth_callback, conn, - NULL, NULL); - } + conn->request_handler = + auth_request_handler_create(conn->auth, FALSE, + auth_callback, conn, + array_count(&conn->listener->masters) != 0 ? + auth_master_request_callback : NULL); auth_request_handler_set(conn->request_handler, conn->connect_uid, pid); conn->pid = pid; @@ -219,7 +214,7 @@ } struct auth_client_connection * -auth_client_connection_create(struct auth_master_connection *master, int fd) +auth_client_connection_create(struct auth_master_listener *listener, int fd) { static unsigned int connect_uid_counter = 0; struct auth_client_connection *conn; @@ -227,8 +222,8 @@ string_t *str; conn = i_new(struct auth_client_connection, 1); - conn->auth = master->auth; - conn->master = master; + conn->auth = listener->auth; + conn->listener = listener; conn->refcount = 1; conn->connect_uid = ++connect_uid_counter; @@ -241,14 +236,13 @@ o_stream_set_flush_callback(conn->output, auth_client_output, conn); conn->io = io_add(fd, IO_READ, auth_client_input, conn); - conn->next = master->clients; - master->clients = conn; + array_append(&listener->clients, &conn, 1); str = t_str_new(128); str_printfa(str, "VERSION\t%u\t%u\nSPID\t%u\nCUID\t%u\nDONE\n", AUTH_CLIENT_PROTOCOL_MAJOR_VERSION, AUTH_CLIENT_PROTOCOL_MINOR_VERSION, - master->pid, conn->connect_uid); + listener->pid, conn->connect_uid); iov[0].iov_base = str_data(conn->auth->mech_handshake); iov[0].iov_len = str_len(conn->auth->mech_handshake); @@ -265,14 +259,16 @@ void auth_client_connection_destroy(struct auth_client_connection *conn) { - struct auth_client_connection **pos; + struct auth_client_connection *const *clients; + unsigned int i, count; if (conn->fd == -1) return; - for (pos = &conn->master->clients; *pos != NULL; pos = &(*pos)->next) { - if (*pos == conn) { - *pos = conn->next; + clients = array_get(&conn->listener->clients, &count); + for (i = 0; i < count; i++) { + if (clients[i] == conn) { + array_delete(&conn->listener->clients, i, 1); break; } } @@ -291,7 +287,6 @@ if (conn->request_handler != NULL) auth_request_handler_unref(conn->request_handler); - conn->master = NULL; auth_client_connection_unref(conn); } @@ -306,48 +301,45 @@ } struct auth_client_connection * -auth_client_connection_lookup(struct auth_master_connection *master, +auth_client_connection_lookup(struct auth_master_listener *listener, unsigned int pid) { - struct auth_client_connection *conn; + struct auth_client_connection *const *clients; + unsigned int i, count; - for (conn = master->clients; conn != NULL; conn = conn->next) { - if (conn->pid == pid) - return conn; + clients = array_get(&listener->clients, &count); + for (i = 0; i < count; i++) { + if (clients[i]->pid == pid) + return clients[i]; } return NULL; } -static void request_timeout(void *context __attr_unused__) +static void request_timeout(void *context) { - struct auth_master_connection *master = context; - struct auth_client_connection *conn; + struct auth_master_listener *listener = context; + struct auth_client_connection *const *clients; + unsigned int i, count; - for (conn = master->clients; conn != NULL; conn = conn->next) { - if (conn->request_handler == NULL) - continue; - auth_request_handler_check_timeouts(conn->request_handler); + clients = array_get(&listener->clients, &count); + for (i = 0; i < count; i++) { + if (clients[i]->request_handler != NULL) { + auth_request_handler_check_timeouts( + clients[i]->request_handler); + } } } -void auth_client_connections_init(struct auth_master_connection *master) +void auth_client_connections_init(struct auth_master_listener *listener) { - master->to_clients = timeout_add(5000, request_timeout, master); + listener->to_clients = timeout_add(5000, request_timeout, listener); } -void auth_client_connections_deinit(struct auth_master_connection *master) +void auth_client_connections_deinit(struct auth_master_listener *listener) { - struct auth_client_connection *next; - - while (master->clients != NULL) { - next = master->clients->next; - auth_client_connection_destroy(master->clients); - master->clients = next; - } - - if (master->to_clients != NULL) { - timeout_remove(master->to_clients); - master->to_clients = NULL; + if (listener->to_clients != NULL) { + timeout_remove(listener->to_clients); + listener->to_clients = NULL; } }
--- a/src/auth/auth-client-connection.h Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/auth-client-connection.h Tue Apr 19 16:11:12 2005 +0300 @@ -2,10 +2,8 @@ #define __AUTH_CLIENT_CONNECTION_H struct auth_client_connection { - struct auth_client_connection *next; - struct auth *auth; - struct auth_master_connection *master; + struct auth_master_listener *listener; int refcount; int fd; @@ -21,14 +19,14 @@ }; struct auth_client_connection * -auth_client_connection_create(struct auth_master_connection *master, int fd); +auth_client_connection_create(struct auth_master_listener *listener, int fd); void auth_client_connection_destroy(struct auth_client_connection *conn); struct auth_client_connection * -auth_client_connection_lookup(struct auth_master_connection *master, +auth_client_connection_lookup(struct auth_master_listener *listener, unsigned int pid); -void auth_client_connections_init(struct auth_master_connection *master); -void auth_client_connections_deinit(struct auth_master_connection *master); +void auth_client_connections_init(struct auth_master_listener *listener); +void auth_client_connections_deinit(struct auth_master_listener *listener); #endif
--- a/src/auth/auth-master-connection.c Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/auth-master-connection.c Tue Apr 19 16:11:12 2005 +0300 @@ -12,6 +12,7 @@ #include "auth-request-handler.h" #include "auth-master-interface.h" #include "auth-client-connection.h" +#include "auth-master-listener.h" #include "auth-master-connection.h" #include <unistd.h> @@ -20,32 +21,20 @@ #define MAX_INBUF_SIZE 1024 #define MAX_OUTBUF_SIZE (1024*50) -struct auth_listener { - struct auth_master_connection *master; - enum listener_type type; - int fd; - char *path; - struct io *io; -}; - struct master_userdb_request { struct auth_master_connection *conn; unsigned int id; struct auth_request *auth_request; }; -static array_t ARRAY_DEFINE(master_connections, - struct auth_master_connection *); - static int master_output(void *context); -static void auth_listener_destroy(struct auth_listener *l); void auth_master_request_callback(const char *reply, void *context) { struct auth_master_connection *conn = context; struct const_iovec iov[2]; - if (conn->auth->verbose_debug) + if (conn->listener->auth->verbose_debug) i_info("master out: %s", reply); iov[0].iov_base = reply; @@ -74,7 +63,7 @@ client_pid = (unsigned int)strtoul(list[1], NULL, 10); client_id = (unsigned int)strtoul(list[2], NULL, 10); - client_conn = auth_client_connection_lookup(conn, client_pid); + client_conn = auth_client_connection_lookup(conn->listener, client_pid); if (client_conn == NULL) { i_error("Master requested auth for nonexisting client %u", client_pid); @@ -82,7 +71,7 @@ t_strdup_printf("NOTFOUND\t%u\n", id)); } else { auth_request_handler_master_request( - client_conn->request_handler, id, client_id); + client_conn->request_handler, conn, id, client_id); } return TRUE; } @@ -117,7 +106,7 @@ return FALSE; } - auth_request = auth_request_new_dummy(conn->auth); + auth_request = auth_request_new_dummy(conn->listener->auth); auth_request->id = (unsigned int)strtoul(list[0], NULL, 10); auth_request->user = p_strdup(auth_request->pool, list[1]); auth_request->context = conn; @@ -170,7 +159,7 @@ } while ((line = i_stream_next_line(conn->input)) != NULL) { - if (conn->auth->verbose_debug) + if (conn->listener->auth->verbose_debug) i_info("master in: %s", line); t_push(); @@ -211,16 +200,14 @@ return 1; } -static void -auth_master_connection_set_fd(struct auth_master_connection *conn, int fd) +struct auth_master_connection * +auth_master_connection_create(struct auth_master_listener *listener, int fd) { - if (conn->input != NULL) - i_stream_unref(conn->input); - if (conn->output != NULL) - o_stream_unref(conn->output); - if (conn->io != NULL) - io_remove(conn->io); + struct auth_master_connection *conn; + conn = i_new(struct auth_master_connection, 1); + conn->listener = listener; + conn->fd = fd; conn->input = i_stream_create_file(fd, default_pool, MAX_INBUF_SIZE, FALSE); conn->output = o_stream_create_file(fd, default_pool, @@ -228,22 +215,7 @@ o_stream_set_flush_callback(conn->output, master_output, conn); conn->io = io_add(fd, IO_READ, master_input, conn); - conn->fd = fd; -} - -struct auth_master_connection * -auth_master_connection_create(struct auth *auth, int fd) -{ - struct auth_master_connection *conn; - - conn = i_new(struct auth_master_connection, 1); - conn->auth = auth; - conn->pid = (unsigned int)getpid(); - conn->fd = fd; - conn->listeners_buf = buffer_create_dynamic(default_pool, 64); - if (fd != -1) - auth_master_connection_set_fd(conn, fd); - array_append(&master_connections, &conn, 1); + array_append(&listener->masters, &conn, 1); return conn; } @@ -256,22 +228,20 @@ line = t_strdup_printf("VERSION\t%u\t%u\nSPID\t%u\n", AUTH_MASTER_PROTOCOL_MAJOR_VERSION, - AUTH_MASTER_PROTOCOL_MINOR_VERSION, conn->pid); + AUTH_MASTER_PROTOCOL_MINOR_VERSION, + conn->listener->pid); (void)o_stream_send_str(conn->output, line); } void auth_master_connection_destroy(struct auth_master_connection *conn) { struct auth_master_connection *const *conns; - struct auth_listener **l; unsigned int i, count; if (conn->destroyed) return; conn->destroyed = TRUE; - auth_client_connections_deinit(conn); - if (conn->fd != -1) { if (close(conn->fd) < 0) i_error("close(): %m"); @@ -283,114 +253,15 @@ if (conn->io != NULL) io_remove(conn->io); - while (conn->listeners_buf->used > 0) { - l = buffer_get_modifyable_data(conn->listeners_buf, NULL); - auth_listener_destroy(*l); - } - buffer_free(conn->listeners_buf); - conn->listeners_buf = NULL; - - conns = array_get(&master_connections, &count); + conns = array_get(&conn->listener->masters, &count); for (i = 0; i < count; i++) { if (conns[i] == conn) { - array_delete(&master_connections, i, 1); + array_delete(&conn->listener->masters, i, 1); break; } } - if (!standalone && array_count(&master_connections) == 0) + if (!standalone && auth_master_listeners_masters_left() == 0) io_loop_stop(ioloop); i_free(conn); } - -static void auth_accept(void *context) -{ - struct auth_listener *l = context; - int fd; - - fd = net_accept(l->fd, NULL, NULL); - if (fd < 0) { - if (fd < -1) - i_fatal("accept(type %d) failed: %m", l->type); - } else { - net_set_nonblock(fd, TRUE); - switch (l->type) { - case LISTENER_CLIENT: - (void)auth_client_connection_create(l->master, fd); - break; - case LISTENER_MASTER: - /* we'll just replace the previous master.. */ - auth_master_connection_set_fd(l->master, fd); - auth_master_connection_send_handshake(l->master); - break; - } - } -} - -void auth_master_connection_add_listener(struct auth_master_connection *conn, - int fd, const char *path, - enum listener_type type) -{ - struct auth_listener *l; - - l = i_new(struct auth_listener, 1); - l->master = conn; - l->type = type; - l->fd = fd; - l->path = i_strdup(path); - l->io = io_add(fd, IO_READ, auth_accept, l); - - buffer_append(conn->listeners_buf, &l, sizeof(l)); -} - -static void auth_listener_destroy(struct auth_listener *l) -{ - struct auth_listener **lp; - size_t i, size; - - lp = buffer_get_modifyable_data(l->master->listeners_buf, &size); - size /= sizeof(*lp); - - for (i = 0; i < size; i++) { - if (lp[i] == l) { - buffer_delete(l->master->listeners_buf, - i * sizeof(l), sizeof(l)); - break; - } - } - - net_disconnect(l->fd); - io_remove(l->io); - if (l->path != NULL) { - (void)unlink(l->path); - i_free(l->path); - } - i_free(l); -} - -void auth_master_connections_send_handshake(void) -{ - struct auth_master_connection *const *conns; - unsigned int i, count; - - conns = array_get(&master_connections, &count); - for (i = 0; i < count; i++) - auth_master_connection_send_handshake(conns[i]); -} - -void auth_master_connections_init(void) -{ - ARRAY_CREATE(&master_connections, default_pool, - struct auth_master_connection *, 16); -} - -void auth_master_connections_deinit(void) -{ - struct auth_master_connection *const *conns; - unsigned int i, count; - - conns = array_get(&master_connections, &count); - for (i = count; i > 0; i--) - auth_master_connection_destroy(conns[i]); - array_free(&master_connections); -}
--- a/src/auth/auth-master-connection.h Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/auth-master-connection.h Tue Apr 19 16:11:12 2005 +0300 @@ -1,34 +1,20 @@ #ifndef __AUTH_MASTER_CONNECTION_H #define __AUTH_MASTER_CONNECTION_H -enum listener_type { - LISTENER_MASTER, - LISTENER_CLIENT -}; - struct auth_master_connection { - struct auth *auth; - - unsigned int pid; - int refcount; + struct auth_master_listener *listener; int fd; struct istream *input; struct ostream *output; struct io *io; - buffer_t *listeners_buf; - - struct auth_client_connection *clients; - struct timeout *to_clients; unsigned int version_received:1; unsigned int destroyed:1; }; -#define AUTH_MASTER_IS_DUMMY(master) (master->fd == -1) - struct auth_master_connection * -auth_master_connection_create(struct auth *auth, int fd); +auth_master_connection_create(struct auth_master_listener *listener, int fd); void auth_master_connection_destroy(struct auth_master_connection *conn); void auth_master_connection_send_handshake(struct auth_master_connection *conn); @@ -36,11 +22,4 @@ void auth_master_request_callback(const char *reply, void *context); -void auth_master_connection_add_listener(struct auth_master_connection *conn, - int fd, const char *path, - enum listener_type type); - -void auth_master_connections_init(void); -void auth_master_connections_deinit(void); - #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/auth/auth-master-listener.c Tue Apr 19 16:11:12 2005 +0300 @@ -0,0 +1,185 @@ +/* Copyright (C) 2005 Timo Sirainen */ + +#include "common.h" +#include "ioloop.h" +#include "network.h" +#include "istream.h" +#include "ostream.h" +#include "auth-master-listener.h" +#include "auth-master-connection.h" +#include "auth-client-connection.h" + +#include <unistd.h> + +struct auth_master_listener_socket { + struct auth_master_listener *listener; + + enum listener_type type; + int fd; + char *path; + struct io *io; +}; + +static array_t ARRAY_DEFINE(master_listeners, struct auth_master_listener *); + +struct auth_master_listener *auth_master_listener_create(struct auth *auth) +{ + struct auth_master_listener *listener; + + listener = i_new(struct auth_master_listener, 1); + listener->auth = auth; + listener->pid = (unsigned int)getpid(); + ARRAY_CREATE(&listener->sockets, default_pool, + struct auth_master_listener_socket *, 16); + ARRAY_CREATE(&listener->masters, default_pool, + struct auth_master_connection *, 16); + ARRAY_CREATE(&listener->clients, default_pool, + struct auth_client_connection *, 16); + auth_client_connections_init(listener); + + array_append(&master_listeners, &listener, 1); + return listener; +} + +static void +auth_master_listener_socket_free(struct auth_master_listener_socket *socket) +{ + if (socket->path != NULL) { + (void)unlink(socket->path); + i_free(socket->path); + } + + net_disconnect(socket->fd); + io_remove(socket->io); + i_free(socket); +} + +void auth_master_listener_destroy(struct auth_master_listener *listener) +{ + struct auth_master_listener *const *listeners; + struct auth_master_listener_socket *const *sockets; + struct auth_master_connection *const *masters; + struct auth_client_connection *const *clients; + unsigned int i, count; + + array_append(&master_listeners, &listener, 1); + + listeners = array_get(&master_listeners, &count); + for (i = 0; i < count; i++) { + if (listeners[i] == listener) { + array_delete(&master_listeners, i, 1); + break; + } + } + + sockets = array_get(&listener->sockets, &count); + for (i = count; i > 0; i--) + auth_master_listener_socket_free(sockets[i-1]); + + masters = array_get(&listener->masters, &count); + for (i = count; i > 0; i--) + auth_master_connection_destroy(masters[i-1]); + + clients = array_get(&listener->clients, &count); + for (i = count; i > 0; i--) + auth_client_connection_destroy(clients[i-1]); + + auth_client_connections_deinit(listener); + array_free(&listener->sockets); + array_free(&listener->masters); + array_free(&listener->clients); + i_free(listener); +} + +static void auth_master_listener_accept(void *context) +{ + struct auth_master_listener_socket *s = context; + struct auth_master_connection *master; + int fd; + + fd = net_accept(s->fd, NULL, NULL); + if (fd < 0) { + if (fd < -1) + i_fatal("accept(type %d) failed: %m", s->type); + } else { + net_set_nonblock(fd, TRUE); + + switch (s->type) { + case LISTENER_CLIENT: + (void)auth_client_connection_create(s->listener, fd); + break; + case LISTENER_MASTER: + /* we'll just replace the previous master.. */ + master = auth_master_connection_create(s->listener, fd); + auth_master_connection_send_handshake(master); + break; + } + } +} + +void auth_master_listener_add(struct auth_master_listener *listener, + int fd, const char *path, + enum listener_type type) +{ + struct auth_master_listener_socket *s; + + s = i_new(struct auth_master_listener_socket, 1); + s->listener = listener; + s->fd = fd; + s->path = i_strdup(path); + s->type = type; + s->io = io_add(fd, IO_READ, auth_master_listener_accept, s); + + array_append(&listener->sockets, &s, 1); +} + +static void +auth_master_listener_send_handshakes(struct auth_master_listener *listener) +{ + struct auth_master_connection *const *masters; + unsigned int i, count; + + masters = array_get(&listener->masters, &count); + for (i = 0; i < count; i++) + auth_master_connection_send_handshake(masters[i]); +} + +void auth_master_listeners_send_handshake(void) +{ + struct auth_master_listener *const *listeners; + unsigned int i, count; + + listeners = array_get(&master_listeners, &count); + for (i = 0; i < count; i++) + auth_master_listener_send_handshakes(listeners[i]); +} + +int auth_master_listeners_masters_left(void) +{ + struct auth_master_listener *const *listeners; + unsigned int i, count; + + listeners = array_get(&master_listeners, &count); + for (i = 0; i < count; i++) { + if (array_count(&listeners[i]->masters) > 0) + return TRUE; + } + return FALSE; +} + +void auth_master_listeners_init(void) +{ + ARRAY_CREATE(&master_listeners, default_pool, + struct auth_master_listener *, 2); +} + +void auth_master_listeners_deinit(void) +{ + struct auth_master_listener *const *listeners; + unsigned int i, count; + + listeners = array_get(&master_listeners, &count); + for (i = count; i > 0; i--) + auth_master_listener_destroy(listeners[i-1]); + array_free(&master_listeners); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/auth/auth-master-listener.h Tue Apr 19 16:11:12 2005 +0300 @@ -0,0 +1,33 @@ +#ifndef __AUTH_MASTER_LISTENER_H +#define __AUTH_MASTER_LISTENER_H + +enum listener_type { + LISTENER_MASTER, + LISTENER_CLIENT +}; + +struct auth_master_listener { + struct auth *auth; + unsigned int pid; + + array_t ARRAY_DEFINE(sockets, struct auth_master_listener_socket *); + array_t ARRAY_DEFINE(masters, struct auth_master_connection *); + array_t ARRAY_DEFINE(clients, struct auth_client_connection *); + + struct timeout *to_clients; +}; + +struct auth_master_listener *auth_master_listener_create(struct auth *auth); +void auth_master_listener_destroy(struct auth_master_listener *listener); + +void auth_master_listener_add(struct auth_master_listener *listener, + int fd, const char *path, + enum listener_type type); + +void auth_master_listeners_send_handshake(void); +int auth_master_listeners_masters_left(void); + +void auth_master_listeners_init(void); +void auth_master_listeners_deinit(void); + +#endif
--- a/src/auth/auth-request-handler.c Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/auth-request-handler.c Tue Apr 19 16:11:12 2005 +0300 @@ -24,7 +24,6 @@ void *context; auth_request_callback_t *master_callback; - void *master_context; unsigned int prepend_connect_uid:1; }; @@ -35,8 +34,7 @@ struct auth_request_handler * auth_request_handler_create(struct auth *auth, int prepend_connect_uid, auth_request_callback_t *callback, void *context, - auth_request_callback_t *master_callback, - void *master_context) + auth_request_callback_t *master_callback) { struct auth_request_handler *handler; pool_t pool; @@ -51,7 +49,6 @@ handler->callback = callback; handler->context = context; handler->master_callback = master_callback; - handler->master_context = master_context; handler->prepend_connect_uid = prepend_connect_uid; return handler; } @@ -397,13 +394,14 @@ str_printfa(reply, "USER\t%u\t", request->id); str_append(reply, result); } - handler->master_callback(str_c(reply), handler->master_context); + handler->master_callback(str_c(reply), request->master); auth_request_unref(request); auth_request_handler_unref(handler); } void auth_request_handler_master_request(struct auth_request_handler *handler, + struct auth_master_connection *master, unsigned int id, unsigned int client_id) { @@ -419,7 +417,7 @@ i_error("Master request %u.%u not found", handler->client_pid, client_id); str_printfa(reply, "NOTFOUND\t%u", id); - handler->master_callback(str_c(reply), handler->master_context); + handler->master_callback(str_c(reply), master); return; } @@ -431,7 +429,7 @@ i_error("Master requested unfinished authentication request " "%u.%u", handler->client_pid, client_id); str_printfa(reply, "NOTFOUND\t%u", id); - handler->master_callback(str_c(reply), handler->master_context); + handler->master_callback(str_c(reply), master); } else { /* the request isn't being referenced anywhere anymore, so we can do a bit of kludging.. replace the request's @@ -439,6 +437,7 @@ request->state = AUTH_REQUEST_STATE_USERDB; request->id = id; request->context = handler; + request->master = master; /* handler is referenced until userdb_callback is called. */ handler->refcount++;
--- a/src/auth/auth-request-handler.h Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/auth-request-handler.h Tue Apr 19 16:11:12 2005 +0300 @@ -2,14 +2,14 @@ #define __AUTH_REQUEST_HANDLER_H struct auth_request; +struct auth_master_connection; typedef void auth_request_callback_t(const char *reply, void *context); struct auth_request_handler * auth_request_handler_create(struct auth *auth, int prepend_connect_uid, auth_request_callback_t *callback, void *context, - auth_request_callback_t *master_callback, - void *master_context); + auth_request_callback_t *master_callback); void auth_request_handler_unref(struct auth_request_handler *handler); void auth_request_handler_set(struct auth_request_handler *handler, @@ -23,6 +23,7 @@ int auth_request_handler_auth_continue(struct auth_request_handler *handler, const char *args); void auth_request_handler_master_request(struct auth_request_handler *handler, + struct auth_master_connection *master, unsigned int id, unsigned int client_id);
--- a/src/auth/auth-request.h Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/auth-request.h Tue Apr 19 16:11:12 2005 +0300 @@ -48,6 +48,7 @@ mech_callback_t *callback; void *context; + struct auth_master_connection *master; unsigned int successful:1; unsigned int internal_failure:1;
--- a/src/auth/main.c Tue Apr 19 09:54:41 2005 +0300 +++ b/src/auth/main.c Tue Apr 19 16:11:12 2005 +0300 @@ -15,6 +15,7 @@ #include "auth-worker-server.h" #include "auth-worker-client.h" #include "auth-master-interface.h" +#include "auth-master-listener.h" #include "auth-master-connection.h" #include "auth-client-connection.h" @@ -137,7 +138,7 @@ static void add_extra_listeners(void) { - struct auth_master_connection *master; + struct auth_master_listener *listener; const char *str, *client_path, *master_path; int client_fd, master_fd; unsigned int i; @@ -154,20 +155,17 @@ str = t_strdup_printf("AUTH_%u", i); client_fd = create_unix_listener(str, 16); str = t_strdup_printf("AUTH_%u_MASTER", i); - master_fd = create_unix_listener(str, 1); + master_fd = create_unix_listener(str, 16); - master = auth_master_connection_create(auth, -1); + listener = auth_master_listener_create(auth); if (master_fd != -1) { - auth_master_connection_add_listener(master, master_fd, - master_path, - LISTENER_MASTER); + auth_master_listener_add(listener, master_fd, + master_path, LISTENER_MASTER); } if (client_fd != -1) { - auth_master_connection_add_listener(master, client_fd, - client_path, - LISTENER_CLIENT); + auth_master_listener_add(listener, client_fd, + client_path, LISTENER_CLIENT); } - auth_client_connections_init(master); t_pop(); } } @@ -184,7 +182,7 @@ auth = auth_preinit(); password_schemes_init(); - auth_master_connections_init(); + auth_master_listeners_init(); if (!worker) add_extra_listeners(); @@ -194,7 +192,7 @@ static void main_init(int nodaemon) { - struct auth_master_connection *master; + struct auth_master_listener *listener; process_start_time = ioloop_time; lib_init_signals(sig_quit); @@ -236,14 +234,14 @@ i_fatal("chdir(/) failed: %m"); } } else { - master = auth_master_connection_create(auth, MASTER_SOCKET_FD); - auth_master_connection_add_listener(master, CLIENT_LISTEN_FD, - NULL, LISTENER_CLIENT); - auth_client_connections_init(master); + listener = auth_master_listener_create(auth); + (void)auth_master_connection_create(listener, MASTER_SOCKET_FD); + auth_master_listener_add(listener, CLIENT_LISTEN_FD, + NULL, LISTENER_CLIENT); } /* everything initialized, notify masters that all is well */ - auth_master_connections_send_handshake(); + auth_master_listeners_send_handshake(); } static void main_deinit(void) @@ -256,7 +254,7 @@ else auth_request_handler_flush_failures(); - auth_master_connections_deinit(); + auth_master_listeners_deinit(); auth_request_handler_deinit(); auth_deinit(auth); mech_deinit();