xref: /unit/src/nxt_process.h (revision 2450:14277f21a722)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #ifndef _NXT_PROCESS_H_INCLUDED_
8 #define _NXT_PROCESS_H_INCLUDED_
9 
10 #if (NXT_HAVE_LINUX_NS)
11 #include <unistd.h>
12 #include <nxt_clone.h>
13 #endif
14 
15 
16 typedef pid_t            nxt_pid_t;
17 
18 
19 typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
20 
21 
22 typedef struct {
23     nxt_runtime_t              *rt;
24 } nxt_discovery_init_t;
25 
26 
27 typedef struct {
28     nxt_str_t                  conf;
29 #if (NXT_TLS)
30     nxt_array_t                *certs;
31 #endif
32 #if (NXT_HAVE_NJS)
33     nxt_array_t                *scripts;
34 #endif
35 } nxt_controller_init_t;
36 
37 
38 typedef union {
39     void                       *discovery;
40     nxt_controller_init_t      controller;
41     void                       *router;
42     nxt_common_app_conf_t      *app;
43 } nxt_process_data_t;
44 
45 
46 typedef enum {
47     NXT_PROCESS_STATE_CREATING = 0,
48     NXT_PROCESS_STATE_CREATED,
49     NXT_PROCESS_STATE_READY,
50 } nxt_process_state_t;
51 
52 
53 typedef struct nxt_port_mmap_s  nxt_port_mmap_t;
54 typedef struct nxt_process_s    nxt_process_t;
55 typedef struct nxt_cgroup_s     nxt_cgroup_t;
56 typedef void (*nxt_isolation_cleanup_t)(nxt_task_t *task,
57     nxt_process_t *process);
58 typedef void (*nxt_cgroup_cleanup_t)(nxt_task_t *task,
59     const nxt_process_t *process);
60 
61 
62 typedef struct {
63     nxt_thread_mutex_t  mutex;
64     uint32_t            size;
65     uint32_t            cap;
66     nxt_port_mmap_t     *elts;
67 } nxt_port_mmaps_t;
68 
69 
70 typedef struct {
71     uint8_t             language_deps;      /* 1-bit */
72     uint8_t             tmpfs;              /* 1-bit */
73     uint8_t             procfs;             /* 1-bit */
74 } nxt_process_automount_t;
75 
76 
77 struct nxt_cgroup_s {
78     char  *path;
79 };
80 
81 
82 typedef struct {
83     u_char                   *rootfs;
84     nxt_process_automount_t  automount;
85     nxt_array_t              *mounts;     /* of nxt_mount_t */
86 
87     nxt_isolation_cleanup_t  cleanup;
88 
89     nxt_cgroup_cleanup_t     cgroup_cleanup;
90 #if (NXT_HAVE_CGROUP)
91     nxt_cgroup_t             cgroup;
92 #endif
93 
94 #if (NXT_HAVE_LINUX_NS)
95     nxt_clone_t              clone;
96 #endif
97 
98 #if (NXT_HAVE_PR_SET_NO_NEW_PRIVS)
99     uint8_t                  new_privs;   /* 1 bit */
100 #endif
101 } nxt_process_isolation_t;
102 
103 
104 struct nxt_process_s {
105     nxt_pid_t                pid;
106     nxt_queue_t              ports;      /* of nxt_port_t.link */
107     nxt_process_state_t      state;
108     nxt_bool_t               registered;
109     nxt_int_t                use_count;
110 
111     nxt_port_mmaps_t         incoming;
112 
113 
114     nxt_pid_t                isolated_pid;
115     const char               *name;
116     nxt_port_t               *parent_port;
117 
118     uint32_t                 stream;
119 
120     nxt_mp_t                 *mem_pool;
121     nxt_credential_t         *user_cred;
122 
123     nxt_queue_t              children;   /* of nxt_process_t.link */
124     nxt_queue_link_t         link;       /* for nxt_process_t.children */
125 
126     nxt_process_data_t       data;
127 
128     nxt_process_isolation_t  isolation;
129 };
130 
131 
132 typedef nxt_int_t (*nxt_process_prefork_t)(nxt_task_t *task,
133     nxt_process_t *process, nxt_mp_t *mp);
134 typedef nxt_int_t (*nxt_process_postfork_t)(nxt_task_t *task,
135     nxt_process_t *process, nxt_mp_t *mp);
136 typedef nxt_int_t (*nxt_process_setup_t)(nxt_task_t *task,
137     nxt_process_t *process);
138 typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task,
139     nxt_process_data_t *data);
140 
141 
142 typedef struct {
143     const char                 *name;
144     nxt_process_type_t         type;
145 
146     nxt_process_prefork_t      prefork;
147 
148     nxt_process_setup_t        setup;
149     nxt_process_start_t        start;
150 
151     uint8_t                    restart; /* 1-bit */
152 
153     const nxt_port_handlers_t  *port_handlers;
154     const nxt_sig_event_t      *signals;
155 
156     nxt_queue_t                *siblings;
157 } nxt_process_init_t;
158 
159 
160 extern uint8_t  nxt_proc_keep_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX];
161 extern uint8_t  nxt_proc_send_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX];
162 extern uint8_t  nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX];
163 
164 NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name,
165     char **argv, char **envp);
166 NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task);
167 NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns);
168 
169 NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv,
170     char ***orig_envp);
171 
172 #define nxt_process_init(process)                                             \
173     (nxt_pointer_to(process, sizeof(nxt_process_t)))
174 
175 #define nxt_process_port_remove(port)                                         \
176     nxt_queue_remove(&port->link)
177 
178 #define nxt_process_port_first(process)                                       \
179     nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link)
180 
181 NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process,
182     nxt_port_t *port);
183 
184 #define nxt_process_port_each(process, port)                                   \
185     nxt_queue_each(port, &process->ports, nxt_port_t, link)
186 
187 #define nxt_process_port_loop                                                 \
188     nxt_queue_loop
189 
190 nxt_process_t *nxt_process_new(nxt_runtime_t *rt);
191 void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i);
192 nxt_int_t nxt_process_init_start(nxt_task_t *task, nxt_process_init_t init);
193 nxt_int_t nxt_process_start(nxt_task_t *task, nxt_process_t *process);
194 nxt_process_type_t nxt_process_type(nxt_process_t *process);
195 
196 void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i);
197 
198 void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process);
199 
200 void nxt_process_quit(nxt_task_t *task, nxt_uint_t exit_status);
201 void nxt_signal_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
202 
203 nxt_int_t nxt_process_core_setup(nxt_task_t *task, nxt_process_t *process);
204 nxt_int_t nxt_process_creds_set(nxt_task_t *task, nxt_process_t *process,
205     nxt_str_t *user, nxt_str_t *group);
206 nxt_int_t nxt_process_apply_creds(nxt_task_t *task, nxt_process_t *process);
207 
208 #if (NXT_HAVE_SETPROCTITLE)
209 
210 #define nxt_process_title(task, fmt, ...)                                     \
211     setproctitle(fmt, __VA_ARGS__)
212 
213 #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX)
214 
215 #define NXT_SETPROCTITLE_ARGV  1
216 NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...);
217 
218 #endif
219 
220 
221 #define nxt_sched_yield()                                                     \
222     sched_yield()
223 
224 /*
225  * Solaris declares abort() as __NORETURN,
226  * raise(SIGABRT) is mostly the same.
227  */
228 
229 #define nxt_abort()                                                           \
230     (void) raise(SIGABRT)
231 
232 
233 NXT_EXPORT extern nxt_pid_t  nxt_pid;
234 NXT_EXPORT extern nxt_pid_t  nxt_ppid;
235 NXT_EXPORT extern nxt_uid_t  nxt_euid;
236 NXT_EXPORT extern nxt_gid_t  nxt_egid;
237 NXT_EXPORT extern char       **nxt_process_argv;
238 NXT_EXPORT extern char       ***nxt_process_environ;
239 
240 
241 #endif /* _NXT_PROCESS_H_INCLUDED_ */
242