#ifndef SERVICE_H
#define SERVICE_H
#include "network.h"
#include "master-settings.h"
#define SERVICE_FIRST_STATUS_TIMEOUT_SECS 30
enum service_listener_type {
SERVICE_LISTENER_UNIX,
SERVICE_LISTENER_FIFO,
SERVICE_LISTENER_INET
};
struct service_listener {
struct service *service;
enum service_listener_type type;
int fd;
struct io *io;
const char *inet_address;
union {
struct {
const struct file_listener_settings *set;
uid_t uid;
gid_t gid;
} fileset;
struct {
const struct inet_listener_settings *set;
struct ip_addr ip;
} inetset;
} set;
};
struct service {
struct service_list *list;
enum service_type type;
const struct service_settings *set;
const char *config_file_path;
const char *executable;
uid_t uid;
gid_t gid;
gid_t privileged_gid;
const char *extra_gids;
ARRAY_DEFINE(listeners, struct service_listener *);
struct service_process *processes;
unsigned int process_count;
unsigned int process_avail;
unsigned int process_limit;
unsigned int client_limit;
unsigned int idle_kill;
uoff_t vsz_limit;
int log_fd[2];
int log_process_internal_fd;
int status_fd[2];
struct io *io_status;
int login_notify_fd;
time_t last_login_notify_time;
struct timeout *to_login_notify;
struct timeout *to_throttle;
struct timeout *to_drop;
time_t last_drop_warning;
unsigned int listen_pending:1;
unsigned int listening:1;
unsigned int have_inet_listeners:1;
unsigned int last_login_full_notify:1;
};
struct service_list {
pool_t pool;
pool_t set_pool;
int refcount;
struct timeout *to_kill;
const struct master_settings *set;
const struct master_service_settings *service_set;
struct service *config;
struct service *log;
struct service *anvil;
int master_log_fd[2];
struct service_process_notify *log_byes;
int master_dead_pipe_fd[2];
ARRAY_DEFINE(services, struct service *);
unsigned int destroyed:1;
unsigned int sigterm_sent:1;
unsigned int sigterm_sent_to_log:1;
};
extern struct hash_table *service_pids;
int services_create(const struct master_settings *set,
struct service_list **services_r, const char **error_r);
void services_destroy(struct service_list *service_list);
void service_list_ref(struct service_list *service_list);
void service_list_unref(struct service_list *service_list);
const char *services_get_config_socket_path(struct service_list *service_list);
void service_signal(struct service *service, int signo);
void service_login_notify(struct service *service, bool all_processes_full);
void service_throttle(struct service *service, unsigned int secs);
void services_throttle_time_sensitives(struct service_list *list,
unsigned int secs);
struct service *
service_lookup(struct service_list *service_list, const char *name);
struct service *
service_lookup_type(struct service_list *service_list, enum service_type type);
void service_error(struct service *service, const char *format, ...)
ATTR_FORMAT(2, 3);
void service_pids_init(void);
void service_pids_deinit(void);
#endif