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 101306St.nateldemoura@f5.com #if (NXT_HAVE_CLONE) 11*1488St.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 16*1488St.nateldemoura@f5.com #if (NXT_HAVE_CLONE) 17*1488St.nateldemoura@f5.com /* 18*1488St.nateldemoura@f5.com * Old glibc wrapper for getpid(2) returns a cached pid invalidated only by 19*1488St.nateldemoura@f5.com * fork(2) calls. As we use clone(2) for container, it returns the wrong pid. 20*1488St.nateldemoura@f5.com */ 21*1488St.nateldemoura@f5.com #define nxt_getpid() \ 22*1488St.nateldemoura@f5.com syscall(__NR_getpid) 23*1488St.nateldemoura@f5.com #else 24*1488St.nateldemoura@f5.com #define nxt_getpid() \ 25*1488St.nateldemoura@f5.com getpid() 26*1488St.nateldemoura@f5.com #endif 27*1488St.nateldemoura@f5.com 2820Sigor@sysoev.ru typedef pid_t nxt_pid_t; 2920Sigor@sysoev.ru 3020Sigor@sysoev.ru 31*1488St.nateldemoura@f5.com typedef struct nxt_common_app_conf_s nxt_common_app_conf_t; 32*1488St.nateldemoura@f5.com 33*1488St.nateldemoura@f5.com 34*1488St.nateldemoura@f5.com typedef struct { 35*1488St.nateldemoura@f5.com nxt_runtime_t *rt; 36*1488St.nateldemoura@f5.com } nxt_discovery_init_t; 370Sigor@sysoev.ru 38*1488St.nateldemoura@f5.com 39*1488St.nateldemoura@f5.com typedef struct { 40*1488St.nateldemoura@f5.com nxt_str_t conf; 41*1488St.nateldemoura@f5.com #if (NXT_TLS) 42*1488St.nateldemoura@f5.com nxt_array_t *certs; 43*1488St.nateldemoura@f5.com #endif 44*1488St.nateldemoura@f5.com } nxt_controller_init_t; 4520Sigor@sysoev.ru 46141Smax.romanov@nginx.com 47*1488St.nateldemoura@f5.com typedef union { 48*1488St.nateldemoura@f5.com void *discovery; 49*1488St.nateldemoura@f5.com nxt_controller_init_t controller; 50*1488St.nateldemoura@f5.com void *router; 51*1488St.nateldemoura@f5.com nxt_common_app_conf_t *app; 52*1488St.nateldemoura@f5.com } nxt_process_data_t; 53141Smax.romanov@nginx.com 54*1488St.nateldemoura@f5.com 55*1488St.nateldemoura@f5.com typedef enum { 56*1488St.nateldemoura@f5.com NXT_PROCESS_STATE_CREATING = 0, 57*1488St.nateldemoura@f5.com NXT_PROCESS_STATE_CREATED, 58*1488St.nateldemoura@f5.com NXT_PROCESS_STATE_READY, 59*1488St.nateldemoura@f5.com } nxt_process_state_t; 6020Sigor@sysoev.ru 6120Sigor@sysoev.ru 62364Smax.romanov@nginx.com typedef struct nxt_port_mmap_s nxt_port_mmap_t; 63*1488St.nateldemoura@f5.com 64364Smax.romanov@nginx.com 65*1488St.nateldemoura@f5.com typedef struct { 66364Smax.romanov@nginx.com nxt_thread_mutex_t mutex; 67364Smax.romanov@nginx.com uint32_t size; 68364Smax.romanov@nginx.com uint32_t cap; 69364Smax.romanov@nginx.com nxt_port_mmap_t *elts; 70*1488St.nateldemoura@f5.com } nxt_port_mmaps_t; 71364Smax.romanov@nginx.com 72364Smax.romanov@nginx.com 7320Sigor@sysoev.ru typedef struct { 74*1488St.nateldemoura@f5.com nxt_pid_t pid; 75*1488St.nateldemoura@f5.com const char *name; 76*1488St.nateldemoura@f5.com nxt_queue_t ports; /* of nxt_port_t */ 77*1488St.nateldemoura@f5.com nxt_process_state_t state; 78*1488St.nateldemoura@f5.com nxt_bool_t registered; 79*1488St.nateldemoura@f5.com nxt_int_t use_count; 80*1488St.nateldemoura@f5.com 81*1488St.nateldemoura@f5.com nxt_port_mmaps_t incoming; 82*1488St.nateldemoura@f5.com nxt_port_mmaps_t outgoing; 83*1488St.nateldemoura@f5.com 84*1488St.nateldemoura@f5.com nxt_thread_mutex_t cp_mutex; 85*1488St.nateldemoura@f5.com nxt_lvlhsh_t connected_ports; /* of nxt_port_t */ 86*1488St.nateldemoura@f5.com 87*1488St.nateldemoura@f5.com uint32_t stream; 88*1488St.nateldemoura@f5.com 89*1488St.nateldemoura@f5.com nxt_mp_t *mem_pool; 90*1488St.nateldemoura@f5.com nxt_credential_t *user_cred; 91*1488St.nateldemoura@f5.com 92*1488St.nateldemoura@f5.com nxt_process_data_t data; 9342Smax.romanov@nginx.com 94*1488St.nateldemoura@f5.com union { 95*1488St.nateldemoura@f5.com #if (NXT_HAVE_CLONE) 96*1488St.nateldemoura@f5.com nxt_clone_t clone; 97*1488St.nateldemoura@f5.com #endif 98*1488St.nateldemoura@f5.com } isolation; 99*1488St.nateldemoura@f5.com } nxt_process_t; 100*1488St.nateldemoura@f5.com 101141Smax.romanov@nginx.com 102*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_prefork_t)(nxt_task_t *task, 103*1488St.nateldemoura@f5.com nxt_process_t *process, nxt_mp_t *mp); 104*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_postfork_t)(nxt_task_t *task, 105*1488St.nateldemoura@f5.com nxt_process_t *process, nxt_mp_t *mp); 106*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_setup_t)(nxt_task_t *task, 107*1488St.nateldemoura@f5.com nxt_process_t *process); 108*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, 109*1488St.nateldemoura@f5.com nxt_process_data_t *data); 110*1488St.nateldemoura@f5.com 11188Smax.romanov@nginx.com 112*1488St.nateldemoura@f5.com typedef struct { 113*1488St.nateldemoura@f5.com const char *name; 114*1488St.nateldemoura@f5.com nxt_process_type_t type; 115*1488St.nateldemoura@f5.com 116*1488St.nateldemoura@f5.com nxt_process_prefork_t prefork; 117*1488St.nateldemoura@f5.com 118*1488St.nateldemoura@f5.com nxt_process_setup_t setup; 119*1488St.nateldemoura@f5.com nxt_process_start_t start; 120*1488St.nateldemoura@f5.com 121*1488St.nateldemoura@f5.com uint8_t restart; /* 1-bit */ 122*1488St.nateldemoura@f5.com 123*1488St.nateldemoura@f5.com const nxt_port_handlers_t *port_handlers; 124*1488St.nateldemoura@f5.com const nxt_sig_event_t *signals; 125*1488St.nateldemoura@f5.com } nxt_process_init_t; 1260Sigor@sysoev.ru 1270Sigor@sysoev.ru 128761Smax.romanov@nginx.com extern nxt_bool_t nxt_proc_conn_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 129366Smax.romanov@nginx.com extern nxt_bool_t 130761Smax.romanov@nginx.com nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 131366Smax.romanov@nginx.com 13220Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task, 13378Smax.romanov@nginx.com nxt_process_t *process); 13420Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name, 13520Sigor@sysoev.ru char **argv, char **envp); 13620Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task); 13720Sigor@sysoev.ru NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns); 13820Sigor@sysoev.ru 13920Sigor@sysoev.ru NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv, 14020Sigor@sysoev.ru char ***orig_envp); 14120Sigor@sysoev.ru 142*1488St.nateldemoura@f5.com #define nxt_process_init(process) \ 143*1488St.nateldemoura@f5.com (nxt_pointer_to(process, sizeof(nxt_process_t))) 144*1488St.nateldemoura@f5.com 14542Smax.romanov@nginx.com #define nxt_process_port_remove(port) \ 14642Smax.romanov@nginx.com nxt_queue_remove(&port->link) 14742Smax.romanov@nginx.com 14842Smax.romanov@nginx.com #define nxt_process_port_first(process) \ 14942Smax.romanov@nginx.com nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link) 15042Smax.romanov@nginx.com 151164Smax.romanov@nginx.com NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process, 152164Smax.romanov@nginx.com nxt_port_t *port); 15342Smax.romanov@nginx.com 15442Smax.romanov@nginx.com #define nxt_process_port_each(process, port) \ 15542Smax.romanov@nginx.com nxt_queue_each(port, &process->ports, nxt_port_t, link) 15642Smax.romanov@nginx.com 15742Smax.romanov@nginx.com #define nxt_process_port_loop \ 15842Smax.romanov@nginx.com nxt_queue_loop 15920Sigor@sysoev.ru 160366Smax.romanov@nginx.com nxt_process_type_t nxt_process_type(nxt_process_t *process); 161366Smax.romanov@nginx.com 1621254Shongzhidao@gmail.com void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i); 1631254Shongzhidao@gmail.com 164349Smax.romanov@nginx.com void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process); 16588Smax.romanov@nginx.com 1661452Smax.romanov@nginx.com void nxt_process_connected_port_add(nxt_process_t *process, nxt_port_t *port); 1671452Smax.romanov@nginx.com 16888Smax.romanov@nginx.com void nxt_process_connected_port_remove(nxt_process_t *process, 16988Smax.romanov@nginx.com nxt_port_t *port); 17088Smax.romanov@nginx.com 1711452Smax.romanov@nginx.com nxt_port_t *nxt_process_connected_port_find(nxt_process_t *process, 1721446Smax.romanov@nginx.com nxt_port_t *port); 17388Smax.romanov@nginx.com 174*1488St.nateldemoura@f5.com void nxt_process_quit(nxt_task_t *task, nxt_uint_t exit_status); 175*1488St.nateldemoura@f5.com void nxt_signal_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg); 176248Svbart@nginx.com 177*1488St.nateldemoura@f5.com nxt_int_t nxt_process_core_setup(nxt_task_t *task, nxt_process_t *process); 178*1488St.nateldemoura@f5.com nxt_int_t nxt_process_creds_set(nxt_task_t *task, nxt_process_t *process, 179*1488St.nateldemoura@f5.com nxt_str_t *user, nxt_str_t *group); 180*1488St.nateldemoura@f5.com nxt_int_t nxt_process_apply_creds(nxt_task_t *task, nxt_process_t *process); 1811306St.nateldemoura@f5.com 182*1488St.nateldemoura@f5.com #if (NXT_HAVE_CLONE_NEWUSER) 183*1488St.nateldemoura@f5.com nxt_int_t nxt_process_vldt_isolation_creds(nxt_task_t *task, 184*1488St.nateldemoura@f5.com nxt_process_t *process); 185*1488St.nateldemoura@f5.com #endif 186248Svbart@nginx.com 18720Sigor@sysoev.ru #if (NXT_HAVE_SETPROCTITLE) 1880Sigor@sysoev.ru 18920Sigor@sysoev.ru #define nxt_process_title(task, fmt, ...) \ 19020Sigor@sysoev.ru setproctitle(fmt, __VA_ARGS__) 19120Sigor@sysoev.ru 19220Sigor@sysoev.ru #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX) 19320Sigor@sysoev.ru 19420Sigor@sysoev.ru #define NXT_SETPROCTITLE_ARGV 1 19520Sigor@sysoev.ru NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...); 19620Sigor@sysoev.ru 19720Sigor@sysoev.ru #endif 19820Sigor@sysoev.ru 19920Sigor@sysoev.ru 20020Sigor@sysoev.ru #define nxt_sched_yield() \ 20120Sigor@sysoev.ru sched_yield() 2020Sigor@sysoev.ru 2030Sigor@sysoev.ru /* 2040Sigor@sysoev.ru * Solaris declares abort() as __NORETURN, 2050Sigor@sysoev.ru * raise(SIGABRT) is mostly the same. 2060Sigor@sysoev.ru */ 2070Sigor@sysoev.ru 20820Sigor@sysoev.ru #define nxt_abort() \ 2090Sigor@sysoev.ru (void) raise(SIGABRT) 2100Sigor@sysoev.ru 2110Sigor@sysoev.ru 2120Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_pid; 2130Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_ppid; 2141306St.nateldemoura@f5.com NXT_EXPORT extern nxt_uid_t nxt_euid; 2151306St.nateldemoura@f5.com NXT_EXPORT extern nxt_gid_t nxt_egid; 2160Sigor@sysoev.ru NXT_EXPORT extern char **nxt_process_argv; 2170Sigor@sysoev.ru NXT_EXPORT extern char ***nxt_process_environ; 2180Sigor@sysoev.ru 2190Sigor@sysoev.ru 22020Sigor@sysoev.ru #endif /* _NXT_PROCESS_H_INCLUDED_ */ 221