auth-master-connection.c revision 1e21e6be70994b1aa9e52ca0e2f51afefca6d0df
/* Copyright (C) 2002 Timo Sirainen */
#include "common.h"
#include "buffer.h"
#include "hash.h"
#include "str.h"
#include "ioloop.h"
#include "istream.h"
#include "ostream.h"
#include "network.h"
#include "userdb.h"
#include "auth-request.h"
#include "auth-master-interface.h"
#include "auth-client-connection.h"
#include "auth-master-connection.h"
#include <unistd.h>
#include <stdlib.h>
#define MAX_INBUF_SIZE 1024
struct auth_listener {
struct auth_master_connection *master;
int client_listener;
int fd;
char *path;
};
struct master_userdb_request {
struct auth_master_connection *conn;
unsigned int id;
struct auth_request *auth_request;
};
static int master_output(void *context);
const char *fmt, ...)
{
t_push();
t_pop();
}
{
const char *p;
if (p == NULL) {
} else {
/* wu-ftpd like <chroot>/./<home> */
}
}
{
i_info("userdb(%s): uid=%s gid=%s home=%s mail=%s",
}
master_request->id);
} else {
}
}
}
static int
{
struct auth_client_connection *client_conn;
struct master_userdb_request *master_request;
struct auth_request *request;
const char *const *list;
/* <id> <client-pid> <client-id> */
i_error("BUG: Master sent broken REQUEST");
return FALSE;
}
if (verbose) {
i_info("Master request %u.%u not found",
}
} else if (!request->successful) {
i_error("Master requested unfinished authentication request "
} else {
}
return TRUE;
}
static int
{
return TRUE;
}
static void master_input(void *context)
{
char *line;
int ret;
case 0:
return;
case -1:
/* disconnected */
return;
case -2:
/* buffer full */
i_error("BUG: Master sent us more than %d bytes",
(int)MAX_INBUF_SIZE);
return;
}
if (!conn->version_received) {
return;
/* make sure the major version matches */
i_error("Master not compatible with this server "
"(mixed old and new binaries?)");
return;
}
}
t_push();
else {
/* ignore unknown command */
}
t_pop();
if (!ret) {
return;
}
}
}
static int master_output(void *context)
{
int ret;
/* transmit error, probably master died */
return 1;
}
/* allow input again */
}
return 1;
}
static void
{
}
struct auth_master_connection *
{
struct auth_master_connection *conn;
if (fd != -1)
return conn;
}
{
}
}
{
if (!standalone)
i_error("close(): %m");
}
}
{
struct auth_listener **l;
return;
size /= sizeof(*l);
for (i = 0; i < size; i++) {
net_disconnect(l[i]->fd);
}
i_free(l[i]);
}
}
{
return TRUE;
return FALSE;
}
static void auth_accept(void *context)
{
struct auth_listener *l = context;
int fd;
if (fd < 0) {
if (fd < -1)
i_fatal("accept() failed: %m");
} else {
if (l->client_listener)
else {
/* we'll just replace the previous master.. */
}
}
}
{
struct auth_listener *l;
l->client_listener = client;
}