static void master_set_process_limit(void)
{
- struct service *const *servicep;
+ struct service *service;
unsigned int process_limit = 0;
rlim_t nproc;
guess: mail processes should probably be counted together for a
common vmail user (unless system users are being used), but
we can't really guess what the mail processes are. */
- array_foreach(&services->services, servicep)
- process_limit += (*servicep)->process_limit;
+ array_foreach_elem(&services->services, service)
+ process_limit += service->process_limit;
if (restrict_get_process_limit(&nproc) == 0 &&
process_limit > nproc)
static int
master_client_service_status(struct master_client *client)
{
- struct service *const *servicep;
+ struct service *service;
string_t *str = t_str_new(128);
- array_foreach(&services->services, servicep) {
+ array_foreach_elem(&services->services, service) {
str_truncate(str, 0);
- master_client_service_status_output(str, *servicep);
+ master_client_service_status_output(str, service);
o_stream_nsend(client->conn.output, str_data(str), str_len(str));
}
o_stream_nsend_str(client->conn.output, "\n");
master_client_process_status(struct master_client *client,
const char *const *args)
{
- struct service *const *servicep;
+ struct service *service;
struct service_process *p;
string_t *str = t_str_new(128);
- array_foreach(&services->services, servicep) {
- if (args[0] != NULL && !str_array_find(args, (*servicep)->set->name))
+ array_foreach_elem(&services->services, service) {
+ if (args[0] != NULL && !str_array_find(args, service->set->name))
continue;
- for (p = (*servicep)->processes; p != NULL; p = p->next) {
+ for (p = service->processes; p != NULL; p = p->next) {
str_truncate(str, 0);
master_client_process_output(str, p);
o_stream_nsend(client->conn.output,
ARRAY_TYPE(const_string) *all_listeners,
const char **error_r)
{
- struct file_listener_settings *const *sets;
+ struct file_listener_settings *set;
size_t base_dir_len = strlen(master_set->base_dir);
enum service_user_default user_default;
if (!array_is_created(l))
return TRUE;
- array_foreach(l, sets) {
- struct file_listener_settings *set = *sets;
-
+ array_foreach_elem(l, set) {
if (set->path[0] == '\0') {
*error_r = "path must not be empty";
return FALSE;
static void add_inet_listeners(ARRAY_TYPE(inet_listener_settings) *l,
ARRAY_TYPE(const_string) *all_listeners)
{
- struct inet_listener_settings *const *sets;
+ struct inet_listener_settings *set;
const char *str;
if (!array_is_created(l))
return;
- array_foreach(l, sets) {
- struct inet_listener_settings *set = *sets;
-
+ array_foreach_elem(l, set) {
if (set->port != 0) {
str = t_strdup_printf("%u:%s", set->port, set->address);
array_push_back(all_listeners, &str);
static bool
services_have_protocol(struct master_settings *set, const char *name)
{
- struct service_settings *const *services;
-
- array_foreach(&set->services, services) {
- struct service_settings *service = *services;
+ struct service_settings *service;
+ array_foreach_elem(&set->services, service) {
if (strcmp(service->protocol, name) == 0)
return TRUE;
}
master_default_settings_get_service(const char *name)
{
extern struct master_settings master_default_settings;
- struct service_settings *const *setp;
+ struct service_settings *set;
- array_foreach(&master_default_settings.services, setp) {
- if (strcmp((*setp)->name, name) == 0)
- return *setp;
+ array_foreach_elem(&master_default_settings.services, set) {
+ if (strcmp(set->name, name) == 0)
+ return set;
}
return NULL;
}
static unsigned int
service_get_client_limit(struct master_settings *set, const char *name)
{
- struct service_settings *const *servicep;
+ struct service_settings *service;
- array_foreach(&set->services, servicep) {
- if (strcmp((*servicep)->name, name) == 0) {
- if ((*servicep)->client_limit != 0)
- return (*servicep)->client_limit;
+ array_foreach_elem(&set->services, service) {
+ if (strcmp(service->name, name) == 0) {
+ if (service->client_limit != 0)
+ return service->client_limit;
else
return set->default_client_limit;
}
static bool
login_want_core_dumps(const struct master_settings *set, gid_t *gid_r)
{
- struct service_settings *const *services;
+ struct service_settings *service;
const char *error;
bool cores = FALSE;
uid_t uid;
*gid_r = (gid_t)-1;
- array_foreach(&set->services, services) {
- struct service_settings *service = *services;
-
+ array_foreach_elem(&set->services, service) {
if (service->parsed_type == SERVICE_TYPE_LOGIN) {
if (service->login_dump_core)
cores = TRUE;
settings_have_auth_unix_listeners_in(const struct master_settings *set,
const char *dir)
{
- struct service_settings *const *services;
- struct file_listener_settings *const *uls;
+ struct service_settings *service;
+ struct file_listener_settings *u;
size_t dir_len = strlen(dir);
- array_foreach(&set->services, services) {
- struct service_settings *service = *services;
-
+ array_foreach_elem(&set->services, service) {
if (array_is_created(&service->unix_listeners)) {
- array_foreach(&service->unix_listeners, uls) {
- struct file_listener_settings *u = *uls;
-
+ array_foreach_elem(&service->unix_listeners, u) {
if (strncmp(u->path, dir, dir_len) == 0 &&
u->path[dir_len] == '/')
return TRUE;
static int service_listen(struct service *service)
{
- struct service_listener *const *listeners;
+ struct service_listener *l;
int ret = 1, ret2 = 0;
- array_foreach(&service->listeners, listeners) {
- struct service_listener *l = *listeners;
-
+ array_foreach_elem(&service->listeners, l) {
if (l->fd != -1)
continue;
static int services_verify_systemd(struct service_list *service_list)
{
- struct service *const *services;
+ struct service *service;
static int sd_fds = -1;
int fd, fd_max;
sa_family_t family;
get_socket_info(fd, &family, &port);
- array_foreach(&service_list->services, services) {
- struct service_listener *const *listeners;
+ array_foreach_elem(&service_list->services, service) {
+ struct service_listener *l;
- array_foreach(&(*services)->listeners, listeners) {
- struct service_listener *l = *listeners;
+ array_foreach_elem(&service->listeners, l) {
if (l->type != SERVICE_LISTENER_INET)
continue;
if (l->set.inetset.set->port == port &&
int services_listen(struct service_list *service_list)
{
- struct service *const *services;
+ struct service *service;
int ret = 1, ret2;
- array_foreach(&service_list->services, services) {
- ret2 = service_listen(*services);
+ array_foreach_elem(&service_list->services, service) {
+ ret2 = service_listen(service);
if (ret2 < ret)
ret = ret2;
}
int services_log_init(struct service_list *service_list)
{
- struct service *const *services;
+ struct service *service;
const char *log_prefix;
buffer_t *handshake_buf;
ssize_t ret = 0;
service_process_write_log_bye);
fd = MASTER_LISTEN_FD_FIRST + 1;
- array_foreach(&service_list->services, services) {
- struct service *service = *services;
-
+ array_foreach_elem(&service_list->services, service) {
if (service->type == SERVICE_TYPE_LOG)
continue;
struct service_list *service_list,
unsigned int first_fd, unsigned int *fd_count)
{
- struct service *const *services;
+ struct service *service;
unsigned int n = 0;
/* master log fd is always the first one */
dup2_append(dups, service_list->master_log_fd[0], first_fd);
n++; *fd_count += 1;
- array_foreach(&service_list->services, services) {
- struct service *service = *services;
-
+ array_foreach_elem(&service_list->services, service) {
if (service->log_fd[1] == -1)
continue;
static void service_drop_timeout(struct service *service)
{
- struct service_listener *const *lp;
+ struct service_listener *lp;
int fd;
i_assert(service->process_avail == 0);
/* drop all pending connections */
- array_foreach(&service->listeners, lp) {
- while ((fd = net_accept((*lp)->fd, NULL, NULL)) > 0)
+ array_foreach_elem(&service->listeners, lp) {
+ while ((fd = net_accept(lp->fd, NULL, NULL)) > 0)
net_disconnect(fd);
}
static void service_monitor_listen_start_force(struct service *service)
{
- struct service_listener *const *listeners;
+ struct service_listener *l;
service->listening = TRUE;
service->listen_pending = FALSE;
timeout_remove(&service->to_drop);
timeout_remove(&service->to_drop_warning);
- array_foreach(&service->listeners, listeners) {
- struct service_listener *l = *listeners;
-
+ array_foreach_elem(&service->listeners, l) {
if (l->io == NULL && l->fd != -1)
l->io = io_add(l->fd, IO_READ, service_accept, l);
}
void service_monitor_listen_stop(struct service *service)
{
- struct service_listener *const *listeners;
-
- array_foreach(&service->listeners, listeners) {
- struct service_listener *l = *listeners;
+ struct service_listener *l;
+ array_foreach_elem(&service->listeners, l)
io_remove(&l->io);
- }
service->listening = FALSE;
service->listen_pending = FALSE;
timeout_remove(&service->to_drop);
void services_monitor_start(struct service_list *service_list)
{
ARRAY(struct service *) listener_services;
- struct service *const *services;
+ struct service *service;
if (services_log_init(service_list) < 0)
return;
}
t_array_init(&listener_services, array_count(&service_list->services));
- array_foreach(&service_list->services, services) {
- struct service *service = *services;
-
+ array_foreach_elem(&service_list->services, service) {
if (service->type == SERVICE_TYPE_LOGIN) {
if (service_login_create_notify_fd(service) < 0)
continue;
}
/* create processes only after adding all listeners */
- array_foreach(&listener_services, services)
- service_monitor_start_extra_avail(*services);
+ array_foreach_elem(&listener_services, service)
+ service_monitor_start_extra_avail(service);
if (service_list->log->status_fd[0] != -1) {
if (service_process_create(service_list->log) != NULL)
}
/* start up a process for startup-services */
- array_foreach(&service_list->services, services) {
- struct service *service = *services;
-
+ array_foreach_elem(&service_list->services, service) {
if (service->type == SERVICE_TYPE_STARTUP &&
service->status_fd[0] != -1) {
if (service_process_create(service) != NULL)
void service_monitor_stop_close(struct service *service)
{
- struct service_listener *const *listeners;
+ struct service_listener *l;
service_monitor_stop(service);
- array_foreach(&service->listeners, listeners) {
- struct service_listener *l = *listeners;
-
+ array_foreach_elem(&service->listeners, l)
i_close_fd(&l->fd);
- }
}
static void services_monitor_wait(struct service_list *service_list)
{
- struct service *const *servicep;
+ struct service *service;
struct timeval tv_start;
bool finished;
for (;;) {
finished = TRUE;
services_monitor_reap_children();
- array_foreach(&service_list->services, servicep) {
- if ((*servicep)->status_fd[0] != -1)
- service_status_input(*servicep);
- if ((*servicep)->process_avail > 0)
+ array_foreach_elem(&service_list->services, service) {
+ if (service->status_fd[0] != -1)
+ service_status_input(service);
+ if (service->process_avail > 0)
finished = FALSE;
}
io_loop_time_refresh();
static bool
service_list_processes_close_listeners(struct service_list *service_list)
{
- struct service *const *servicep;
+ struct service *service;
bool ret = FALSE;
- array_foreach(&service_list->services, servicep) {
- if (service_processes_close_listeners(*servicep))
+ array_foreach_elem(&service_list->services, service) {
+ if (service_processes_close_listeners(service))
ret = TRUE;
}
return ret;
void services_monitor_stop(struct service_list *service_list, bool wait)
{
- struct service *const *services;
+ struct service *service;
- array_foreach(&service_list->services, services)
- service_monitor_close_dead_pipe(*services);
+ array_foreach_elem(&service_list->services, service)
+ service_monitor_close_dead_pipe(service);
if (wait)
services_monitor_wait_and_kill(service_list);
io_remove(&service_list->io_master);
- array_foreach(&service_list->services, services)
- service_monitor_stop(*services);
+ array_foreach_elem(&service_list->services, service)
+ service_monitor_stop(service);
services_log_deinit(service_list);
}
struct service *
service_lookup(struct service_list *service_list, const char *name)
{
- struct service *const *services;
-
- array_foreach(&service_list->services, services) {
- struct service *service = *services;
+ struct service *service;
+ array_foreach_elem(&service_list->services, service) {
if (strcmp(service->set->name, name) == 0)
return service;
}
struct service *
service_lookup_type(struct service_list *service_list, enum service_type type)
{
- struct service *const *services;
-
- array_foreach(&service_list->services, services) {
- struct service *service = *services;
+ struct service *service;
+ array_foreach_elem(&service_list->services, service) {
if (service->type == type)
return service;
}
static void services_kill_timeout(struct service_list *service_list)
{
- struct service *const *services, *log_service;
+ struct service *service, *log_service;
unsigned int service_uninitialized, uninitialized_count = 0;
unsigned int signal_count = 0;
int sig;
service_list->sigterm_sent = TRUE;
log_service = NULL;
- array_foreach(&service_list->services, services) {
- struct service *service = *services;
-
+ array_foreach_elem(&service_list->services, service) {
if (service->type == SERVICE_TYPE_LOG)
log_service = service;
else {
void service_list_unref(struct service_list *service_list)
{
- struct service *const *servicep;
- struct service_listener *const *listenerp;
+ struct service *service;
+ struct service_listener *listener;
i_assert(service_list->refcount > 0);
if (--service_list->refcount > 0)
return;
- array_foreach(&service_list->services, servicep) {
- array_foreach(&(*servicep)->listeners, listenerp)
- i_close_fd(&(*listenerp)->fd);
+ array_foreach_elem(&service_list->services, service) {
+ array_foreach_elem(&service->listeners, listener)
+ i_close_fd(&listener->fd);
}
i_close_fd(&service_list->master_fd);
static void service_drop_listener_connections(struct service *service)
{
- struct service_listener *const *listenerp;
+ struct service_listener *listener;
int fd;
- array_foreach(&service->listeners, listenerp) {
- switch ((*listenerp)->type) {
+ array_foreach_elem(&service->listeners, listener) {
+ switch (listener->type) {
case SERVICE_LISTENER_UNIX:
case SERVICE_LISTENER_INET:
- if ((*listenerp)->fd == -1) {
+ if (listener->fd == -1) {
/* already stopped listening */
break;
}
- while ((fd = net_accept((*listenerp)->fd,
+ while ((fd = net_accept(listener->fd,
NULL, NULL)) >= 0)
i_close_fd(&fd);
break;
void services_throttle_time_sensitives(struct service_list *list,
unsigned int msecs)
{
- struct service *const *services;
-
- array_foreach(&list->services, services) {
- struct service *service = *services;
+ struct service *service;
+ array_foreach_elem(&list->services, service) {
if (service->type == SERVICE_TYPE_UNKNOWN)
service_throttle(service, msecs);
}