master-auth.c revision 47eefec8a72cc2777f344017261c2864e47bcaad
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen#define MASTER_AUTH_REQUEST_TIMEOUT_MSECS (MASTER_LOGIN_TIMEOUT_SECS/2*1000)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen unsigned int tag;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen unsigned int buf_pos;
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenmaster_auth_init(struct master_service *service, const char *path)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen pool = pool_alloconly_create("master auth", 1024);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen auth->connections = hash_table_create(default_pool, pool,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenmaster_auth_connection_deinit(struct master_auth_connection **_conn)
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen i_fatal("close(%s) failed: %m", conn->auth->path);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenvoid master_auth_deinit(struct master_auth **_auth)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen iter = hash_table_iterate_init(auth->connections);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen while (hash_table_iterate(iter, &key, &value)) {
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic void master_auth_connection_input(struct master_auth_connection *conn)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen ret = read(conn->fd, conn->buf + conn->buf_pos,
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen i_error("read(%s) failed: %m", conn->auth->path);
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen i_error("read(%s) failed: Remote closed connection",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* reply is now read */
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen reply = (struct master_auth_reply *)conn->buf;
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen i_error("master(%s): Received reply with unknown tag %u",
892b4c153ad432f5e7e6ce3f84c0f7a9657d0158Timo Sirainen /* request aborted */
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainenstatic void master_auth_connection_timeout(struct master_auth_connection *conn)
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen i_error("master(%s): Auth request timed out (received %u/%u bytes)",
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenvoid master_auth_request(struct master_auth *auth, int fd,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen const unsigned char *data,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen conn = i_new(struct master_auth_connection, 1);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen buf = buffer_create_dynamic(pool_datastack_create(),
405fbb38e0d4bd33a82b547dc9590245885f0b62Timo Sirainen conn->fd = net_connect_unix_with_retries(auth->path,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen i_error("net_connect_unix(%s) failed: %m", auth->path);
405fbb38e0d4bd33a82b547dc9590245885f0b62Timo Sirainen ret = fd_send(conn->fd, fd, buf->data, buf->used);
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen i_error("fd_send(%s, %d) failed: %m", auth->path, fd);
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen i_error("fd_send(%s) sent only %d of %d bytes",
6bee43694f513ae65566f09a39e1f34a64ef7a20Timo Sirainen conn->to = timeout_add(MASTER_AUTH_REQUEST_TIMEOUT_MSECS,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen hash_table_insert(auth->connections, POINTER_CAST(req.tag), conn);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenvoid master_auth_request_abort(struct master_auth *auth, unsigned int tag)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen conn = hash_table_lookup(auth->connections, POINTER_CAST(tag));
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen i_panic("master_auth_request_abort(): tag %u not found", tag);