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