10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 720Sigor@sysoev.ru #ifndef _NXT_PROCESS_H_INCLUDED_ 820Sigor@sysoev.ru #define _NXT_PROCESS_H_INCLUDED_ 920Sigor@sysoev.ru 102321Sa.clayton@nginx.com #if (NXT_HAVE_LINUX_NS) 111488St.nateldemoura@f5.com #include <unistd.h> 121306St.nateldemoura@f5.com #include <nxt_clone.h> 131306St.nateldemoura@f5.com #endif 141182St.nateldemoura@f5.com 1520Sigor@sysoev.ru 1620Sigor@sysoev.ru typedef pid_t nxt_pid_t; 1720Sigor@sysoev.ru 1820Sigor@sysoev.ru 191488St.nateldemoura@f5.com typedef struct nxt_common_app_conf_s nxt_common_app_conf_t; 201488St.nateldemoura@f5.com 211488St.nateldemoura@f5.com 221488St.nateldemoura@f5.com typedef struct { 231488St.nateldemoura@f5.com nxt_runtime_t *rt; 241488St.nateldemoura@f5.com } nxt_discovery_init_t; 250Sigor@sysoev.ru 261488St.nateldemoura@f5.com 271488St.nateldemoura@f5.com typedef struct { 281488St.nateldemoura@f5.com nxt_str_t conf; 291488St.nateldemoura@f5.com #if (NXT_TLS) 301488St.nateldemoura@f5.com nxt_array_t *certs; 311488St.nateldemoura@f5.com #endif 32*2450Sz.hong@f5.com #if (NXT_HAVE_NJS) 33*2450Sz.hong@f5.com nxt_array_t *scripts; 34*2450Sz.hong@f5.com #endif 351488St.nateldemoura@f5.com } nxt_controller_init_t; 3620Sigor@sysoev.ru 37141Smax.romanov@nginx.com 381488St.nateldemoura@f5.com typedef union { 391488St.nateldemoura@f5.com void *discovery; 401488St.nateldemoura@f5.com nxt_controller_init_t controller; 411488St.nateldemoura@f5.com void *router; 421488St.nateldemoura@f5.com nxt_common_app_conf_t *app; 431488St.nateldemoura@f5.com } nxt_process_data_t; 44141Smax.romanov@nginx.com 451488St.nateldemoura@f5.com 461488St.nateldemoura@f5.com typedef enum { 471488St.nateldemoura@f5.com NXT_PROCESS_STATE_CREATING = 0, 481488St.nateldemoura@f5.com NXT_PROCESS_STATE_CREATED, 491488St.nateldemoura@f5.com NXT_PROCESS_STATE_READY, 501488St.nateldemoura@f5.com } nxt_process_state_t; 5120Sigor@sysoev.ru 5220Sigor@sysoev.ru 53364Smax.romanov@nginx.com typedef struct nxt_port_mmap_s nxt_port_mmap_t; 541579St.nateldemoura@f5.com typedef struct nxt_process_s nxt_process_t; 552260Sa.clayton@nginx.com typedef struct nxt_cgroup_s nxt_cgroup_t; 561579St.nateldemoura@f5.com typedef void (*nxt_isolation_cleanup_t)(nxt_task_t *task, 571579St.nateldemoura@f5.com nxt_process_t *process); 582260Sa.clayton@nginx.com typedef void (*nxt_cgroup_cleanup_t)(nxt_task_t *task, 592260Sa.clayton@nginx.com const nxt_process_t *process); 601488St.nateldemoura@f5.com 61364Smax.romanov@nginx.com 621488St.nateldemoura@f5.com typedef struct { 63364Smax.romanov@nginx.com nxt_thread_mutex_t mutex; 64364Smax.romanov@nginx.com uint32_t size; 65364Smax.romanov@nginx.com uint32_t cap; 66364Smax.romanov@nginx.com nxt_port_mmap_t *elts; 671488St.nateldemoura@f5.com } nxt_port_mmaps_t; 68364Smax.romanov@nginx.com 691585St.nateldemoura@f5.com 701489St.nateldemoura@f5.com typedef struct { 711673St.nateldemoura@f5.com uint8_t language_deps; /* 1-bit */ 721704St.nateldemoura@f5.com uint8_t tmpfs; /* 1-bit */ 731708St.nateldemoura@f5.com uint8_t procfs; /* 1-bit */ 741585St.nateldemoura@f5.com } nxt_process_automount_t; 751585St.nateldemoura@f5.com 761489St.nateldemoura@f5.com 772260Sa.clayton@nginx.com struct nxt_cgroup_s { 782260Sa.clayton@nginx.com char *path; 792260Sa.clayton@nginx.com }; 802260Sa.clayton@nginx.com 812260Sa.clayton@nginx.com 821585St.nateldemoura@f5.com typedef struct { 831585St.nateldemoura@f5.com u_char *rootfs; 841585St.nateldemoura@f5.com nxt_process_automount_t automount; 851585St.nateldemoura@f5.com nxt_array_t *mounts; /* of nxt_mount_t */ 861585St.nateldemoura@f5.com 871585St.nateldemoura@f5.com nxt_isolation_cleanup_t cleanup; 881579St.nateldemoura@f5.com 892260Sa.clayton@nginx.com nxt_cgroup_cleanup_t cgroup_cleanup; 902260Sa.clayton@nginx.com #if (NXT_HAVE_CGROUP) 912260Sa.clayton@nginx.com nxt_cgroup_t cgroup; 922260Sa.clayton@nginx.com #endif 932260Sa.clayton@nginx.com 942321Sa.clayton@nginx.com #if (NXT_HAVE_LINUX_NS) 951585St.nateldemoura@f5.com nxt_clone_t clone; 961489St.nateldemoura@f5.com #endif 971489St.nateldemoura@f5.com 981489St.nateldemoura@f5.com #if (NXT_HAVE_PR_SET_NO_NEW_PRIVS) 991585St.nateldemoura@f5.com uint8_t new_privs; /* 1 bit */ 1001489St.nateldemoura@f5.com #endif 1011489St.nateldemoura@f5.com } nxt_process_isolation_t; 1021489St.nateldemoura@f5.com 103364Smax.romanov@nginx.com 1041579St.nateldemoura@f5.com struct nxt_process_s { 1051489St.nateldemoura@f5.com nxt_pid_t pid; 1061998St.nateldemoura@f5.com nxt_queue_t ports; /* of nxt_port_t.link */ 1071489St.nateldemoura@f5.com nxt_process_state_t state; 1081489St.nateldemoura@f5.com nxt_bool_t registered; 1091489St.nateldemoura@f5.com nxt_int_t use_count; 1101488St.nateldemoura@f5.com 1111489St.nateldemoura@f5.com nxt_port_mmaps_t incoming; 1121488St.nateldemoura@f5.com 1131998St.nateldemoura@f5.com 1141998St.nateldemoura@f5.com nxt_pid_t isolated_pid; 1151998St.nateldemoura@f5.com const char *name; 1161998St.nateldemoura@f5.com nxt_port_t *parent_port; 1171998St.nateldemoura@f5.com 1181489St.nateldemoura@f5.com uint32_t stream; 1191488St.nateldemoura@f5.com 1201489St.nateldemoura@f5.com nxt_mp_t *mem_pool; 1211489St.nateldemoura@f5.com nxt_credential_t *user_cred; 12242Smax.romanov@nginx.com 1231998St.nateldemoura@f5.com nxt_queue_t children; /* of nxt_process_t.link */ 1241998St.nateldemoura@f5.com nxt_queue_link_t link; /* for nxt_process_t.children */ 1251998St.nateldemoura@f5.com 1261489St.nateldemoura@f5.com nxt_process_data_t data; 1271489St.nateldemoura@f5.com 1281489St.nateldemoura@f5.com nxt_process_isolation_t isolation; 1291579St.nateldemoura@f5.com }; 1301488St.nateldemoura@f5.com 131141Smax.romanov@nginx.com 1321488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_prefork_t)(nxt_task_t *task, 1331488St.nateldemoura@f5.com nxt_process_t *process, nxt_mp_t *mp); 1341488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_postfork_t)(nxt_task_t *task, 1351488St.nateldemoura@f5.com nxt_process_t *process, nxt_mp_t *mp); 1361488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_setup_t)(nxt_task_t *task, 1371488St.nateldemoura@f5.com nxt_process_t *process); 1381488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, 1391488St.nateldemoura@f5.com nxt_process_data_t *data); 1401488St.nateldemoura@f5.com 14188Smax.romanov@nginx.com 1421488St.nateldemoura@f5.com typedef struct { 1431488St.nateldemoura@f5.com const char *name; 1441488St.nateldemoura@f5.com nxt_process_type_t type; 1451488St.nateldemoura@f5.com 1461488St.nateldemoura@f5.com nxt_process_prefork_t prefork; 1471488St.nateldemoura@f5.com 1481488St.nateldemoura@f5.com nxt_process_setup_t setup; 1491488St.nateldemoura@f5.com nxt_process_start_t start; 1501488St.nateldemoura@f5.com 1511488St.nateldemoura@f5.com uint8_t restart; /* 1-bit */ 1521488St.nateldemoura@f5.com 1531488St.nateldemoura@f5.com const nxt_port_handlers_t *port_handlers; 1541488St.nateldemoura@f5.com const nxt_sig_event_t *signals; 1552174Smax.romanov@gmail.com 1562174Smax.romanov@gmail.com nxt_queue_t *siblings; 1571488St.nateldemoura@f5.com } nxt_process_init_t; 1580Sigor@sysoev.ru 1590Sigor@sysoev.ru 1602015Smax.romanov@nginx.com extern uint8_t nxt_proc_keep_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 1612015Smax.romanov@nginx.com extern uint8_t nxt_proc_send_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 1622015Smax.romanov@nginx.com extern uint8_t nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 163366Smax.romanov@nginx.com 16420Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name, 16520Sigor@sysoev.ru char **argv, char **envp); 16620Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task); 16720Sigor@sysoev.ru NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns); 16820Sigor@sysoev.ru 16920Sigor@sysoev.ru NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv, 17020Sigor@sysoev.ru char ***orig_envp); 17120Sigor@sysoev.ru 1721488St.nateldemoura@f5.com #define nxt_process_init(process) \ 1731488St.nateldemoura@f5.com (nxt_pointer_to(process, sizeof(nxt_process_t))) 1741488St.nateldemoura@f5.com 17542Smax.romanov@nginx.com #define nxt_process_port_remove(port) \ 17642Smax.romanov@nginx.com nxt_queue_remove(&port->link) 17742Smax.romanov@nginx.com 17842Smax.romanov@nginx.com #define nxt_process_port_first(process) \ 17942Smax.romanov@nginx.com nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link) 18042Smax.romanov@nginx.com 181164Smax.romanov@nginx.com NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process, 182164Smax.romanov@nginx.com nxt_port_t *port); 18342Smax.romanov@nginx.com 18442Smax.romanov@nginx.com #define nxt_process_port_each(process, port) \ 18542Smax.romanov@nginx.com nxt_queue_each(port, &process->ports, nxt_port_t, link) 18642Smax.romanov@nginx.com 18742Smax.romanov@nginx.com #define nxt_process_port_loop \ 18842Smax.romanov@nginx.com nxt_queue_loop 18920Sigor@sysoev.ru 1901997St.nateldemoura@f5.com nxt_process_t *nxt_process_new(nxt_runtime_t *rt); 1911997St.nateldemoura@f5.com void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i); 1921997St.nateldemoura@f5.com nxt_int_t nxt_process_init_start(nxt_task_t *task, nxt_process_init_t init); 1931997St.nateldemoura@f5.com nxt_int_t nxt_process_start(nxt_task_t *task, nxt_process_t *process); 194366Smax.romanov@nginx.com nxt_process_type_t nxt_process_type(nxt_process_t *process); 195366Smax.romanov@nginx.com 1961254Shongzhidao@gmail.com void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i); 1971254Shongzhidao@gmail.com 198349Smax.romanov@nginx.com void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process); 19988Smax.romanov@nginx.com 2001488St.nateldemoura@f5.com void nxt_process_quit(nxt_task_t *task, nxt_uint_t exit_status); 2011488St.nateldemoura@f5.com void nxt_signal_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg); 202248Svbart@nginx.com 2031488St.nateldemoura@f5.com nxt_int_t nxt_process_core_setup(nxt_task_t *task, nxt_process_t *process); 2041488St.nateldemoura@f5.com nxt_int_t nxt_process_creds_set(nxt_task_t *task, nxt_process_t *process, 2051488St.nateldemoura@f5.com nxt_str_t *user, nxt_str_t *group); 2061488St.nateldemoura@f5.com nxt_int_t nxt_process_apply_creds(nxt_task_t *task, nxt_process_t *process); 2071306St.nateldemoura@f5.com 20820Sigor@sysoev.ru #if (NXT_HAVE_SETPROCTITLE) 2090Sigor@sysoev.ru 21020Sigor@sysoev.ru #define nxt_process_title(task, fmt, ...) \ 21120Sigor@sysoev.ru setproctitle(fmt, __VA_ARGS__) 21220Sigor@sysoev.ru 21320Sigor@sysoev.ru #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX) 21420Sigor@sysoev.ru 21520Sigor@sysoev.ru #define NXT_SETPROCTITLE_ARGV 1 21620Sigor@sysoev.ru NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...); 21720Sigor@sysoev.ru 21820Sigor@sysoev.ru #endif 21920Sigor@sysoev.ru 22020Sigor@sysoev.ru 22120Sigor@sysoev.ru #define nxt_sched_yield() \ 22220Sigor@sysoev.ru sched_yield() 2230Sigor@sysoev.ru 2240Sigor@sysoev.ru /* 2250Sigor@sysoev.ru * Solaris declares abort() as __NORETURN, 2260Sigor@sysoev.ru * raise(SIGABRT) is mostly the same. 2270Sigor@sysoev.ru */ 2280Sigor@sysoev.ru 22920Sigor@sysoev.ru #define nxt_abort() \ 2300Sigor@sysoev.ru (void) raise(SIGABRT) 2310Sigor@sysoev.ru 2320Sigor@sysoev.ru 2330Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_pid; 2340Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_ppid; 2351306St.nateldemoura@f5.com NXT_EXPORT extern nxt_uid_t nxt_euid; 2361306St.nateldemoura@f5.com NXT_EXPORT extern nxt_gid_t nxt_egid; 2370Sigor@sysoev.ru NXT_EXPORT extern char **nxt_process_argv; 2380Sigor@sysoev.ru NXT_EXPORT extern char ***nxt_process_environ; 2390Sigor@sysoev.ru 2400Sigor@sysoev.ru 24120Sigor@sysoev.ru #endif /* _NXT_PROCESS_H_INCLUDED_ */ 242