listener.c revision f4a00030e7536266abbc52a882475bbc96decc3c
/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
#include "common.h"
#include "array.h"
#include "ioloop.h"
#include "fd-close-on-exec.h"
#include "listener.h"
#include <stdlib.h>
#include <unistd.h>
{
const char *p;
unsigned int ips_count;
int ret;
if (*name == '\0') {
/* defaults to "*" or "[::]" */
return;
}
if (name[0] == '[') {
/* IPv6 address */
if (p == NULL) {
i_fatal("%s: Missing ']' in address %s",
}
p++;
if (*p == '\0')
p = NULL;
else if (*p != ':') {
i_fatal("%s: Invalid data after ']' in address %s",
}
} else {
if (p != NULL)
}
if (p != NULL) {
i_fatal("%s: Invalid port in address %s",
}
}
/* IPv4 any */
return;
}
/* IPv6 any */
return;
}
/* Return the first IP if there happens to be multiple. */
if (ret != 0) {
i_fatal("%s: Can't resolve address %s: %s",
}
if (ips_count < 1)
}
static void
{
unsigned int i, count;
else
count = 0;
for (i = 0; i < count; i++) {
continue;
}
else
count = 0;
for (i = 0; i < count; i++) {
continue;
}
}
const char *proto)
{
struct server_settings *server;
"imap", proto);
}
"pop3", proto);
}
}
}
static void
{
const char *const *tmp;
unsigned int i, count;
if (!array_is_created(listens_arr))
for (i = 0; i < count; i++)
memset(&l, 0, sizeof(l));
l.fd = -1;
l.port = default_port;
/* see if it already exists */
for (i = 0; i < count; i++) {
break;
}
}
if (i == count) {
}
}
/* close unwanted fds */
for (i = 0; i < count; ) {
i++;
else {
i_error("close(listener) failed: %m");
}
}
}
}
{
unsigned int i, count;
if (!array_is_created(listens_arr))
return;
for (i = 0; i < count; i++) {
i_error("close(listener) failed: %m");
}
}
}
{
const char *const *proto;
unsigned int default_port;
return;
/* register wanted protocols */
ssl_listen = TRUE;
ssl_listen = TRUE;
}
}
if (!nonssl_listen)
else {
}
if (!ssl_listen)
else {
&set->ssl_listens);
}
}
{
}
return;
}
}
static void
listener_array_listen_missing(const char *proto,
{
unsigned int i, j, count;
if (!array_is_created(listens_arr))
return;
for (i = 0; i < count; i++) {
continue;
for (j = 0; j < 10; j++) {
break;
if (errno == EADDRINUSE) {
/* retry */
/* SIGHUPing sometimes gets us here.
we don't want to die. */
} else {
/* error */
break;
}
if (!retry)
break;
/* wait a while and try again. we're SIGHUPing
so we most likely just closed it ourself.. */
sleep(1);
}
i_fatal("listen(%s, %d) failed: %m",
}
}
}
static void
{
}
{
struct server_settings *server;
}
}
}
}
void listeners_close_fds(void)
{
struct server_settings *server;
}
}
}
}