view src/auth/master.c @ 410:1f0e7229ee58 HEAD

Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and file OBuffer.
author Timo Sirainen <tss@iki.fi>
date Mon, 14 Oct 2002 02:49:11 +0300
parents ea958a5b9de1
children 3b53dd1280c6
line wrap: on
line source

/* Copyright (C) 2002 Timo Sirainen */

#include "common.h"
#include "obuffer.h"
#include "network.h"
#include "cookie.h"

#define MAX_OUTBUF_SIZE (10 * sizeof(AuthCookieReplyData))

static AuthCookieReplyData failure_reply;

static OBuffer *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 (o_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 = o_buffer_create_file(MASTER_SOCKET_FD, default_pool,
				      MAX_OUTBUF_SIZE, IO_PRIORITY_DEFAULT,
				      FALSE);
	io_master = io_add(MASTER_SOCKET_FD, IO_READ, master_input, NULL);
}

void master_deinit(void)
{
	o_buffer_unref(outbuf);
	io_remove(io_master);
}