master-auth.c revision 3b22894b8805b186c73d8b754001e8d7e944be85
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
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)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen i_fatal("close(master auth conn) failed: %m");
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,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen "Remote closed connection");
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* reply is now read */
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen reply = (struct master_auth_reply *)conn->buf;
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen i_error("Master sent reply with unknown tag %u", reply->tag);
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);
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);