master-auth.c revision 6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbe
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen/* Copyright (C) 2005 Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen unsigned int buf_pos;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* linked list, node->context is the next pointer */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic struct master_auth_request_node aborted_node;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenunsigned int master_auth_request(struct master_service *service, int fd,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const unsigned char *data,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen buf = buffer_create_dynamic(pool_datastack_create(),
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = fd_send(auth->fd, fd, buf->data, buf->used);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen node = p_new(auth->pool, struct master_auth_request_node, 1);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_table_insert(auth->requests, POINTER_CAST(req.tag), node);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenvoid master_auth_request_abort(struct master_service *service, unsigned int tag)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen node = hash_table_lookup(auth->requests, POINTER_CAST(tag));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_panic("master_auth_request_abort(): tag %u not found", tag);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_table_update(auth->requests, POINTER_CAST(tag), &aborted_node);
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainenmaster_notify_have_more_avail_processes(struct master_service *service,
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainen /* make sure we're listening for more connections */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void request_handle(struct master_auth *auth,
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainen /* notification from master */
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainen master_notify_have_more_avail_processes(auth->service,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen node = hash_table_lookup(auth->requests, POINTER_CAST(reply->tag));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_error("Master sent reply with unknown tag %u", reply->tag);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* the callback may have called master_auth_request_abort(),
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen which would have put the node to free_nodes list already */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_table_remove(auth->requests, POINTER_CAST(reply->tag));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = net_receive(auth->fd, auth->buf + auth->buf_pos,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* master died, kill all clients logging in */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* reply is now read */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen request_handle(auth, (struct master_auth_reply *) auth->buf);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenvoid master_auth_init(struct master_service *service)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (net_getsockname(MASTER_AUTH_FD, &ip, NULL) < 0 ||
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen pool = pool_alloconly_create("master auth", 1024);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen auth->requests = hash_table_create(default_pool, pool, 0, NULL, NULL);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen auth->io = io_add(auth->fd, IO_READ, master_auth_input, auth);