Mercurial > dovecot > original-hg > dovecot-1.2
view src/auth/master.c @ 91:dc0891523276 HEAD
bugfix for sync fix
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 29 Aug 2002 01:42:00 +0300 |
parents | 82b7de533f98 |
children | ea958a5b9de1 |
line wrap: on
line source
/* Copyright (C) 2002 Timo Sirainen */ #include "common.h" #include "iobuffer.h" #include "network.h" #include "cookie.h" #define MAX_OUTBUF_SIZE (10 * sizeof(AuthCookieReplyData)) static AuthCookieReplyData failure_reply; static IOBuffer *outbuf; static IO io_master; static unsigned int master_pos; static char master_buf[sizeof(AuthCookieRequestData)]; static void master_handle_request(AuthCookieRequestData *request, int fd __attr_unused__) { CookieData *cookie; AuthCookieReplyData *reply, temp_reply; cookie = cookie_lookup_and_remove(request->cookie); if (cookie == NULL) reply = &failure_reply; else { if (cookie->auth_fill_reply(cookie, &temp_reply)) reply = &temp_reply; else reply = &failure_reply; cookie->free(cookie); } reply->id = request->id; switch (io_buffer_send(outbuf, reply, sizeof(AuthCookieReplyData))) { case -2: i_fatal("Master transmit buffer full, aborting"); case -1: /* master died, kill ourself too */ io_loop_stop(ioloop); break; } } static void master_input(void *context __attr_unused__, int fd, IO io __attr_unused__) { int ret; ret = net_receive(fd, master_buf + master_pos, sizeof(master_buf) - master_pos); if (ret < 0) { /* master died, kill ourself too */ io_loop_stop(ioloop); return; } master_pos += ret; if (master_pos < sizeof(master_buf)) return; /* reply is now read */ master_handle_request((AuthCookieRequestData *) master_buf, fd); master_pos = 0; } void master_init(void) { memset(&failure_reply, 0, sizeof(failure_reply)); master_pos = 0; outbuf = io_buffer_create(MASTER_SOCKET_FD, default_pool, IO_PRIORITY_DEFAULT, MAX_OUTBUF_SIZE); io_master = io_add(MASTER_SOCKET_FD, IO_READ, master_input, NULL); } void master_deinit(void) { io_buffer_destroy(outbuf); io_remove(io_master); }