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