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