Blame


1 b0a6bcf7 2022-09-13 op /*
2 b0a6bcf7 2022-09-13 op * Copyright (c) 2022 Omar Polo <op@omarpolo.com>
3 b0a6bcf7 2022-09-13 op * Copyright (c) 2014 Reyk Floeter <reyk@openbsd.org>
4 b0a6bcf7 2022-09-13 op *
5 b0a6bcf7 2022-09-13 op * Permission to use, copy, modify, and distribute this software for any
6 b0a6bcf7 2022-09-13 op * purpose with or without fee is hereby granted, provided that the above
7 b0a6bcf7 2022-09-13 op * copyright notice and this permission notice appear in all copies.
8 b0a6bcf7 2022-09-13 op *
9 b0a6bcf7 2022-09-13 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 b0a6bcf7 2022-09-13 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 b0a6bcf7 2022-09-13 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 b0a6bcf7 2022-09-13 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 b0a6bcf7 2022-09-13 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 b0a6bcf7 2022-09-13 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 b0a6bcf7 2022-09-13 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 b0a6bcf7 2022-09-13 op */
17 b0a6bcf7 2022-09-13 op
18 b0a6bcf7 2022-09-13 op #include <sys/types.h>
19 b0a6bcf7 2022-09-13 op #include <sys/queue.h>
20 b0a6bcf7 2022-09-13 op #include <sys/tree.h>
21 b0a6bcf7 2022-09-13 op #include <sys/socket.h>
22 b0a6bcf7 2022-09-13 op #include <sys/uio.h>
23 b0a6bcf7 2022-09-13 op
24 b0a6bcf7 2022-09-13 op #include <netinet/in.h>
25 b0a6bcf7 2022-09-13 op #include <arpa/inet.h>
26 b0a6bcf7 2022-09-13 op
27 b0a6bcf7 2022-09-13 op #include <errno.h>
28 b0a6bcf7 2022-09-13 op #include <event.h>
29 b0a6bcf7 2022-09-13 op #include <limits.h>
30 b0a6bcf7 2022-09-13 op #include <locale.h>
31 b0a6bcf7 2022-09-13 op #include <pwd.h>
32 b0a6bcf7 2022-09-13 op #include <signal.h>
33 b0a6bcf7 2022-09-13 op #include <stdint.h>
34 b0a6bcf7 2022-09-13 op #include <stdio.h>
35 b0a6bcf7 2022-09-13 op #include <stdlib.h>
36 b0a6bcf7 2022-09-13 op #include <string.h>
37 b0a6bcf7 2022-09-13 op #include <syslog.h>
38 b0a6bcf7 2022-09-13 op #include <unistd.h>
39 b0a6bcf7 2022-09-13 op #include <imsg.h>
40 b0a6bcf7 2022-09-13 op
41 b0a6bcf7 2022-09-13 op #include "log.h"
42 b0a6bcf7 2022-09-13 op #include "proc.h"
43 b0a6bcf7 2022-09-13 op #include "xmalloc.h"
44 b0a6bcf7 2022-09-13 op
45 b0a6bcf7 2022-09-13 op #include "galileo.h"
46 b0a6bcf7 2022-09-13 op
47 b0a6bcf7 2022-09-13 op static int parent_configure(struct galileo *);
48 b0a6bcf7 2022-09-13 op static void parent_configure_done(struct galileo *);
49 b0a6bcf7 2022-09-13 op static void parent_reload(struct galileo *);
50 b0a6bcf7 2022-09-13 op static void parent_sig_handler(int, short, void *);
51 b0a6bcf7 2022-09-13 op static int parent_dispatch_proxy(int, struct privsep_proc *,
52 b0a6bcf7 2022-09-13 op struct imsg *);
53 b0a6bcf7 2022-09-13 op static __dead void parent_shutdown(struct galileo *);
54 b0a6bcf7 2022-09-13 op
55 b0a6bcf7 2022-09-13 op static struct privsep_proc procs[] = {
56 b0a6bcf7 2022-09-13 op { "proxy", PROC_PROXY, parent_dispatch_proxy, proxy },
57 b0a6bcf7 2022-09-13 op };
58 b0a6bcf7 2022-09-13 op
59 b0a6bcf7 2022-09-13 op int privsep_process;
60 b0a6bcf7 2022-09-13 op
61 83f0f95a 2022-09-29 op const char *conffile = GALILEO_CONF;
62 b0a6bcf7 2022-09-13 op
63 b0a6bcf7 2022-09-13 op static __dead void
64 b0a6bcf7 2022-09-13 op usage(void)
65 b0a6bcf7 2022-09-13 op {
66 b86f10a4 2023-03-18 op fprintf(stderr, "usage: %s [-dnv] [-D macro=value] [-f file]\n",
67 b0a6bcf7 2022-09-13 op getprogname());
68 b0a6bcf7 2022-09-13 op exit(1);
69 b0a6bcf7 2022-09-13 op }
70 b0a6bcf7 2022-09-13 op
71 b0a6bcf7 2022-09-13 op int
72 b0a6bcf7 2022-09-13 op main(int argc, char **argv)
73 b0a6bcf7 2022-09-13 op {
74 b0a6bcf7 2022-09-13 op struct galileo *env;
75 b0a6bcf7 2022-09-13 op struct privsep *ps;
76 b0a6bcf7 2022-09-13 op const char *errstr;
77 b0a6bcf7 2022-09-13 op const char *title = NULL;
78 b0a6bcf7 2022-09-13 op size_t i;
79 b0a6bcf7 2022-09-13 op int conftest = 0, debug = 0, verbose = 0;
80 b0a6bcf7 2022-09-13 op int argc0 = argc, ch;
81 b0a6bcf7 2022-09-13 op int proc_id = PROC_PARENT;
82 b0a6bcf7 2022-09-13 op int proc_instance = 0;
83 b0a6bcf7 2022-09-13 op
84 b0a6bcf7 2022-09-13 op setlocale(LC_CTYPE, "");
85 b0a6bcf7 2022-09-13 op
86 b0a6bcf7 2022-09-13 op /* log to stderr until daemonized */
87 b0a6bcf7 2022-09-13 op log_init(1, LOG_DAEMON);
88 b0a6bcf7 2022-09-13 op log_setverbose(verbose);
89 b0a6bcf7 2022-09-13 op
90 b0a6bcf7 2022-09-13 op while ((ch = getopt(argc, argv, "D:df:I:nP:v")) != -1) {
91 b0a6bcf7 2022-09-13 op switch (ch) {
92 b0a6bcf7 2022-09-13 op case 'D':
93 b0a6bcf7 2022-09-13 op if (cmdline_symset(optarg) < 0)
94 b0a6bcf7 2022-09-13 op log_warnx("could not parse macro definition %s",
95 b0a6bcf7 2022-09-13 op optarg);
96 b0a6bcf7 2022-09-13 op break;
97 b0a6bcf7 2022-09-13 op case 'd':
98 b0a6bcf7 2022-09-13 op debug = 1;
99 b0a6bcf7 2022-09-13 op break;
100 b0a6bcf7 2022-09-13 op case 'f':
101 b0a6bcf7 2022-09-13 op conffile = optarg;
102 b0a6bcf7 2022-09-13 op break;
103 b0a6bcf7 2022-09-13 op case 'I':
104 b0a6bcf7 2022-09-13 op proc_instance = strtonum(optarg, 0, PROC_MAX_INSTANCES,
105 b0a6bcf7 2022-09-13 op &errstr);
106 b0a6bcf7 2022-09-13 op if (errstr != NULL)
107 b0a6bcf7 2022-09-13 op fatalx("invalid process instance");
108 b0a6bcf7 2022-09-13 op break;
109 b0a6bcf7 2022-09-13 op case 'n':
110 b0a6bcf7 2022-09-13 op conftest = 1;
111 b0a6bcf7 2022-09-13 op break;
112 b0a6bcf7 2022-09-13 op case 'P':
113 b0a6bcf7 2022-09-13 op title = optarg;
114 b0a6bcf7 2022-09-13 op proc_id = proc_getid(procs, nitems(procs), title);
115 b0a6bcf7 2022-09-13 op if (proc_id == PROC_MAX)
116 b0a6bcf7 2022-09-13 op fatalx("invalid process name");
117 b0a6bcf7 2022-09-13 op break;
118 b0a6bcf7 2022-09-13 op case 'v':
119 b0a6bcf7 2022-09-13 op verbose = 1;
120 b0a6bcf7 2022-09-13 op break;
121 b0a6bcf7 2022-09-13 op default:
122 b0a6bcf7 2022-09-13 op usage();
123 b0a6bcf7 2022-09-13 op }
124 b0a6bcf7 2022-09-13 op }
125 b0a6bcf7 2022-09-13 op argc -= optind;
126 b0a6bcf7 2022-09-13 op if (argc != 0)
127 b0a6bcf7 2022-09-13 op usage();
128 b0a6bcf7 2022-09-13 op
129 b0a6bcf7 2022-09-13 op if (geteuid())
130 b0a6bcf7 2022-09-13 op fatalx("need root privileges");
131 b0a6bcf7 2022-09-13 op
132 b0a6bcf7 2022-09-13 op log_setverbose(verbose);
133 b0a6bcf7 2022-09-13 op
134 b0a6bcf7 2022-09-13 op env = xcalloc(1, sizeof(*env));
135 b0a6bcf7 2022-09-13 op config_init(env);
136 b0a6bcf7 2022-09-13 op if (parse_config(conffile, env) == -1)
137 c9e6d547 2022-09-23 op return (1);
138 b0a6bcf7 2022-09-13 op
139 b0a6bcf7 2022-09-13 op if (conftest) {
140 b0a6bcf7 2022-09-13 op fprintf(stderr, "configuration OK\n");
141 c9e6d547 2022-09-23 op return (0);
142 b0a6bcf7 2022-09-13 op }
143 b0a6bcf7 2022-09-13 op
144 b0a6bcf7 2022-09-13 op ps = xcalloc(1, sizeof(*ps));
145 b0a6bcf7 2022-09-13 op ps->ps_env = env;
146 b0a6bcf7 2022-09-13 op env->sc_ps = ps;
147 b0a6bcf7 2022-09-13 op if ((ps->ps_pw = getpwnam(GALILEO_USER)) == NULL)
148 b0a6bcf7 2022-09-13 op fatalx("unknown user %s", GALILEO_USER);
149 b0a6bcf7 2022-09-13 op
150 b0a6bcf7 2022-09-13 op ps->ps_instances[PROC_PROXY] = env->sc_prefork;
151 b0a6bcf7 2022-09-13 op ps->ps_instance = proc_instance;
152 b0a6bcf7 2022-09-13 op if (title != NULL)
153 b0a6bcf7 2022-09-13 op ps->ps_title[proc_id] = title;
154 b0a6bcf7 2022-09-13 op
155 b0a6bcf7 2022-09-13 op if (*env->sc_chroot == '\0') {
156 b0a6bcf7 2022-09-13 op if (strlcpy(env->sc_chroot, ps->ps_pw->pw_dir,
157 b0a6bcf7 2022-09-13 op sizeof(env->sc_chroot)) >= sizeof(env->sc_chroot))
158 b0a6bcf7 2022-09-13 op fatalx("chroot path too long!");
159 b0a6bcf7 2022-09-13 op }
160 b0a6bcf7 2022-09-13 op
161 b0a6bcf7 2022-09-13 op for (i = 0; i < nitems(procs); ++i)
162 b0a6bcf7 2022-09-13 op procs[i].p_chroot = env->sc_chroot;
163 b0a6bcf7 2022-09-13 op
164 b0a6bcf7 2022-09-13 op /* only the parent returns */
165 b0a6bcf7 2022-09-13 op proc_init(ps, procs, nitems(procs), debug, argc0, argv, proc_id);
166 b0a6bcf7 2022-09-13 op
167 b0a6bcf7 2022-09-13 op log_procinit("parent");
168 b0a6bcf7 2022-09-13 op if (!debug && daemon(0, 0) == -1)
169 b0a6bcf7 2022-09-13 op fatal("failed to daemonize");
170 b0a6bcf7 2022-09-13 op
171 b0a6bcf7 2022-09-13 op log_init(debug, LOG_DAEMON);
172 b0a6bcf7 2022-09-13 op
173 b0a6bcf7 2022-09-13 op log_info("startup");
174 b0a6bcf7 2022-09-13 op
175 311f6453 2023-04-14 op if (pledge("stdio rpath wpath cpath chown unix fattr sendfd", NULL)
176 311f6453 2023-04-14 op == -1)
177 311f6453 2023-04-14 op fatal("pledge");
178 b0a6bcf7 2022-09-13 op
179 b0a6bcf7 2022-09-13 op event_init();
180 b0a6bcf7 2022-09-13 op
181 b0a6bcf7 2022-09-13 op signal(SIGPIPE, SIG_IGN);
182 b0a6bcf7 2022-09-13 op
183 b0a6bcf7 2022-09-13 op signal_set(&ps->ps_evsigint, SIGINT, parent_sig_handler, ps);
184 b0a6bcf7 2022-09-13 op signal_set(&ps->ps_evsigterm, SIGTERM, parent_sig_handler, ps);
185 b0a6bcf7 2022-09-13 op signal_set(&ps->ps_evsigchld, SIGCHLD, parent_sig_handler, ps);
186 b0a6bcf7 2022-09-13 op signal_set(&ps->ps_evsighup, SIGHUP, parent_sig_handler, ps);
187 b0a6bcf7 2022-09-13 op
188 b0a6bcf7 2022-09-13 op signal_add(&ps->ps_evsigint, NULL);
189 b0a6bcf7 2022-09-13 op signal_add(&ps->ps_evsigterm, NULL);
190 b0a6bcf7 2022-09-13 op signal_add(&ps->ps_evsigchld, NULL);
191 b0a6bcf7 2022-09-13 op signal_add(&ps->ps_evsighup, NULL);
192 b0a6bcf7 2022-09-13 op
193 b0a6bcf7 2022-09-13 op proc_connect(ps);
194 b0a6bcf7 2022-09-13 op
195 b0a6bcf7 2022-09-13 op if (parent_configure(env) == -1)
196 b0a6bcf7 2022-09-13 op fatalx("configuration failed");
197 b0a6bcf7 2022-09-13 op
198 b0a6bcf7 2022-09-13 op event_dispatch();
199 b0a6bcf7 2022-09-13 op
200 b0a6bcf7 2022-09-13 op parent_shutdown(env);
201 b0a6bcf7 2022-09-13 op /* NOTREACHED */
202 b0a6bcf7 2022-09-13 op
203 b0a6bcf7 2022-09-13 op return (0);
204 b0a6bcf7 2022-09-13 op }
205 b0a6bcf7 2022-09-13 op
206 b0a6bcf7 2022-09-13 op static int
207 b0a6bcf7 2022-09-13 op parent_configure(struct galileo *env)
208 b0a6bcf7 2022-09-13 op {
209 afb86b2c 2022-09-23 op struct proxy *proxy;
210 b0a6bcf7 2022-09-13 op int id;
211 b0a6bcf7 2022-09-13 op
212 afb86b2c 2022-09-23 op TAILQ_FOREACH(proxy, &env->sc_proxies, pr_entry) {
213 afb86b2c 2022-09-23 op if (config_setproxy(env, proxy) == -1)
214 afb86b2c 2022-09-23 op fatal("send proxy");
215 b0a6bcf7 2022-09-13 op }
216 b0a6bcf7 2022-09-13 op
217 b0a6bcf7 2022-09-13 op /* XXX: eventually they will be more than just one */
218 b0a6bcf7 2022-09-13 op if (config_setsock(env) == -1)
219 b0a6bcf7 2022-09-13 op fatal("send socket");
220 b0a6bcf7 2022-09-13 op
221 afb86b2c 2022-09-23 op /* The proxiess need to reload their config. */
222 b0a6bcf7 2022-09-13 op env->sc_reload = env->sc_prefork;
223 b0a6bcf7 2022-09-13 op
224 b0a6bcf7 2022-09-13 op for (id = 0; id < PROC_MAX; id++) {
225 b0a6bcf7 2022-09-13 op if (id == privsep_process)
226 b0a6bcf7 2022-09-13 op continue;
227 b0a6bcf7 2022-09-13 op proc_compose(env->sc_ps, id, IMSG_CFG_DONE, env, sizeof(env));
228 b0a6bcf7 2022-09-13 op }
229 b0a6bcf7 2022-09-13 op
230 b0a6bcf7 2022-09-13 op config_purge(env);
231 c9e6d547 2022-09-23 op return (0);
232 b0a6bcf7 2022-09-13 op }
233 b0a6bcf7 2022-09-13 op
234 b0a6bcf7 2022-09-13 op static void
235 b0a6bcf7 2022-09-13 op parent_configure_done(struct galileo *env)
236 b0a6bcf7 2022-09-13 op {
237 b0a6bcf7 2022-09-13 op int id;
238 b0a6bcf7 2022-09-13 op
239 b0a6bcf7 2022-09-13 op if (env->sc_reload == 0) {
240 b0a6bcf7 2022-09-13 op log_warnx("configuration already finished");
241 b0a6bcf7 2022-09-13 op return;
242 b0a6bcf7 2022-09-13 op }
243 b0a6bcf7 2022-09-13 op
244 b0a6bcf7 2022-09-13 op env->sc_reload--;
245 b0a6bcf7 2022-09-13 op if (env->sc_reload == 0) {
246 b0a6bcf7 2022-09-13 op for (id = 0; id < PROC_MAX; ++id) {
247 b0a6bcf7 2022-09-13 op if (id == privsep_process)
248 b0a6bcf7 2022-09-13 op continue;
249 b0a6bcf7 2022-09-13 op
250 b0a6bcf7 2022-09-13 op proc_compose(env->sc_ps, id, IMSG_CTL_START, NULL, 0);
251 b0a6bcf7 2022-09-13 op }
252 b0a6bcf7 2022-09-13 op }
253 b0a6bcf7 2022-09-13 op }
254 b0a6bcf7 2022-09-13 op
255 b0a6bcf7 2022-09-13 op static void
256 b0a6bcf7 2022-09-13 op parent_reload(struct galileo *env)
257 b0a6bcf7 2022-09-13 op {
258 b0a6bcf7 2022-09-13 op if (env->sc_reload) {
259 b0a6bcf7 2022-09-13 op log_debug("%s: already in progress: %d pending",
260 b0a6bcf7 2022-09-13 op __func__, env->sc_reload);
261 b0a6bcf7 2022-09-13 op }
262 b0a6bcf7 2022-09-13 op
263 b0a6bcf7 2022-09-13 op log_debug("%s: config file %s", __func__, conffile);
264 b0a6bcf7 2022-09-13 op
265 b0a6bcf7 2022-09-13 op config_purge(env);
266 b0a6bcf7 2022-09-13 op
267 b0a6bcf7 2022-09-13 op if (parse_config(conffile, env) == -1) {
268 b0a6bcf7 2022-09-13 op log_warnx("failed to load config file: %s", conffile);
269 b0a6bcf7 2022-09-13 op return;
270 b0a6bcf7 2022-09-13 op }
271 b0a6bcf7 2022-09-13 op
272 b0a6bcf7 2022-09-13 op config_setreset(env);
273 b0a6bcf7 2022-09-13 op parent_configure(env);
274 b0a6bcf7 2022-09-13 op }
275 b0a6bcf7 2022-09-13 op
276 b0a6bcf7 2022-09-13 op static void
277 b0a6bcf7 2022-09-13 op parent_sig_handler(int sig, short ev, void *arg)
278 b0a6bcf7 2022-09-13 op {
279 b0a6bcf7 2022-09-13 op struct privsep *ps = arg;
280 b0a6bcf7 2022-09-13 op
281 b0a6bcf7 2022-09-13 op /*
282 b0a6bcf7 2022-09-13 op * Normal signal handler rules don't apply because libevent
283 b0a6bcf7 2022-09-13 op * decouples for us.
284 b0a6bcf7 2022-09-13 op */
285 b0a6bcf7 2022-09-13 op
286 b0a6bcf7 2022-09-13 op switch (sig) {
287 b0a6bcf7 2022-09-13 op case SIGHUP:
288 b0a6bcf7 2022-09-13 op if (privsep_process != PROC_PARENT)
289 b0a6bcf7 2022-09-13 op return;
290 b0a6bcf7 2022-09-13 op log_info("reload requested with SIGHUP");
291 b0a6bcf7 2022-09-13 op parent_reload(ps->ps_env);
292 b0a6bcf7 2022-09-13 op break;
293 b0a6bcf7 2022-09-13 op case SIGCHLD:
294 b0a6bcf7 2022-09-13 op log_warnx("one child died, quitting.");
295 02be3606 2022-09-29 op /* fallthrough */
296 b0a6bcf7 2022-09-13 op case SIGTERM:
297 b0a6bcf7 2022-09-13 op case SIGINT:
298 b0a6bcf7 2022-09-13 op parent_shutdown(ps->ps_env);
299 b0a6bcf7 2022-09-13 op break;
300 b0a6bcf7 2022-09-13 op default:
301 b0a6bcf7 2022-09-13 op fatalx("unexpected signal %d", sig);
302 b0a6bcf7 2022-09-13 op }
303 b0a6bcf7 2022-09-13 op }
304 b0a6bcf7 2022-09-13 op
305 b0a6bcf7 2022-09-13 op static int
306 b0a6bcf7 2022-09-13 op parent_dispatch_proxy(int fd, struct privsep_proc *p, struct imsg *imsg)
307 b0a6bcf7 2022-09-13 op {
308 b0a6bcf7 2022-09-13 op struct privsep *ps = p->p_ps;
309 b0a6bcf7 2022-09-13 op struct galileo *env = ps->ps_env;
310 b0a6bcf7 2022-09-13 op
311 b0a6bcf7 2022-09-13 op switch (imsg->hdr.type) {
312 b0a6bcf7 2022-09-13 op case IMSG_CFG_DONE:
313 b0a6bcf7 2022-09-13 op parent_configure_done(env);
314 b0a6bcf7 2022-09-13 op break;
315 b0a6bcf7 2022-09-13 op default:
316 b0a6bcf7 2022-09-13 op return (-1);
317 b0a6bcf7 2022-09-13 op }
318 b0a6bcf7 2022-09-13 op
319 b0a6bcf7 2022-09-13 op return (0);
320 b0a6bcf7 2022-09-13 op }
321 b0a6bcf7 2022-09-13 op
322 b0a6bcf7 2022-09-13 op static __dead void
323 b0a6bcf7 2022-09-13 op parent_shutdown(struct galileo *env)
324 b0a6bcf7 2022-09-13 op {
325 b0a6bcf7 2022-09-13 op config_purge(env);
326 b0a6bcf7 2022-09-13 op
327 b0a6bcf7 2022-09-13 op proc_kill(env->sc_ps);
328 b0a6bcf7 2022-09-13 op
329 b0a6bcf7 2022-09-13 op free(env->sc_ps);
330 b0a6bcf7 2022-09-13 op free(env);
331 b0a6bcf7 2022-09-13 op
332 b0a6bcf7 2022-09-13 op log_info("parent terminating, pid %d", getpid());
333 b0a6bcf7 2022-09-13 op exit(0);
334 b0a6bcf7 2022-09-13 op }
335 b0a6bcf7 2022-09-13 op
336 b0a6bcf7 2022-09-13 op int
337 b0a6bcf7 2022-09-13 op accept_reserve(int sockfd, struct sockaddr *addr, socklen_t *addrlen,
338 b0a6bcf7 2022-09-13 op int reserve, volatile int *counter)
339 b0a6bcf7 2022-09-13 op {
340 b0a6bcf7 2022-09-13 op int ret;
341 b0a6bcf7 2022-09-13 op if (getdtablecount() + reserve +
342 b0a6bcf7 2022-09-13 op *counter >= getdtablesize()) {
343 b0a6bcf7 2022-09-13 op errno = EMFILE;
344 b0a6bcf7 2022-09-13 op return (-1);
345 b0a6bcf7 2022-09-13 op }
346 b0a6bcf7 2022-09-13 op
347 b0a6bcf7 2022-09-13 op if ((ret = accept4(sockfd, addr, addrlen, SOCK_NONBLOCK)) > -1) {
348 b0a6bcf7 2022-09-13 op (*counter)++;
349 b0a6bcf7 2022-09-13 op log_debug("%s: inflight incremented, now %d",__func__, *counter);
350 b0a6bcf7 2022-09-13 op }
351 b0a6bcf7 2022-09-13 op return (ret);
352 b0a6bcf7 2022-09-13 op }