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