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) 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 161488St.nateldemoura@f5.com #if (NXT_HAVE_CLONE) 171488St.nateldemoura@f5.com /* 181488St.nateldemoura@f5.com * Old glibc wrapper for getpid(2) returns a cached pid invalidated only by 191488St.nateldemoura@f5.com * fork(2) calls. As we use clone(2) for container, it returns the wrong pid. 201488St.nateldemoura@f5.com */ 211488St.nateldemoura@f5.com #define nxt_getpid() \ 221488St.nateldemoura@f5.com syscall(__NR_getpid) 231488St.nateldemoura@f5.com #else 241488St.nateldemoura@f5.com #define nxt_getpid() \ 251488St.nateldemoura@f5.com getpid() 261488St.nateldemoura@f5.com #endif 271488St.nateldemoura@f5.com 2820Sigor@sysoev.ru typedef pid_t nxt_pid_t; 2920Sigor@sysoev.ru 3020Sigor@sysoev.ru 311488St.nateldemoura@f5.com typedef struct nxt_common_app_conf_s nxt_common_app_conf_t; 321488St.nateldemoura@f5.com 331488St.nateldemoura@f5.com 341488St.nateldemoura@f5.com typedef struct { 351488St.nateldemoura@f5.com nxt_runtime_t *rt; 361488St.nateldemoura@f5.com } nxt_discovery_init_t; 370Sigor@sysoev.ru 381488St.nateldemoura@f5.com 391488St.nateldemoura@f5.com typedef struct { 401488St.nateldemoura@f5.com nxt_str_t conf; 411488St.nateldemoura@f5.com #if (NXT_TLS) 421488St.nateldemoura@f5.com nxt_array_t *certs; 431488St.nateldemoura@f5.com #endif 441488St.nateldemoura@f5.com } nxt_controller_init_t; 4520Sigor@sysoev.ru 46141Smax.romanov@nginx.com 471488St.nateldemoura@f5.com typedef union { 481488St.nateldemoura@f5.com void *discovery; 491488St.nateldemoura@f5.com nxt_controller_init_t controller; 501488St.nateldemoura@f5.com void *router; 511488St.nateldemoura@f5.com nxt_common_app_conf_t *app; 521488St.nateldemoura@f5.com } nxt_process_data_t; 53141Smax.romanov@nginx.com 541488St.nateldemoura@f5.com 551488St.nateldemoura@f5.com typedef enum { 561488St.nateldemoura@f5.com NXT_PROCESS_STATE_CREATING = 0, 571488St.nateldemoura@f5.com NXT_PROCESS_STATE_CREATED, 581488St.nateldemoura@f5.com NXT_PROCESS_STATE_READY, 591488St.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*1579St.nateldemoura@f5.com typedef struct nxt_process_s nxt_process_t; 64*1579St.nateldemoura@f5.com typedef void (*nxt_isolation_cleanup_t)(nxt_task_t *task, 65*1579St.nateldemoura@f5.com nxt_process_t *process); 661488St.nateldemoura@f5.com 67364Smax.romanov@nginx.com 681488St.nateldemoura@f5.com typedef struct { 69364Smax.romanov@nginx.com nxt_thread_mutex_t mutex; 70364Smax.romanov@nginx.com uint32_t size; 71364Smax.romanov@nginx.com uint32_t cap; 72364Smax.romanov@nginx.com nxt_port_mmap_t *elts; 731488St.nateldemoura@f5.com } nxt_port_mmaps_t; 74364Smax.romanov@nginx.com 751489St.nateldemoura@f5.com typedef struct { 761489St.nateldemoura@f5.com u_char *rootfs; 771489St.nateldemoura@f5.com nxt_array_t *mounts; /* of nxt_mount_t */ 781489St.nateldemoura@f5.com 79*1579St.nateldemoura@f5.com nxt_isolation_cleanup_t cleanup; 80*1579St.nateldemoura@f5.com 811489St.nateldemoura@f5.com #if (NXT_HAVE_CLONE) 821489St.nateldemoura@f5.com nxt_clone_t clone; 831489St.nateldemoura@f5.com #endif 841489St.nateldemoura@f5.com 851489St.nateldemoura@f5.com #if (NXT_HAVE_PR_SET_NO_NEW_PRIVS) 861489St.nateldemoura@f5.com uint8_t new_privs; /* 1 bit */ 871489St.nateldemoura@f5.com #endif 881489St.nateldemoura@f5.com } nxt_process_isolation_t; 891489St.nateldemoura@f5.com 90364Smax.romanov@nginx.com 91*1579St.nateldemoura@f5.com struct nxt_process_s { 921489St.nateldemoura@f5.com nxt_pid_t pid; 931489St.nateldemoura@f5.com const char *name; 941489St.nateldemoura@f5.com nxt_queue_t ports; /* of nxt_port_t */ 951489St.nateldemoura@f5.com nxt_process_state_t state; 961489St.nateldemoura@f5.com nxt_bool_t registered; 971489St.nateldemoura@f5.com nxt_int_t use_count; 981488St.nateldemoura@f5.com 991489St.nateldemoura@f5.com nxt_port_mmaps_t incoming; 1001488St.nateldemoura@f5.com 1011489St.nateldemoura@f5.com nxt_thread_mutex_t cp_mutex; 1021488St.nateldemoura@f5.com 1031489St.nateldemoura@f5.com uint32_t stream; 1041488St.nateldemoura@f5.com 1051489St.nateldemoura@f5.com nxt_mp_t *mem_pool; 1061489St.nateldemoura@f5.com nxt_credential_t *user_cred; 10742Smax.romanov@nginx.com 1081489St.nateldemoura@f5.com nxt_process_data_t data; 1091489St.nateldemoura@f5.com 1101489St.nateldemoura@f5.com nxt_process_isolation_t isolation; 111*1579St.nateldemoura@f5.com }; 1121488St.nateldemoura@f5.com 113141Smax.romanov@nginx.com 1141488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_prefork_t)(nxt_task_t *task, 1151488St.nateldemoura@f5.com nxt_process_t *process, nxt_mp_t *mp); 1161488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_postfork_t)(nxt_task_t *task, 1171488St.nateldemoura@f5.com nxt_process_t *process, nxt_mp_t *mp); 1181488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_setup_t)(nxt_task_t *task, 1191488St.nateldemoura@f5.com nxt_process_t *process); 1201488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, 1211488St.nateldemoura@f5.com nxt_process_data_t *data); 1221488St.nateldemoura@f5.com 12388Smax.romanov@nginx.com 1241488St.nateldemoura@f5.com typedef struct { 1251488St.nateldemoura@f5.com const char *name; 1261488St.nateldemoura@f5.com nxt_process_type_t type; 1271488St.nateldemoura@f5.com 1281488St.nateldemoura@f5.com nxt_process_prefork_t prefork; 1291488St.nateldemoura@f5.com 1301488St.nateldemoura@f5.com nxt_process_setup_t setup; 1311488St.nateldemoura@f5.com nxt_process_start_t start; 1321488St.nateldemoura@f5.com 1331488St.nateldemoura@f5.com uint8_t restart; /* 1-bit */ 1341488St.nateldemoura@f5.com 1351488St.nateldemoura@f5.com const nxt_port_handlers_t *port_handlers; 1361488St.nateldemoura@f5.com const nxt_sig_event_t *signals; 1371488St.nateldemoura@f5.com } nxt_process_init_t; 1380Sigor@sysoev.ru 1390Sigor@sysoev.ru 140761Smax.romanov@nginx.com extern nxt_bool_t nxt_proc_conn_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 141366Smax.romanov@nginx.com extern nxt_bool_t 142761Smax.romanov@nginx.com nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 143366Smax.romanov@nginx.com 14420Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task, 14578Smax.romanov@nginx.com nxt_process_t *process); 14620Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name, 14720Sigor@sysoev.ru char **argv, char **envp); 14820Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task); 14920Sigor@sysoev.ru NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns); 15020Sigor@sysoev.ru 15120Sigor@sysoev.ru NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv, 15220Sigor@sysoev.ru char ***orig_envp); 15320Sigor@sysoev.ru 1541488St.nateldemoura@f5.com #define nxt_process_init(process) \ 1551488St.nateldemoura@f5.com (nxt_pointer_to(process, sizeof(nxt_process_t))) 1561488St.nateldemoura@f5.com 15742Smax.romanov@nginx.com #define nxt_process_port_remove(port) \ 15842Smax.romanov@nginx.com nxt_queue_remove(&port->link) 15942Smax.romanov@nginx.com 16042Smax.romanov@nginx.com #define nxt_process_port_first(process) \ 16142Smax.romanov@nginx.com nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link) 16242Smax.romanov@nginx.com 163164Smax.romanov@nginx.com NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process, 164164Smax.romanov@nginx.com nxt_port_t *port); 16542Smax.romanov@nginx.com 16642Smax.romanov@nginx.com #define nxt_process_port_each(process, port) \ 16742Smax.romanov@nginx.com nxt_queue_each(port, &process->ports, nxt_port_t, link) 16842Smax.romanov@nginx.com 16942Smax.romanov@nginx.com #define nxt_process_port_loop \ 17042Smax.romanov@nginx.com nxt_queue_loop 17120Sigor@sysoev.ru 172366Smax.romanov@nginx.com nxt_process_type_t nxt_process_type(nxt_process_t *process); 173366Smax.romanov@nginx.com 1741254Shongzhidao@gmail.com void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i); 1751254Shongzhidao@gmail.com 176349Smax.romanov@nginx.com void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process); 17788Smax.romanov@nginx.com 1781488St.nateldemoura@f5.com void nxt_process_quit(nxt_task_t *task, nxt_uint_t exit_status); 1791488St.nateldemoura@f5.com void nxt_signal_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg); 180248Svbart@nginx.com 1811488St.nateldemoura@f5.com nxt_int_t nxt_process_core_setup(nxt_task_t *task, nxt_process_t *process); 1821488St.nateldemoura@f5.com nxt_int_t nxt_process_creds_set(nxt_task_t *task, nxt_process_t *process, 1831488St.nateldemoura@f5.com nxt_str_t *user, nxt_str_t *group); 1841488St.nateldemoura@f5.com nxt_int_t nxt_process_apply_creds(nxt_task_t *task, nxt_process_t *process); 1851306St.nateldemoura@f5.com 18620Sigor@sysoev.ru #if (NXT_HAVE_SETPROCTITLE) 1870Sigor@sysoev.ru 18820Sigor@sysoev.ru #define nxt_process_title(task, fmt, ...) \ 18920Sigor@sysoev.ru setproctitle(fmt, __VA_ARGS__) 19020Sigor@sysoev.ru 19120Sigor@sysoev.ru #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX) 19220Sigor@sysoev.ru 19320Sigor@sysoev.ru #define NXT_SETPROCTITLE_ARGV 1 19420Sigor@sysoev.ru NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...); 19520Sigor@sysoev.ru 19620Sigor@sysoev.ru #endif 19720Sigor@sysoev.ru 19820Sigor@sysoev.ru 19920Sigor@sysoev.ru #define nxt_sched_yield() \ 20020Sigor@sysoev.ru sched_yield() 2010Sigor@sysoev.ru 2020Sigor@sysoev.ru /* 2030Sigor@sysoev.ru * Solaris declares abort() as __NORETURN, 2040Sigor@sysoev.ru * raise(SIGABRT) is mostly the same. 2050Sigor@sysoev.ru */ 2060Sigor@sysoev.ru 20720Sigor@sysoev.ru #define nxt_abort() \ 2080Sigor@sysoev.ru (void) raise(SIGABRT) 2090Sigor@sysoev.ru 2100Sigor@sysoev.ru 2110Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_pid; 2120Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_ppid; 2131306St.nateldemoura@f5.com NXT_EXPORT extern nxt_uid_t nxt_euid; 2141306St.nateldemoura@f5.com NXT_EXPORT extern nxt_gid_t nxt_egid; 2150Sigor@sysoev.ru NXT_EXPORT extern char **nxt_process_argv; 2160Sigor@sysoev.ru NXT_EXPORT extern char ***nxt_process_environ; 2170Sigor@sysoev.ru 2180Sigor@sysoev.ru 21920Sigor@sysoev.ru #endif /* _NXT_PROCESS_H_INCLUDED_ */ 220