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 1020Sigor@sysoev.ru 1120Sigor@sysoev.ru typedef enum { 1220Sigor@sysoev.ru NXT_PROCESS_SINGLE = 0, 1320Sigor@sysoev.ru NXT_PROCESS_MASTER, 1420Sigor@sysoev.ru NXT_PROCESS_CONTROLLER, 1520Sigor@sysoev.ru NXT_PROCESS_ROUTER, 1620Sigor@sysoev.ru NXT_PROCESS_WORKER, 1720Sigor@sysoev.ru } nxt_process_type_t; 180Sigor@sysoev.ru 190Sigor@sysoev.ru 2020Sigor@sysoev.ru typedef pid_t nxt_pid_t; 2120Sigor@sysoev.ru typedef uid_t nxt_uid_t; 2220Sigor@sysoev.ru typedef gid_t nxt_gid_t; 2320Sigor@sysoev.ru 2420Sigor@sysoev.ru 2520Sigor@sysoev.ru typedef struct { 2620Sigor@sysoev.ru const char *user; 2720Sigor@sysoev.ru nxt_uid_t uid; 2820Sigor@sysoev.ru nxt_gid_t base_gid; 2920Sigor@sysoev.ru nxt_uint_t ngroups; 3020Sigor@sysoev.ru nxt_gid_t *gids; 3120Sigor@sysoev.ru } nxt_user_cred_t; 3220Sigor@sysoev.ru 3320Sigor@sysoev.ru typedef struct nxt_process_init_s nxt_process_init_t; 3420Sigor@sysoev.ru typedef nxt_int_t (*nxt_process_star_t)(nxt_task_t *task, nxt_runtime_t *rt); 350Sigor@sysoev.ru 360Sigor@sysoev.ru 3720Sigor@sysoev.ru struct nxt_process_init_s { 3820Sigor@sysoev.ru nxt_process_star_t start; 3920Sigor@sysoev.ru const char *name; 4020Sigor@sysoev.ru nxt_user_cred_t *user_cred; 4120Sigor@sysoev.ru 4220Sigor@sysoev.ru nxt_port_t *port; 4320Sigor@sysoev.ru nxt_port_t *master_port; 4420Sigor@sysoev.ru nxt_port_handler_t *port_handlers; 4520Sigor@sysoev.ru const nxt_sig_event_t *signals; 4620Sigor@sysoev.ru 4720Sigor@sysoev.ru nxt_process_type_t type:8; /* 3 bits */ 4820Sigor@sysoev.ru }; 4920Sigor@sysoev.ru 5020Sigor@sysoev.ru 5120Sigor@sysoev.ru typedef struct { 52*42Smax.romanov@nginx.com nxt_mem_pool_t *mem_pool; 53*42Smax.romanov@nginx.com 5420Sigor@sysoev.ru nxt_pid_t pid; 55*42Smax.romanov@nginx.com nxt_queue_t ports; /* of nxt_port_t */ 56*42Smax.romanov@nginx.com nxt_port_id_t last_port_id; 57*42Smax.romanov@nginx.com 5820Sigor@sysoev.ru nxt_process_init_t *init; 59*42Smax.romanov@nginx.com nxt_array_t *incoming; /* of nxt_mmap_t */ 60*42Smax.romanov@nginx.com nxt_array_t *outgoing; /* of nxt_mmap_t */ 6120Sigor@sysoev.ru } nxt_process_t; 620Sigor@sysoev.ru 630Sigor@sysoev.ru 6420Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task, 6520Sigor@sysoev.ru nxt_process_init_t *process); 6620Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name, 6720Sigor@sysoev.ru char **argv, char **envp); 6820Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task); 6920Sigor@sysoev.ru NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns); 7020Sigor@sysoev.ru 7120Sigor@sysoev.ru NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv, 7220Sigor@sysoev.ru char ***orig_envp); 7320Sigor@sysoev.ru 74*42Smax.romanov@nginx.com NXT_EXPORT nxt_port_t * nxt_process_port_new(nxt_process_t *process); 75*42Smax.romanov@nginx.com 76*42Smax.romanov@nginx.com #define nxt_process_port_remove(port) \ 77*42Smax.romanov@nginx.com nxt_queue_remove(&port->link) 78*42Smax.romanov@nginx.com 79*42Smax.romanov@nginx.com #define nxt_process_port_first(process) \ 80*42Smax.romanov@nginx.com nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link) 81*42Smax.romanov@nginx.com 82*42Smax.romanov@nginx.com #define nxt_process_port_add(process, port) \ 83*42Smax.romanov@nginx.com nxt_queue_insert_tail(&process->ports, &port->link) 84*42Smax.romanov@nginx.com 85*42Smax.romanov@nginx.com #define nxt_process_port_each(process, port) \ 86*42Smax.romanov@nginx.com nxt_queue_each(port, &process->ports, nxt_port_t, link) 87*42Smax.romanov@nginx.com 88*42Smax.romanov@nginx.com #define nxt_process_port_loop \ 89*42Smax.romanov@nginx.com nxt_queue_loop 9020Sigor@sysoev.ru 9120Sigor@sysoev.ru #if (NXT_HAVE_SETPROCTITLE) 920Sigor@sysoev.ru 9320Sigor@sysoev.ru #define nxt_process_title(task, fmt, ...) \ 9420Sigor@sysoev.ru setproctitle(fmt, __VA_ARGS__) 9520Sigor@sysoev.ru 9620Sigor@sysoev.ru #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX) 9720Sigor@sysoev.ru 9820Sigor@sysoev.ru #define NXT_SETPROCTITLE_ARGV 1 9920Sigor@sysoev.ru NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...); 10020Sigor@sysoev.ru 10120Sigor@sysoev.ru #endif 10220Sigor@sysoev.ru 10320Sigor@sysoev.ru 10420Sigor@sysoev.ru #define nxt_sched_yield() \ 10520Sigor@sysoev.ru sched_yield() 1060Sigor@sysoev.ru 1070Sigor@sysoev.ru /* 1080Sigor@sysoev.ru * Solaris declares abort() as __NORETURN, 1090Sigor@sysoev.ru * raise(SIGABRT) is mostly the same. 1100Sigor@sysoev.ru */ 1110Sigor@sysoev.ru 11220Sigor@sysoev.ru #define nxt_abort() \ 1130Sigor@sysoev.ru (void) raise(SIGABRT) 1140Sigor@sysoev.ru 11520Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_user_cred_get(nxt_task_t *task, nxt_user_cred_t *uc, 11620Sigor@sysoev.ru const char *group); 11720Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_user_cred_set(nxt_task_t *task, nxt_user_cred_t *uc); 1180Sigor@sysoev.ru 1190Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_pid; 1200Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t nxt_ppid; 1210Sigor@sysoev.ru NXT_EXPORT extern char **nxt_process_argv; 1220Sigor@sysoev.ru NXT_EXPORT extern char ***nxt_process_environ; 1230Sigor@sysoev.ru 1240Sigor@sysoev.ru 12520Sigor@sysoev.ru #endif /* _NXT_PROCESS_H_INCLUDED_ */ 126