service.c revision 89025037c48afe9ea64ed73d208d619db6b0ccfd
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger/* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger#define SERVICE_DIE_TIMEOUT_MSECS (1000*60)
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger#define SERVICE_LOGIN_NOTIFY_MIN_INTERVAL_SECS 2
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornbergervoid service_error(struct service *service, const char *format, ...)
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger i_error("service(%s): %s", service->set->name,
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornbergerservice_create_file_listener(struct service *service,
b27c7f227c8516589a2bd127c0f74338cf56f0b2Julian Kornberger l = p_new(service->list->pool, struct service_listener, 1);
555b7fd96768daf9592e7ddbd4217d784b08e451henning mueller if (get_uidgid(set->user, &l->set.fileset.uid, &gid, error_r) < 0)
7b8fe34340b2727bb31fe0be67fdf684e47c3609Tim Reddehase else if (get_gid(set->group, &l->set.fileset.gid, error_r) < 0)
1b2e2335372f4737c0aa19da6320f7b5fd58b500Tim Reddehase "%s (See service %s { %s_listener %s { %s } } setting)",
291d5c781e5ce4a7c15cfb16fa4a800177135b3ehenning mueller type == SERVICE_LISTENER_UNIX ? "unix" : "fifo",
0c07cc350bdb8afe9b01b4340b33d89500a43106Till Mossakowskiresolve_ip(const char *address, const struct ip_addr **ips_r,
0c07cc350bdb8afe9b01b4340b33d89500a43106Till Mossakowski unsigned int *ips_count_r, const char **error_r)
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski if (address == NULL || strcmp(address, "*") == 0) {
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski /* IPv4 any */
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski if (strcmp(address, "::") == 0 || strcmp(address, "[::]") == 0) {
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski /* IPv6 any */
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski /* Return the first IP if there happens to be multiple. */
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski ret = net_gethostbyname(address, &ip_list, &ips_count);
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski *error_r = t_strdup_printf("Can't resolve address %s: %s",
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski *error_r = t_strdup_printf("No IPs for address: %s", address);
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowskiservice_create_one_inet_listener(struct service *service,
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski const char *address, const struct ip_addr *ip,
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski l = p_new(service->list->pool, struct service_listener, 1);
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski l->inet_address = p_strdup(service->list->pool, address);
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski *error_r = t_strdup_printf("Invalid port: %u", set->port);
const char **error_r)
static struct service_listener *l;
unsigned int i, ips_count;
for (i = 0; i < ips_count; i++) {
error_r);
if (l == NULL)
const char *const *tmp;
static struct service *
struct service_listener *l;
return NULL;
return NULL;
return NULL;
error_r) < 0) {
return NULL;
return NULL;
unix_count = 0;
fifo_count = 0;
inet_count = 0;
return NULL;
for (i = 0; i < unix_count; i++) {
if (l == NULL)
return NULL;
for (i = 0; i < fifo_count; i++) {
if (l == NULL)
return NULL;
for (i = 0; i < inet_count; i++) {
error_r) < 0)
return NULL;
return NULL;
return service;
static unsigned int pid_hash(const void *p)
return (unsigned int)*pid;
struct service *
return service;
return NULL;
struct service *
return service;
return NULL;
char *const *proto;
return TRUE;
return TRUE;
return FALSE;
const char *const *child_process_env,
const char *error;
unsigned int i, count;
for (i = 0; i < count; i++) {
case SERVICE_TYPE_LOG:
case SERVICE_TYPE_CONFIG:
case SERVICE_TYPE_ANVIL:
int diff;
service);
bool sigterm_log;
int sig;
unsigned int count;
int fd;
case SERVICE_LISTENER_UNIX:
case SERVICE_LISTENER_INET:
case SERVICE_LISTENER_FIFO:
unsigned int secs)
void service_pids_init(void)
void service_pids_deinit(void)