xref: /unit/src/nxt_process.h (revision 2450:14277f21a722)
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