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 #include <nxt_conf.h> 11 12 13 typedef pid_t nxt_pid_t; 14 typedef uid_t nxt_uid_t; 15 typedef gid_t nxt_gid_t; 16 17 18 typedef struct { 19 const char *user; 20 nxt_uid_t uid; 21 nxt_gid_t base_gid; 22 nxt_uint_t ngroups; 23 nxt_gid_t *gids; 24 } nxt_user_cred_t; 25 26 typedef struct { 27 nxt_int_t flags; 28 nxt_conf_value_t *uidmap; 29 nxt_conf_value_t *gidmap; 30 } nxt_process_clone_t; 31 32 typedef struct nxt_process_init_s nxt_process_init_t; 33 typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, void *data); 34 typedef nxt_int_t (*nxt_process_restart_t)(nxt_task_t *task, nxt_runtime_t *rt, 35 nxt_process_init_t *init); 36 37 struct nxt_process_init_s { 38 nxt_process_start_t start; 39 const char *name; 40 nxt_user_cred_t *user_cred; 41 42 nxt_port_handlers_t *port_handlers; 43 const nxt_sig_event_t *signals; 44 45 nxt_process_type_t type; 46 47 void *data; 48 uint32_t stream; 49 50 nxt_process_restart_t restart; 51 52 union { 53 nxt_process_clone_t clone; 54 } isolation; 55 }; 56 57 58 typedef struct nxt_port_mmap_s nxt_port_mmap_t; 59 typedef struct nxt_port_mmaps_s nxt_port_mmaps_t; 60 61 struct nxt_port_mmaps_s { 62 nxt_thread_mutex_t mutex; 63 uint32_t size; 64 uint32_t cap; 65 nxt_port_mmap_t *elts; 66 }; 67 68 69 typedef struct { 70 nxt_pid_t pid; 71 nxt_queue_t ports; /* of nxt_port_t */ 72 nxt_bool_t ready; 73 nxt_bool_t registered; 74 nxt_int_t use_count; 75 76 nxt_process_init_t *init; 77 78 nxt_port_mmaps_t incoming; 79 nxt_port_mmaps_t outgoing; 80 81 nxt_thread_mutex_t cp_mutex; 82 nxt_lvlhsh_t connected_ports; /* of nxt_port_t */ 83 } nxt_process_t; 84 85 86 extern nxt_bool_t nxt_proc_conn_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 87 extern nxt_bool_t 88 nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 89 90 NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task, 91 nxt_process_t *process); 92 NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name, 93 char **argv, char **envp); 94 NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task); 95 NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns); 96 97 NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv, 98 char ***orig_envp); 99 100 #define nxt_process_port_remove(port) \ 101 nxt_queue_remove(&port->link) 102 103 #define nxt_process_port_first(process) \ 104 nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link) 105 106 NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process, 107 nxt_port_t *port); 108 109 #define nxt_process_port_each(process, port) \ 110 nxt_queue_each(port, &process->ports, nxt_port_t, link) 111 112 #define nxt_process_port_loop \ 113 nxt_queue_loop 114 115 nxt_process_type_t nxt_process_type(nxt_process_t *process); 116 117 void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i); 118 119 void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process); 120 121 void nxt_process_connected_port_add(nxt_process_t *process, nxt_port_t *port); 122 123 void nxt_process_connected_port_remove(nxt_process_t *process, 124 nxt_port_t *port); 125 126 nxt_port_t *nxt_process_connected_port_find(nxt_process_t *process, 127 nxt_pid_t pid, nxt_port_id_t port_id); 128 129 130 void nxt_worker_process_quit_handler(nxt_task_t *task, 131 nxt_port_recv_msg_t *msg); 132 133 134 #if (NXT_HAVE_SETPROCTITLE) 135 136 #define nxt_process_title(task, fmt, ...) \ 137 setproctitle(fmt, __VA_ARGS__) 138 139 #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX) 140 141 #define NXT_SETPROCTITLE_ARGV 1 142 NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...); 143 144 #endif 145 146 147 #define nxt_sched_yield() \ 148 sched_yield() 149 150 /* 151 * Solaris declares abort() as __NORETURN, 152 * raise(SIGABRT) is mostly the same. 153 */ 154 155 #define nxt_abort() \ 156 (void) raise(SIGABRT) 157 158 NXT_EXPORT nxt_int_t nxt_user_cred_get(nxt_task_t *task, nxt_user_cred_t *uc, 159 const char *group); 160 NXT_EXPORT nxt_int_t nxt_user_cred_set(nxt_task_t *task, nxt_user_cred_t *uc); 161 162 NXT_EXPORT extern nxt_pid_t nxt_pid; 163 NXT_EXPORT extern nxt_pid_t nxt_ppid; 164 NXT_EXPORT extern char **nxt_process_argv; 165 NXT_EXPORT extern char ***nxt_process_environ; 166 167 168 #endif /* _NXT_PROCESS_H_INCLUDED_ */ 169