[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