[dovecot-cvs] dovecot/src/auth Makefile.am, 1.45, 1.46 auth-client-connection.c, 1.35, 1.36 auth-client-connection.h, 1.9, 1.10 auth-master-connection.c, 1.32, 1.33 auth-master-connection.h, 1.11, 1.12 auth-master-listener.c, NONE, 1.1 auth-master-listener.h, NONE, 1.1 auth-request-handler.c, 1.4, 1.5 auth-request-handler.h, 1.3, 1.4 auth-request.h, 1.14, 1.15 main.c, 1.43, 1.44

cras at dovecot.org cras at dovecot.org
Tue Apr 19 16:11:14 EEST 2005


Update of /var/lib/cvs/dovecot/src/auth
In directory talvi:/tmp/cvs-serv11923

Modified Files:
	Makefile.am auth-client-connection.c auth-client-connection.h 
	auth-master-connection.c auth-master-connection.h 
	auth-request-handler.c auth-request-handler.h auth-request.h 
	main.c 
Added Files:
	auth-master-listener.c auth-master-listener.h 
Log Message:
Allow multiple master connections for a single listener.



Index: Makefile.am
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/Makefile.am,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- Makefile.am	28 Feb 2005 22:19:21 -0000	1.45
+++ Makefile.am	19 Apr 2005 13:11:12 -0000	1.46
@@ -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 \

Index: auth-client-connection.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-client-connection.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- auth-client-connection.c	12 Feb 2005 13:47:20 -0000	1.35
+++ auth-client-connection.c	19 Apr 2005 13:11:12 -0000	1.36
@@ -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;
 	}
 }

Index: auth-client-connection.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-client-connection.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- auth-client-connection.h	9 Jan 2005 00:49:18 -0000	1.9
+++ auth-client-connection.h	19 Apr 2005 13:11:12 -0000	1.10
@@ -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

Index: auth-master-connection.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-master-connection.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- auth-master-connection.c	19 Apr 2005 06:54:41 -0000	1.32
+++ auth-master-connection.c	19 Apr 2005 13:11:12 -0000	1.33
@@ -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);
-}

Index: auth-master-connection.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-master-connection.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- auth-master-connection.h	19 Apr 2005 06:54:41 -0000	1.11
+++ auth-master-connection.h	19 Apr 2005 13:11:12 -0000	1.12
@@ -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

--- NEW FILE: auth-master-listener.c ---
/* 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);
}

--- NEW FILE: auth-master-listener.h ---
#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

Index: auth-request-handler.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-request-handler.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- auth-request-handler.c	5 Mar 2005 11:48:13 -0000	1.4
+++ auth-request-handler.c	19 Apr 2005 13:11:12 -0000	1.5
@@ -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++;

Index: auth-request-handler.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-request-handler.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- auth-request-handler.h	28 Feb 2005 22:19:21 -0000	1.3
+++ auth-request-handler.h	19 Apr 2005 13:11:12 -0000	1.4
@@ -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);
 

Index: auth-request.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-request.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- auth-request.h	7 Apr 2005 23:42:46 -0000	1.14
+++ auth-request.h	19 Apr 2005 13:11:12 -0000	1.15
@@ -48,6 +48,7 @@
 
 	mech_callback_t *callback;
 	void *context;
+        struct auth_master_connection *master;
 
 	unsigned int successful:1;
 	unsigned int internal_failure:1;

Index: main.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/main.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- main.c	19 Apr 2005 06:54:41 -0000	1.43
+++ main.c	19 Apr 2005 13:11:12 -0000	1.44
@@ -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();



More information about the dovecot-cvs mailing list