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_CLONE) 11 #include <unistd.h> 12 #include <nxt_clone.h> 13 #endif 14 15 16 #if (NXT_HAVE_CLONE) 17 /* 18 * Old glibc wrapper for getpid(2) returns a cached pid invalidated only by 19 * fork(2) calls. As we use clone(2) for container, it returns the wrong pid. 20 */ 21 #define nxt_getpid() \ 22 syscall(__NR_getpid) 23 #else 24 #define nxt_getpid() \ 25 getpid() 26 #endif 27 28 typedef pid_t nxt_pid_t; 29 30 31 typedef struct nxt_common_app_conf_s nxt_common_app_conf_t; 32 33 34 typedef struct { 35 nxt_runtime_t *rt; 36 } nxt_discovery_init_t; 37 38 39 typedef struct { 40 nxt_str_t conf; 41 #if (NXT_TLS) 42 nxt_array_t *certs; 43 #endif 44 } nxt_controller_init_t; 45 46 47 typedef union { 48 void *discovery; 49 nxt_controller_init_t controller; 50 void *router; 51 nxt_common_app_conf_t *app; 52 } nxt_process_data_t; 53 54 55 typedef enum { 56 NXT_PROCESS_STATE_CREATING = 0, 57 NXT_PROCESS_STATE_CREATED, 58 NXT_PROCESS_STATE_READY, 59 } nxt_process_state_t; 60 61 62 typedef struct nxt_port_mmap_s nxt_port_mmap_t; 63 typedef struct nxt_process_s nxt_process_t; 64 typedef void (*nxt_isolation_cleanup_t)(nxt_task_t *task, 65 nxt_process_t *process); 66 67 68 typedef struct { 69 nxt_thread_mutex_t mutex; 70 uint32_t size; 71 uint32_t cap; 72 nxt_port_mmap_t *elts; 73 } nxt_port_mmaps_t; 74 75 76 typedef struct { 77 uint8_t language_deps; /* 1-bit */ 78 uint8_t tmpfs; /* 1-bit */ 79 } nxt_process_automount_t; 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 #if (NXT_HAVE_CLONE) 90 nxt_clone_t clone; 91 #endif 92 93 #if (NXT_HAVE_PR_SET_NO_NEW_PRIVS) 94 uint8_t new_privs; /* 1 bit */ 95 #endif 96 } nxt_process_isolation_t; 97 98 99 struct nxt_process_s { 100 nxt_pid_t pid; 101 const char *name; 102 nxt_queue_t ports; /* of nxt_port_t */ 103 nxt_process_state_t state; 104 nxt_bool_t registered; 105 nxt_int_t use_count; 106 107 nxt_port_mmaps_t incoming; 108 109 nxt_thread_mutex_t cp_mutex; 110 111 uint32_t stream; 112 113 nxt_mp_t *mem_pool; 114 nxt_credential_t *user_cred; 115 116 nxt_process_data_t data; 117 118 nxt_process_isolation_t isolation; 119 }; 120 121 122 typedef nxt_int_t (*nxt_process_prefork_t)(nxt_task_t *task, 123 nxt_process_t *process, nxt_mp_t *mp); 124 typedef nxt_int_t (*nxt_process_postfork_t)(nxt_task_t *task, 125 nxt_process_t *process, nxt_mp_t *mp); 126 typedef nxt_int_t (*nxt_process_setup_t)(nxt_task_t *task, 127 nxt_process_t *process); 128 typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, 129 nxt_process_data_t *data); 130 131 132 typedef struct { 133 const char *name; 134 nxt_process_type_t type; 135 136 nxt_process_prefork_t prefork; 137 138 nxt_process_setup_t setup; 139 nxt_process_start_t start; 140 141 uint8_t restart; /* 1-bit */ 142 143 const nxt_port_handlers_t *port_handlers; 144 const nxt_sig_event_t *signals; 145 } nxt_process_init_t; 146 147 148 extern nxt_bool_t nxt_proc_conn_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 149 extern nxt_bool_t 150 nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 151 152 NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task, 153 nxt_process_t *process); 154 NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name, 155 char **argv, char **envp); 156 NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task); 157 NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns); 158 159 NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv, 160 char ***orig_envp); 161 162 #define nxt_process_init(process) \ 163 (nxt_pointer_to(process, sizeof(nxt_process_t))) 164 165 #define nxt_process_port_remove(port) \ 166 nxt_queue_remove(&port->link) 167 168 #define nxt_process_port_first(process) \ 169 nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link) 170 171 NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process, 172 nxt_port_t *port); 173 174 #define nxt_process_port_each(process, port) \ 175 nxt_queue_each(port, &process->ports, nxt_port_t, link) 176 177 #define nxt_process_port_loop \ 178 nxt_queue_loop 179 180 nxt_process_type_t nxt_process_type(nxt_process_t *process); 181 182 void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i); 183 184 void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process); 185 186 void nxt_process_quit(nxt_task_t *task, nxt_uint_t exit_status); 187 void nxt_signal_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg); 188 189 nxt_int_t nxt_process_core_setup(nxt_task_t *task, nxt_process_t *process); 190 nxt_int_t nxt_process_creds_set(nxt_task_t *task, nxt_process_t *process, 191 nxt_str_t *user, nxt_str_t *group); 192 nxt_int_t nxt_process_apply_creds(nxt_task_t *task, nxt_process_t *process); 193 194 #if (NXT_HAVE_SETPROCTITLE) 195 196 #define nxt_process_title(task, fmt, ...) \ 197 setproctitle(fmt, __VA_ARGS__) 198 199 #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX) 200 201 #define NXT_SETPROCTITLE_ARGV 1 202 NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...); 203 204 #endif 205 206 207 #define nxt_sched_yield() \ 208 sched_yield() 209 210 /* 211 * Solaris declares abort() as __NORETURN, 212 * raise(SIGABRT) is mostly the same. 213 */ 214 215 #define nxt_abort() \ 216 (void) raise(SIGABRT) 217 218 219 NXT_EXPORT extern nxt_pid_t nxt_pid; 220 NXT_EXPORT extern nxt_pid_t nxt_ppid; 221 NXT_EXPORT extern nxt_uid_t nxt_euid; 222 NXT_EXPORT extern nxt_gid_t nxt_egid; 223 NXT_EXPORT extern char **nxt_process_argv; 224 NXT_EXPORT extern char ***nxt_process_environ; 225 226 227 #endif /* _NXT_PROCESS_H_INCLUDED_ */ 228