]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/socket.c
clang: fix numerous little issues found with clang-analyzer
[thirdparty/systemd.git] / src / socket.c
CommitLineData
5cb5a6ff
LP
1/*-*- Mode: C; c-basic-offset: 8 -*-*/
2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
83c60c9f
LP
22#include <sys/types.h>
23#include <sys/stat.h>
24#include <unistd.h>
25#include <errno.h>
26#include <fcntl.h>
f94ea366 27#include <sys/epoll.h>
034c6ed7 28#include <signal.h>
4f2d528d 29#include <arpa/inet.h>
83c60c9f 30
87f0e418 31#include "unit.h"
5cb5a6ff 32#include "socket.h"
cebf8b20 33#include "netinet/tcp.h"
83c60c9f 34#include "log.h"
23a177ef
LP
35#include "load-dropin.h"
36#include "load-fragment.h"
9e2f7c11 37#include "strv.h"
4f2d528d 38#include "unit-name.h"
4139c1b2 39#include "dbus-socket.h"
4fd5948e 40#include "missing.h"
a40eb732 41#include "special.h"
398ef8ba 42#include "bus-errors.h"
83c60c9f 43
acbb0225 44static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
87f0e418
LP
45 [SOCKET_DEAD] = UNIT_INACTIVE,
46 [SOCKET_START_PRE] = UNIT_ACTIVATING,
47 [SOCKET_START_POST] = UNIT_ACTIVATING,
48 [SOCKET_LISTENING] = UNIT_ACTIVE,
49 [SOCKET_RUNNING] = UNIT_ACTIVE,
50 [SOCKET_STOP_PRE] = UNIT_DEACTIVATING,
51 [SOCKET_STOP_PRE_SIGTERM] = UNIT_DEACTIVATING,
52 [SOCKET_STOP_PRE_SIGKILL] = UNIT_DEACTIVATING,
53 [SOCKET_STOP_POST] = UNIT_DEACTIVATING,
80876c20
LP
54 [SOCKET_FINAL_SIGTERM] = UNIT_DEACTIVATING,
55 [SOCKET_FINAL_SIGKILL] = UNIT_DEACTIVATING,
032ff4af 56 [SOCKET_MAINTENANCE] = UNIT_MAINTENANCE
83c60c9f 57};
5cb5a6ff 58
a16e1123
LP
59static void socket_init(Unit *u) {
60 Socket *s = SOCKET(u);
61
62 assert(u);
63 assert(u->meta.load_state == UNIT_STUB);
64
a16e1123
LP
65 s->backlog = SOMAXCONN;
66 s->timeout_usec = DEFAULT_TIMEOUT_USEC;
67 s->directory_mode = 0755;
68 s->socket_mode = 0666;
69
6cf6bbc2
LP
70 s->max_connections = 64;
71
4fd5948e 72 s->priority = -1;
4fd5948e
LP
73 s->ip_tos = -1;
74 s->ip_ttl = -1;
4fd5948e 75 s->mark = -1;
4fd5948e 76
a16e1123
LP
77 exec_context_init(&s->exec_context);
78
79 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
80}
acbb0225 81
5e94833f
LP
82static void socket_unwatch_control_pid(Socket *s) {
83 assert(s);
84
85 if (s->control_pid <= 0)
86 return;
87
88 unit_unwatch_pid(UNIT(s), s->control_pid);
89 s->control_pid = 0;
90}
91
87f0e418
LP
92static void socket_done(Unit *u) {
93 Socket *s = SOCKET(u);
034c6ed7 94 SocketPort *p;
6cf6bbc2 95 Meta *i;
034c6ed7
LP
96
97 assert(s);
98
99 while ((p = s->ports)) {
100 LIST_REMOVE(SocketPort, port, s->ports, p);
101
a16e1123
LP
102 if (p->fd >= 0) {
103 unit_unwatch_fd(UNIT(s), &p->fd_watch);
104 close_nointr_nofail(p->fd);
105 }
106
034c6ed7
LP
107 free(p->path);
108 free(p);
109 }
110
111 exec_context_done(&s->exec_context);
e537352b 112 exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
034c6ed7
LP
113 s->control_command = NULL;
114
5e94833f 115 socket_unwatch_control_pid(s);
034c6ed7
LP
116
117 s->service = NULL;
118
cebf8b20
TT
119 free(s->tcp_congestion);
120 s->tcp_congestion = NULL;
121
acbb0225 122 free(s->bind_to_device);
e537352b 123 s->bind_to_device = NULL;
acbb0225
LP
124
125 unit_unwatch_timer(u, &s->timer_watch);
6cf6bbc2
LP
126
127 /* Make sure no service instance refers to us anymore. */
128 LIST_FOREACH(units_per_type, i, u->meta.manager->units_per_type[UNIT_SERVICE]) {
129 Service *service = (Service *) i;
130
131 if (service->socket == s)
132 service->socket = NULL;
133 }
5cb5a6ff
LP
134}
135
b15bdda8
LP
136static int socket_instantiate_service(Socket *s) {
137 char *prefix, *name;
138 int r;
139 Unit *u;
140
141 assert(s);
142
143 /* This fills in s->service if it isn't filled in yet. For
144 * Accept=yes sockets we create the next connection service
145 * here. For Accept=no this is mostly a NOP since the service
146 * is figured out at load time anyway. */
147
148 if (s->service)
149 return 0;
150
151 assert(s->accept);
152
153 if (!(prefix = unit_name_to_prefix(s->meta.id)))
154 return -ENOMEM;
155
156 r = asprintf(&name, "%s@%u.service", prefix, s->n_accepted);
157 free(prefix);
158
159 if (r < 0)
160 return -ENOMEM;
161
162 r = manager_load_unit(s->meta.manager, name, NULL, NULL, &u);
163 free(name);
164
165 if (r < 0)
166 return r;
167
6c073082 168 u->meta.no_gc = true;
b15bdda8
LP
169 s->service = SERVICE(u);
170 return 0;
171}
172
4f2d528d
LP
173static bool have_non_accept_socket(Socket *s) {
174 SocketPort *p;
175
176 assert(s);
177
178 if (!s->accept)
179 return true;
180
dd5ad9d4
LP
181 LIST_FOREACH(port, p, s->ports) {
182
183 if (p->type != SOCKET_SOCKET)
184 return true;
185
4f2d528d
LP
186 if (!socket_address_can_accept(&p->address))
187 return true;
dd5ad9d4 188 }
4f2d528d
LP
189
190 return false;
191}
192
193static int socket_verify(Socket *s) {
194 assert(s);
195
4cd1fbcc 196 if (s->meta.load_state != UNIT_LOADED)
4f2d528d
LP
197 return 0;
198
199 if (!s->ports) {
4cd1fbcc 200 log_error("%s lacks Listen setting. Refusing.", s->meta.id);
4f2d528d
LP
201 return -EINVAL;
202 }
203
0009d2a6
LP
204 if (s->accept && have_non_accept_socket(s)) {
205 log_error("%s configured for accepting sockets, but sockets are non-accepting. Refusing.", s->meta.id);
206 return -EINVAL;
207 }
208
6cf6bbc2 209 if (s->accept && s->max_connections <= 0) {
4d0e5dbd
LP
210 log_error("%s's MaxConnection setting too small. Refusing.", s->meta.id);
211 return -EINVAL;
212 }
213
2e22afe9 214 if (s->exec_context.pam_name && s->exec_context.kill_mode != KILL_CONTROL_GROUP) {
4d0e5dbd 215 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", s->meta.id);
6cf6bbc2
LP
216 return -EINVAL;
217 }
218
4f2d528d
LP
219 return 0;
220}
221
6e2ef85b
LP
222static bool socket_needs_mount(Socket *s, const char *prefix) {
223 SocketPort *p;
224
225 assert(s);
226
227 LIST_FOREACH(port, p, s->ports) {
228
229 if (p->type == SOCKET_SOCKET) {
230 if (socket_address_needs_mount(&p->address, prefix))
231 return true;
232 } else {
233 assert(p->type == SOCKET_FIFO);
234 if (path_startswith(p->path, prefix))
235 return true;
236 }
237 }
238
239 return false;
240}
241
242int socket_add_one_mount_link(Socket *s, Mount *m) {
243 int r;
244
245 assert(s);
246 assert(m);
247
248 if (s->meta.load_state != UNIT_LOADED ||
249 m->meta.load_state != UNIT_LOADED)
250 return 0;
251
252 if (!socket_needs_mount(s, m->where))
253 return 0;
254
2c966c03 255 if ((r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true)) < 0)
6e2ef85b
LP
256 return r;
257
258 return 0;
259}
260
261static int socket_add_mount_links(Socket *s) {
262 Meta *other;
263 int r;
264
265 assert(s);
266
267 LIST_FOREACH(units_per_type, other, s->meta.manager->units_per_type[UNIT_MOUNT])
268 if ((r = socket_add_one_mount_link(s, (Mount*) other)) < 0)
269 return r;
270
271 return 0;
272}
273
274static int socket_add_device_link(Socket *s) {
275 char *t;
276 int r;
277
278 assert(s);
279
280 if (!s->bind_to_device)
281 return 0;
282
283 if (asprintf(&t, "/sys/subsystem/net/devices/%s", s->bind_to_device) < 0)
284 return -ENOMEM;
285
286 r = unit_add_node_link(UNIT(s), t, false);
287 free(t);
288
289 return r;
290}
291
a40eb732
LP
292static int socket_add_default_dependencies(Socket *s) {
293 int r;
294 assert(s);
295
296 if (s->meta.manager->running_as == MANAGER_SYSTEM)
297 if ((r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true)) < 0)
298 return r;
299
69dd2852 300 return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTED_BY, SPECIAL_SHUTDOWN_TARGET, NULL, true);
a40eb732
LP
301}
302
e537352b
LP
303static int socket_load(Unit *u) {
304 Socket *s = SOCKET(u);
305 int r;
44d8db9e 306
e537352b
LP
307 assert(u);
308 assert(u->meta.load_state == UNIT_STUB);
44d8db9e 309
e537352b 310 if ((r = unit_load_fragment_and_dropin(u)) < 0)
23a177ef 311 return r;
44d8db9e 312
23a177ef 313 /* This is a new unit? Then let's add in some extras */
e537352b 314 if (u->meta.load_state == UNIT_LOADED) {
44d8db9e 315
4f2d528d 316 if (have_non_accept_socket(s)) {
25366e09 317 if ((r = unit_load_related_unit(u, ".service", (Unit**) &s->service)) < 0)
4f2d528d 318 return r;
23a177ef 319
701cc384 320 if ((r = unit_add_dependency(u, UNIT_BEFORE, UNIT(s->service), true)) < 0)
4f2d528d
LP
321 return r;
322 }
44d8db9e 323
6e2ef85b
LP
324 if ((r = socket_add_mount_links(s)) < 0)
325 return r;
326
327 if ((r = socket_add_device_link(s)) < 0)
328 return r;
329
23a177ef
LP
330 if ((r = unit_add_exec_dependencies(u, &s->exec_context)) < 0)
331 return r;
332
333 if ((r = unit_add_default_cgroup(u)) < 0)
334 return r;
a40eb732
LP
335
336 if (s->meta.default_dependencies)
337 if ((r = socket_add_default_dependencies(s)) < 0)
338 return r;
23a177ef
LP
339 }
340
4f2d528d 341 return socket_verify(s);
44d8db9e
LP
342}
343
542563ba
LP
344static const char* listen_lookup(int type) {
345
346 if (type == SOCK_STREAM)
347 return "ListenStream";
348 else if (type == SOCK_DGRAM)
349 return "ListenDatagram";
350 else if (type == SOCK_SEQPACKET)
351 return "ListenSequentialPacket";
352
034c6ed7 353 assert_not_reached("Unknown socket type");
542563ba
LP
354 return NULL;
355}
356
87f0e418 357static void socket_dump(Unit *u, FILE *f, const char *prefix) {
5cb5a6ff 358
5cb5a6ff 359 SocketExecCommand c;
87f0e418 360 Socket *s = SOCKET(u);
542563ba 361 SocketPort *p;
82ba9f08
LP
362 const char *prefix2;
363 char *p2;
5cb5a6ff
LP
364
365 assert(s);
fa068367 366 assert(f);
5cb5a6ff 367
82ba9f08
LP
368 p2 = strappend(prefix, "\t");
369 prefix2 = p2 ? p2 : prefix;
c43d20a0 370
5cb5a6ff
LP
371 fprintf(f,
372 "%sSocket State: %s\n"
542563ba 373 "%sBindIPv6Only: %s\n"
b5a0699f
LP
374 "%sBacklog: %u\n"
375 "%sSocketMode: %04o\n"
4fd5948e
LP
376 "%sDirectoryMode: %04o\n"
377 "%sKeepAlive: %s\n"
cebf8b20
TT
378 "%sFreeBind: %s\n"
379 "%sTCPCongestion: %s\n",
a16e1123 380 prefix, socket_state_to_string(s->state),
c0120d99 381 prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only),
b5a0699f
LP
382 prefix, s->backlog,
383 prefix, s->socket_mode,
4fd5948e
LP
384 prefix, s->directory_mode,
385 prefix, yes_no(s->keep_alive),
cebf8b20
TT
386 prefix, yes_no(s->free_bind),
387 prefix, s->tcp_congestion);
542563ba 388
70123e68
LP
389 if (s->control_pid > 0)
390 fprintf(f,
bb00e604
LP
391 "%sControl PID: %lu\n",
392 prefix, (unsigned long) s->control_pid);
70123e68 393
acbb0225
LP
394 if (s->bind_to_device)
395 fprintf(f,
396 "%sBindToDevice: %s\n",
397 prefix, s->bind_to_device);
398
4f2d528d
LP
399 if (s->accept)
400 fprintf(f,
6cf6bbc2
LP
401 "%sAccepted: %u\n"
402 "%sNConnections: %u\n"
403 "%sMaxConnections: %u\n",
404 prefix, s->n_accepted,
405 prefix, s->n_connections,
406 prefix, s->max_connections);
4f2d528d 407
4fd5948e
LP
408 if (s->priority >= 0)
409 fprintf(f,
410 "%sPriority: %i\n",
411 prefix, s->priority);
412
413 if (s->receive_buffer > 0)
414 fprintf(f,
415 "%sReceiveBuffer: %zu\n",
416 prefix, s->receive_buffer);
417
418 if (s->send_buffer > 0)
419 fprintf(f,
420 "%sSendBuffer: %zu\n",
421 prefix, s->send_buffer);
422
423 if (s->ip_tos >= 0)
424 fprintf(f,
425 "%sIPTOS: %i\n",
426 prefix, s->ip_tos);
427
428 if (s->ip_ttl >= 0)
429 fprintf(f,
430 "%sIPTTL: %i\n",
431 prefix, s->ip_ttl);
432
433 if (s->pipe_size > 0)
434 fprintf(f,
435 "%sPipeSize: %zu\n",
436 prefix, s->pipe_size);
437
438 if (s->mark >= 0)
439 fprintf(f,
440 "%sMark: %i\n",
441 prefix, s->mark);
442
034c6ed7 443 LIST_FOREACH(port, p, s->ports) {
5cb5a6ff 444
542563ba
LP
445 if (p->type == SOCKET_SOCKET) {
446 const char *t;
447 int r;
e364ad06 448 char *k = NULL;
542563ba
LP
449
450 if ((r = socket_address_print(&p->address, &k)) < 0)
451 t = strerror(-r);
452 else
453 t = k;
454
e364ad06 455 fprintf(f, "%s%s: %s\n", prefix, listen_lookup(p->address.type), t);
542563ba
LP
456 free(k);
457 } else
458 fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
459 }
5cb5a6ff
LP
460
461 exec_context_dump(&s->exec_context, f, prefix);
462
e537352b 463 for (c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
c43d20a0
LP
464 if (!s->exec_command[c])
465 continue;
5cb5a6ff 466
40d50879 467 fprintf(f, "%s-> %s:\n",
a16e1123 468 prefix, socket_exec_command_to_string(c));
c43d20a0
LP
469
470 exec_command_dump_list(s->exec_command[c], f, prefix2);
5cb5a6ff 471 }
c43d20a0 472
82ba9f08 473 free(p2);
5cb5a6ff
LP
474}
475
4f2d528d
LP
476static int instance_from_socket(int fd, unsigned nr, char **instance) {
477 socklen_t l;
478 char *r;
479 union {
480 struct sockaddr sa;
481 struct sockaddr_un un;
482 struct sockaddr_in in;
483 struct sockaddr_in6 in6;
484 struct sockaddr_storage storage;
485 } local, remote;
486
487 assert(fd >= 0);
488 assert(instance);
489
490 l = sizeof(local);
491 if (getsockname(fd, &local.sa, &l) < 0)
492 return -errno;
493
494 l = sizeof(remote);
495 if (getpeername(fd, &remote.sa, &l) < 0)
496 return -errno;
497
498 switch (local.sa.sa_family) {
499
500 case AF_INET: {
501 uint32_t
502 a = ntohl(local.in.sin_addr.s_addr),
503 b = ntohl(remote.in.sin_addr.s_addr);
504
505 if (asprintf(&r,
b15bdda8 506 "%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
4f2d528d
LP
507 a >> 24, (a >> 16) & 0xFF, (a >> 8) & 0xFF, a & 0xFF,
508 ntohs(local.in.sin_port),
509 b >> 24, (b >> 16) & 0xFF, (b >> 8) & 0xFF, b & 0xFF,
510 ntohs(remote.in.sin_port)) < 0)
511 return -ENOMEM;
512
513 break;
514 }
515
516 case AF_INET6: {
2b061f5a
LP
517 static const char ipv4_prefix[] = {
518 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
519 };
520
521 if (memcmp(&local.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0 &&
522 memcmp(&remote.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0) {
523 const uint8_t
524 *a = local.in6.sin6_addr.s6_addr+12,
525 *b = remote.in6.sin6_addr.s6_addr+12;
526
527 if (asprintf(&r,
b15bdda8 528 "%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
2b061f5a
LP
529 a[0], a[1], a[2], a[3],
530 ntohs(local.in6.sin6_port),
531 b[0], b[1], b[2], b[3],
532 ntohs(remote.in6.sin6_port)) < 0)
533 return -ENOMEM;
534 } else {
535 char a[INET6_ADDRSTRLEN], b[INET6_ADDRSTRLEN];
536
537 if (asprintf(&r,
b15bdda8 538 "%s:%u-%s:%u",
2b061f5a
LP
539 inet_ntop(AF_INET6, &local.in6.sin6_addr, a, sizeof(a)),
540 ntohs(local.in6.sin6_port),
541 inet_ntop(AF_INET6, &remote.in6.sin6_addr, b, sizeof(b)),
542 ntohs(remote.in6.sin6_port)) < 0)
543 return -ENOMEM;
544 }
4f2d528d
LP
545
546 break;
547 }
548
549 case AF_UNIX: {
550 struct ucred ucred;
551
552 l = sizeof(ucred);
553 if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &l) < 0)
554 return -errno;
555
556 if (asprintf(&r,
bb00e604 557 "%u-%lu-%lu",
4f2d528d 558 nr,
bb00e604
LP
559 (unsigned long) ucred.pid,
560 (unsigned long) ucred.uid) < 0)
4f2d528d
LP
561 return -ENOMEM;
562
563 break;
564 }
565
566 default:
567 assert_not_reached("Unhandled socket type.");
568 }
569
570 *instance = r;
571 return 0;
572}
573
034c6ed7 574static void socket_close_fds(Socket *s) {
83c60c9f
LP
575 SocketPort *p;
576
577 assert(s);
578
034c6ed7 579 LIST_FOREACH(port, p, s->ports) {
83c60c9f
LP
580 if (p->fd < 0)
581 continue;
582
acbb0225 583 unit_unwatch_fd(UNIT(s), &p->fd_watch);
a16e1123
LP
584 close_nointr_nofail(p->fd);
585
586 /* One little note: we should never delete any sockets
587 * in the file system here! After all some other
588 * process we spawned might still have a reference of
589 * this fd and wants to continue to use it. Therefore
590 * we delete sockets in the file system before we
591 * create a new one, not after we stopped using
592 * one! */
9152c765 593
83c60c9f
LP
594 p->fd = -1;
595 }
596}
597
4fd5948e
LP
598static void socket_apply_socket_options(Socket *s, int fd) {
599 assert(s);
600 assert(fd >= 0);
601
602 if (s->keep_alive) {
603 int b = s->keep_alive;
604 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &b, sizeof(b)) < 0)
605 log_warning("SO_KEEPALIVE failed: %m");
606 }
607
608 if (s->priority >= 0)
609 if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &s->priority, sizeof(s->priority)) < 0)
610 log_warning("SO_PRIORITY failed: %m");
611
612 if (s->receive_buffer > 0) {
613 int value = (int) s->receive_buffer;
614 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0)
615 log_warning("SO_RCVBUF failed: %m");
616 }
617
618 if (s->send_buffer > 0) {
619 int value = (int) s->send_buffer;
620 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0)
621 log_warning("SO_SNDBUF failed: %m");
622 }
623
624 if (s->mark >= 0)
625 if (setsockopt(fd, SOL_SOCKET, SO_MARK, &s->mark, sizeof(s->mark)) < 0)
626 log_warning("SO_MARK failed: %m");
627
628 if (s->ip_tos >= 0)
629 if (setsockopt(fd, IPPROTO_IP, IP_TOS, &s->ip_tos, sizeof(s->ip_tos)) < 0)
630 log_warning("IP_TOS failed: %m");
631
46925ac5
LP
632 if (s->ip_ttl >= 0) {
633 int r, x;
634
635 r = setsockopt(fd, IPPROTO_IP, IP_TTL, &s->ip_ttl, sizeof(s->ip_ttl));
636 x = setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &s->ip_ttl, sizeof(s->ip_ttl));
637
638 if (r < 0 && x < 0)
639 log_warning("IP_TTL/IPV6_UNICAST_HOPS failed: %m");
640 }
cebf8b20
TT
641
642 if (s->tcp_congestion)
643 if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
644 log_warning("TCP_CONGESTION failed: %m");
4fd5948e
LP
645}
646
b15bdda8 647static void socket_apply_fifo_options(Socket *s, int fd) {
4fd5948e
LP
648 assert(s);
649 assert(fd >= 0);
650
651 if (s->pipe_size > 0)
652 if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
653 log_warning("F_SETPIPE_SZ: %m");
654}
655
7a58bfa4 656
b15bdda8
LP
657static int fifo_address_create(
658 const char *path,
659 mode_t directory_mode,
660 mode_t socket_mode,
56cf987f 661 const char *label,
b15bdda8
LP
662 int *_fd) {
663
7a58bfa4 664 int fd = -1, r = 0;
b15bdda8
LP
665 struct stat st;
666 mode_t old_mask;
667
668 assert(path);
669 assert(_fd);
670
671 mkdir_parents(path, directory_mode);
672
56cf987f
DW
673 if ((r = label_fifofile_set(label, path)) < 0)
674 goto fail;
b15bdda8
LP
675
676 /* Enforce the right access mode for the fifo */
677 old_mask = umask(~ socket_mode);
678
679 /* Include the original umask in our mask */
680 umask(~socket_mode | old_mask);
681
682 r = mkfifo(path, socket_mode);
683 umask(old_mask);
684
685 if (r < 0) {
686 r = -errno;
687 goto fail;
688 }
689
690 if ((fd = open(path, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW)) < 0) {
691 r = -errno;
692 goto fail;
693 }
694
56cf987f 695 label_file_clear();
7a58bfa4 696
b15bdda8
LP
697 if (fstat(fd, &st) < 0) {
698 r = -errno;
699 goto fail;
700 }
701
702 if (!S_ISFIFO(st.st_mode) ||
de0200fc 703 (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
b15bdda8
LP
704 st.st_uid != getuid() ||
705 st.st_gid != getgid()) {
706
707 r = -EEXIST;
708 goto fail;
709 }
710
711 *_fd = fd;
712 return 0;
713
714fail:
56cf987f
DW
715 label_file_clear();
716
b15bdda8
LP
717 if (fd >= 0)
718 close_nointr_nofail(fd);
719
720 return r;
721}
722
034c6ed7 723static int socket_open_fds(Socket *s) {
83c60c9f
LP
724 SocketPort *p;
725 int r;
56cf987f 726 char *label = NULL;
83c60c9f
LP
727
728 assert(s);
729
b15bdda8
LP
730 if ((r = socket_instantiate_service(s)) < 0)
731 return r;
732
56cf987f
DW
733 if ((r = label_get_socket_label_from_exe(s->service->exec_command[SERVICE_EXEC_START]->path, &label)) < 0)
734 return r;
b15bdda8 735
034c6ed7 736 LIST_FOREACH(port, p, s->ports) {
83c60c9f 737
034c6ed7
LP
738 if (p->fd >= 0)
739 continue;
83c60c9f
LP
740
741 if (p->type == SOCKET_SOCKET) {
742
b5a0699f
LP
743 if ((r = socket_address_listen(
744 &p->address,
745 s->backlog,
746 s->bind_ipv6_only,
747 s->bind_to_device,
4fd5948e 748 s->free_bind,
b5a0699f
LP
749 s->directory_mode,
750 s->socket_mode,
56cf987f 751 label,
b5a0699f 752 &p->fd)) < 0)
83c60c9f
LP
753 goto rollback;
754
4fd5948e
LP
755 socket_apply_socket_options(s, p->fd);
756
b15bdda8 757 } else if (p->type == SOCKET_FIFO) {
83c60c9f 758
b15bdda8
LP
759 if ((r = fifo_address_create(
760 p->path,
761 s->directory_mode,
762 s->socket_mode,
56cf987f 763 label,
b15bdda8 764 &p->fd)) < 0)
83c60c9f 765 goto rollback;
83c60c9f 766
b15bdda8 767 socket_apply_fifo_options(s, p->fd);
83c60c9f 768
b15bdda8
LP
769 } else
770 assert_not_reached("Unknown port type");
034c6ed7
LP
771 }
772
56cf987f 773 label_free(label);
034c6ed7
LP
774 return 0;
775
776rollback:
777 socket_close_fds(s);
56cf987f 778 label_free(label);
034c6ed7
LP
779 return r;
780}
781
782static void socket_unwatch_fds(Socket *s) {
783 SocketPort *p;
9152c765 784
034c6ed7
LP
785 assert(s);
786
787 LIST_FOREACH(port, p, s->ports) {
788 if (p->fd < 0)
789 continue;
790
acbb0225 791 unit_unwatch_fd(UNIT(s), &p->fd_watch);
83c60c9f 792 }
034c6ed7
LP
793}
794
795static int socket_watch_fds(Socket *s) {
796 SocketPort *p;
797 int r;
798
799 assert(s);
83c60c9f 800
034c6ed7
LP
801 LIST_FOREACH(port, p, s->ports) {
802 if (p->fd < 0)
803 continue;
804
cabab516 805 p->fd_watch.socket_accept =
4f2d528d 806 s->accept &&
dd5ad9d4 807 p->type == SOCKET_SOCKET &&
4f2d528d
LP
808 socket_address_can_accept(&p->address);
809
f94ea366 810 if ((r = unit_watch_fd(UNIT(s), p->fd, EPOLLIN, &p->fd_watch)) < 0)
034c6ed7
LP
811 goto fail;
812 }
83c60c9f 813
542563ba 814 return 0;
83c60c9f 815
034c6ed7
LP
816fail:
817 socket_unwatch_fds(s);
818 return r;
819}
820
821static void socket_set_state(Socket *s, SocketState state) {
822 SocketState old_state;
823 assert(s);
824
825 old_state = s->state;
826 s->state = state;
827
828 if (state != SOCKET_START_PRE &&
829 state != SOCKET_START_POST &&
830 state != SOCKET_STOP_PRE &&
831 state != SOCKET_STOP_PRE_SIGTERM &&
832 state != SOCKET_STOP_PRE_SIGKILL &&
833 state != SOCKET_STOP_POST &&
80876c20
LP
834 state != SOCKET_FINAL_SIGTERM &&
835 state != SOCKET_FINAL_SIGKILL) {
acbb0225 836 unit_unwatch_timer(UNIT(s), &s->timer_watch);
5e94833f 837 socket_unwatch_control_pid(s);
034c6ed7 838 s->control_command = NULL;
a16e1123 839 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
e537352b 840 }
034c6ed7 841
a16e1123
LP
842 if (state != SOCKET_LISTENING)
843 socket_unwatch_fds(s);
844
034c6ed7
LP
845 if (state != SOCKET_START_POST &&
846 state != SOCKET_LISTENING &&
847 state != SOCKET_RUNNING &&
848 state != SOCKET_STOP_PRE &&
849 state != SOCKET_STOP_PRE_SIGTERM &&
850 state != SOCKET_STOP_PRE_SIGKILL)
851 socket_close_fds(s);
852
e537352b 853 if (state != old_state)
40d50879 854 log_debug("%s changed %s -> %s",
a16e1123
LP
855 s->meta.id,
856 socket_state_to_string(old_state),
857 socket_state_to_string(state));
acbb0225
LP
858
859 unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state]);
034c6ed7
LP
860}
861
a16e1123
LP
862static int socket_coldplug(Unit *u) {
863 Socket *s = SOCKET(u);
864 int r;
865
866 assert(s);
867 assert(s->state == SOCKET_DEAD);
868
869 if (s->deserialized_state != s->state) {
870
871 if (s->deserialized_state == SOCKET_START_PRE ||
872 s->deserialized_state == SOCKET_START_POST ||
873 s->deserialized_state == SOCKET_STOP_PRE ||
874 s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
875 s->deserialized_state == SOCKET_STOP_PRE_SIGKILL ||
876 s->deserialized_state == SOCKET_STOP_POST ||
877 s->deserialized_state == SOCKET_FINAL_SIGTERM ||
878 s->deserialized_state == SOCKET_FINAL_SIGKILL) {
879
880 if (s->control_pid <= 0)
881 return -EBADMSG;
882
883 if ((r = unit_watch_pid(UNIT(s), s->control_pid)) < 0)
884 return r;
885
886 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
887 return r;
888 }
889
890 if (s->deserialized_state == SOCKET_START_POST ||
891 s->deserialized_state == SOCKET_LISTENING ||
892 s->deserialized_state == SOCKET_RUNNING ||
893 s->deserialized_state == SOCKET_STOP_PRE ||
894 s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
895 s->deserialized_state == SOCKET_STOP_PRE_SIGKILL)
896 if ((r = socket_open_fds(s)) < 0)
897 return r;
898
899 if (s->deserialized_state == SOCKET_LISTENING)
900 if ((r = socket_watch_fds(s)) < 0)
901 return r;
902
903 socket_set_state(s, s->deserialized_state);
904 }
905
906 return 0;
907}
908
e537352b 909static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
034c6ed7
LP
910 pid_t pid;
911 int r;
9e2f7c11 912 char **argv;
034c6ed7
LP
913
914 assert(s);
915 assert(c);
916 assert(_pid);
917
e537352b
LP
918 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
919 goto fail;
034c6ed7 920
9e2f7c11
LP
921 if (!(argv = unit_full_printf_strv(UNIT(s), c->argv))) {
922 r = -ENOMEM;
923 goto fail;
924 }
925
926 r = exec_spawn(c,
927 argv,
928 &s->exec_context,
929 NULL, 0,
1137a57c 930 s->meta.manager->environment,
9e2f7c11
LP
931 true,
932 true,
1e3ad081 933 true,
4cd1fbcc
LP
934 s->meta.manager->confirm_spawn,
935 s->meta.cgroup_bondings,
9e2f7c11
LP
936 &pid);
937
938 strv_free(argv);
939 if (r < 0)
034c6ed7
LP
940 goto fail;
941
87f0e418 942 if ((r = unit_watch_pid(UNIT(s), pid)) < 0)
034c6ed7
LP
943 /* FIXME: we need to do something here */
944 goto fail;
83c60c9f 945
034c6ed7
LP
946 *_pid = pid;
947
948 return 0;
949
950fail:
e537352b 951 unit_unwatch_timer(UNIT(s), &s->timer_watch);
83c60c9f
LP
952
953 return r;
542563ba
LP
954}
955
034c6ed7
LP
956static void socket_enter_dead(Socket *s, bool success) {
957 assert(s);
958
959 if (!success)
960 s->failure = true;
961
18c78fb1 962 socket_set_state(s, s->failure ? SOCKET_MAINTENANCE : SOCKET_DEAD);
034c6ed7
LP
963}
964
80876c20
LP
965static void socket_enter_signal(Socket *s, SocketState state, bool success);
966
034c6ed7
LP
967static void socket_enter_stop_post(Socket *s, bool success) {
968 int r;
969 assert(s);
970
971 if (!success)
972 s->failure = true;
973
5e94833f
LP
974 socket_unwatch_control_pid(s);
975
a16e1123
LP
976 s->control_command_id = SOCKET_EXEC_STOP_POST;
977
80876c20 978 if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST])) {
e537352b 979 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
034c6ed7
LP
980 goto fail;
981
80876c20
LP
982 socket_set_state(s, SOCKET_STOP_POST);
983 } else
984 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, true);
034c6ed7
LP
985
986 return;
987
988fail:
6cf6bbc2 989 log_warning("%s failed to run 'stop-post' task: %s", s->meta.id, strerror(-r));
80876c20 990 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
034c6ed7
LP
991}
992
993static void socket_enter_signal(Socket *s, SocketState state, bool success) {
994 int r;
80876c20 995 bool sent = false;
034c6ed7
LP
996
997 assert(s);
998
999 if (!success)
1000 s->failure = true;
1001
2e22afe9
LP
1002 if (s->exec_context.kill_mode != KILL_NONE) {
1003 int sig = (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_FINAL_SIGTERM) ? s->exec_context.kill_signal : SIGKILL;
034c6ed7 1004
2e22afe9 1005 if (s->exec_context.kill_mode == KILL_CONTROL_GROUP) {
50159e6a 1006
4cd1fbcc 1007 if ((r = cgroup_bonding_kill_list(s->meta.cgroup_bondings, sig)) < 0) {
50159e6a
LP
1008 if (r != -EAGAIN && r != -ESRCH)
1009 goto fail;
1010 } else
1011 sent = true;
034c6ed7 1012 }
50159e6a 1013
80876c20 1014 if (!sent && s->control_pid > 0)
2e22afe9 1015 if (kill(s->exec_context.kill_mode == KILL_PROCESS ? s->control_pid : -s->control_pid, sig) < 0 && errno != ESRCH) {
50159e6a
LP
1016 r = -errno;
1017 goto fail;
1018 }
d6ea93e3 1019 }
034c6ed7 1020
e93bc5a6 1021 if (sent && s->control_pid > 0) {
80876c20
LP
1022 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
1023 goto fail;
d6ea93e3 1024
80876c20
LP
1025 socket_set_state(s, state);
1026 } else if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
1027 socket_enter_stop_post(s, true);
1028 else
034c6ed7
LP
1029 socket_enter_dead(s, true);
1030
1031 return;
1032
1033fail:
9e2f7c11 1034 log_warning("%s failed to kill processes: %s", s->meta.id, strerror(-r));
034c6ed7
LP
1035
1036 if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
1037 socket_enter_stop_post(s, false);
1038 else
1039 socket_enter_dead(s, false);
1040}
1041
1042static void socket_enter_stop_pre(Socket *s, bool success) {
1043 int r;
1044 assert(s);
1045
1046 if (!success)
1047 s->failure = true;
1048
5e94833f
LP
1049 socket_unwatch_control_pid(s);
1050
a16e1123
LP
1051 s->control_command_id = SOCKET_EXEC_STOP_PRE;
1052
80876c20 1053 if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE])) {
e537352b 1054 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
034c6ed7
LP
1055 goto fail;
1056
80876c20
LP
1057 socket_set_state(s, SOCKET_STOP_PRE);
1058 } else
034c6ed7
LP
1059 socket_enter_stop_post(s, true);
1060
1061 return;
1062
1063fail:
6cf6bbc2 1064 log_warning("%s failed to run 'stop-pre' task: %s", s->meta.id, strerror(-r));
034c6ed7
LP
1065 socket_enter_stop_post(s, false);
1066}
1067
e9af15c3
LP
1068static void socket_enter_listening(Socket *s) {
1069 int r;
1070 assert(s);
1071
1072 if ((r = socket_watch_fds(s)) < 0) {
9e2f7c11 1073 log_warning("%s failed to watch sockets: %s", s->meta.id, strerror(-r));
e9af15c3
LP
1074 goto fail;
1075 }
1076
1077 socket_set_state(s, SOCKET_LISTENING);
1078 return;
1079
1080fail:
1081 socket_enter_stop_pre(s, false);
1082}
1083
034c6ed7
LP
1084static void socket_enter_start_post(Socket *s) {
1085 int r;
1086 assert(s);
1087
e9af15c3 1088 if ((r = socket_open_fds(s)) < 0) {
9e2f7c11 1089 log_warning("%s failed to listen on sockets: %s", s->meta.id, strerror(-r));
034c6ed7
LP
1090 goto fail;
1091 }
1092
5e94833f
LP
1093 socket_unwatch_control_pid(s);
1094
a16e1123
LP
1095 s->control_command_id = SOCKET_EXEC_START_POST;
1096
80876c20 1097 if ((s->control_command = s->exec_command[SOCKET_EXEC_START_POST])) {
e537352b 1098 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0) {
6cf6bbc2 1099 log_warning("%s failed to run 'start-post' task: %s", s->meta.id, strerror(-r));
034c6ed7
LP
1100 goto fail;
1101 }
1102
80876c20
LP
1103 socket_set_state(s, SOCKET_START_POST);
1104 } else
e9af15c3 1105 socket_enter_listening(s);
034c6ed7
LP
1106
1107 return;
1108
1109fail:
1110 socket_enter_stop_pre(s, false);
1111}
1112
1113static void socket_enter_start_pre(Socket *s) {
1114 int r;
1115 assert(s);
1116
5e94833f
LP
1117 socket_unwatch_control_pid(s);
1118
a16e1123
LP
1119 s->control_command_id = SOCKET_EXEC_START_PRE;
1120
80876c20 1121 if ((s->control_command = s->exec_command[SOCKET_EXEC_START_PRE])) {
e537352b 1122 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
034c6ed7
LP
1123 goto fail;
1124
80876c20
LP
1125 socket_set_state(s, SOCKET_START_PRE);
1126 } else
034c6ed7
LP
1127 socket_enter_start_post(s);
1128
1129 return;
1130
1131fail:
6cf6bbc2 1132 log_warning("%s failed to run 'start-pre' task: %s", s->meta.id, strerror(-r));
034c6ed7
LP
1133 socket_enter_dead(s, false);
1134}
1135
4f2d528d 1136static void socket_enter_running(Socket *s, int cfd) {
034c6ed7 1137 int r;
398ef8ba 1138 DBusError error;
034c6ed7
LP
1139
1140 assert(s);
398ef8ba 1141 dbus_error_init(&error);
034c6ed7 1142
ba3e67a7
LP
1143 /* We don't take connections anymore if we are supposed to
1144 * shut down anyway */
1145 if (s->meta.job && s->meta.job->type == JOB_STOP) {
7c610628
LP
1146 if (cfd >= 0)
1147 close_nointr_nofail(cfd);
1148 else {
1149 /* Flush all sockets by closing and reopening them */
1150 socket_close_fds(s);
1151
1152 if ((r = socket_watch_fds(s)) < 0) {
1153 log_warning("%s failed to watch sockets: %s", s->meta.id, strerror(-r));
1154 socket_enter_stop_pre(s, false);
1155 }
1156 }
1157
ba3e67a7
LP
1158 return;
1159 }
1160
4f2d528d 1161 if (cfd < 0) {
398ef8ba 1162 if ((r = manager_add_job(s->meta.manager, JOB_START, UNIT(s->service), JOB_REPLACE, true, &error, NULL)) < 0)
4f2d528d
LP
1163 goto fail;
1164
1165 socket_set_state(s, SOCKET_RUNNING);
1166 } else {
b4f10a5e 1167 char *prefix, *instance = NULL, *name;
b15bdda8 1168 Service *service;
4f2d528d 1169
6cf6bbc2
LP
1170 if (s->n_connections >= s->max_connections) {
1171 log_warning("Too many incoming connections (%u)", s->n_connections);
1172 close_nointr_nofail(cfd);
1173 return;
1174 }
1175
b15bdda8
LP
1176 if ((r = socket_instantiate_service(s)) < 0)
1177 goto fail;
1178
1179 if ((r = instance_from_socket(cfd, s->n_accepted, &instance)) < 0)
4f2d528d
LP
1180 goto fail;
1181
4cd1fbcc 1182 if (!(prefix = unit_name_to_prefix(s->meta.id))) {
4f2d528d
LP
1183 free(instance);
1184 r = -ENOMEM;
1185 goto fail;
1186 }
1187
1188 name = unit_name_build(prefix, instance, ".service");
1189 free(prefix);
1190 free(instance);
1191
b6dbbe1c 1192 if (!name) {
4f2d528d 1193 r = -ENOMEM;
b6dbbe1c
LP
1194 goto fail;
1195 }
4f2d528d 1196
b15bdda8
LP
1197 if ((r = unit_add_name(UNIT(s->service), name)) < 0) {
1198 free(name);
4f2d528d 1199 goto fail;
b15bdda8
LP
1200 }
1201
1202 service = s->service;
1203 s->service = NULL;
1204 s->n_accepted ++;
4f2d528d 1205
6c073082
LP
1206 service->meta.no_gc = false;
1207
b15bdda8
LP
1208 unit_choose_id(UNIT(service), name);
1209 free(name);
1210
1211 if ((r = service_set_socket_fd(service, cfd, s)) < 0)
4f2d528d
LP
1212 goto fail;
1213
1214 cfd = -1;
6cf6bbc2
LP
1215 s->n_connections ++;
1216
b15bdda8 1217 if ((r = manager_add_job(s->meta.manager, JOB_START, UNIT(service), JOB_REPLACE, true, &error, NULL)) < 0)
4f2d528d
LP
1218 goto fail;
1219 }
034c6ed7 1220
034c6ed7
LP
1221 return;
1222
1223fail:
398ef8ba 1224 log_warning("%s failed to queue socket startup job: %s", s->meta.id, bus_error(&error, r));
80876c20 1225 socket_enter_stop_pre(s, false);
4f2d528d
LP
1226
1227 if (cfd >= 0)
1228 close_nointr_nofail(cfd);
398ef8ba
LP
1229
1230 dbus_error_free(&error);
034c6ed7
LP
1231}
1232
1233static void socket_run_next(Socket *s, bool success) {
1234 int r;
1235
1236 assert(s);
1237 assert(s->control_command);
1238 assert(s->control_command->command_next);
1239
1240 if (!success)
1241 s->failure = true;
1242
5e94833f
LP
1243 socket_unwatch_control_pid(s);
1244
034c6ed7
LP
1245 s->control_command = s->control_command->command_next;
1246
e537352b 1247 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
034c6ed7
LP
1248 goto fail;
1249
1250 return;
1251
1252fail:
6cf6bbc2 1253 log_warning("%s failed to run next task: %s", s->meta.id, strerror(-r));
80876c20
LP
1254
1255 if (s->state == SOCKET_START_POST)
1256 socket_enter_stop_pre(s, false);
034c6ed7
LP
1257 else if (s->state == SOCKET_STOP_POST)
1258 socket_enter_dead(s, false);
1259 else
80876c20 1260 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
034c6ed7
LP
1261}
1262
87f0e418
LP
1263static int socket_start(Unit *u) {
1264 Socket *s = SOCKET(u);
83c60c9f
LP
1265
1266 assert(s);
1267
034c6ed7
LP
1268 /* We cannot fulfill this request right now, try again later
1269 * please! */
1270 if (s->state == SOCKET_STOP_PRE ||
1271 s->state == SOCKET_STOP_PRE_SIGKILL ||
1272 s->state == SOCKET_STOP_PRE_SIGTERM ||
1273 s->state == SOCKET_STOP_POST ||
80876c20
LP
1274 s->state == SOCKET_FINAL_SIGTERM ||
1275 s->state == SOCKET_FINAL_SIGKILL)
034c6ed7
LP
1276 return -EAGAIN;
1277
83c60c9f
LP
1278 if (s->state == SOCKET_START_PRE ||
1279 s->state == SOCKET_START_POST)
034c6ed7 1280 return 0;
83c60c9f 1281
034c6ed7 1282 /* Cannot run this without the service being around */
4f2d528d
LP
1283 if (s->service) {
1284 if (s->service->meta.load_state != UNIT_LOADED)
1285 return -ENOENT;
1286
1287 /* If the service is alredy actvie we cannot start the
1288 * socket */
1289 if (s->service->state != SERVICE_DEAD &&
18c78fb1 1290 s->service->state != SERVICE_MAINTENANCE &&
4f2d528d
LP
1291 s->service->state != SERVICE_AUTO_RESTART)
1292 return -EBUSY;
1293 }
e537352b 1294
18c78fb1 1295 assert(s->state == SOCKET_DEAD || s->state == SOCKET_MAINTENANCE);
83c60c9f 1296
034c6ed7
LP
1297 s->failure = false;
1298 socket_enter_start_pre(s);
1299 return 0;
1300}
83c60c9f 1301
87f0e418
LP
1302static int socket_stop(Unit *u) {
1303 Socket *s = SOCKET(u);
034c6ed7
LP
1304
1305 assert(s);
1306
e537352b
LP
1307 /* Already on it */
1308 if (s->state == SOCKET_STOP_PRE ||
1309 s->state == SOCKET_STOP_PRE_SIGTERM ||
1310 s->state == SOCKET_STOP_PRE_SIGKILL ||
1311 s->state == SOCKET_STOP_POST ||
80876c20 1312 s->state == SOCKET_FINAL_SIGTERM ||
3f6c78dc 1313 s->state == SOCKET_FINAL_SIGKILL)
e537352b
LP
1314 return 0;
1315
3f6c78dc
LP
1316 /* If there's already something running we go directly into
1317 * kill mode. */
1318 if (s->state == SOCKET_START_PRE ||
1319 s->state == SOCKET_START_POST) {
1320 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, true);
1321 return -EAGAIN;
1322 }
1323
034c6ed7 1324 assert(s->state == SOCKET_LISTENING || s->state == SOCKET_RUNNING);
83c60c9f 1325
034c6ed7 1326 socket_enter_stop_pre(s, true);
542563ba
LP
1327 return 0;
1328}
1329
a16e1123
LP
1330static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
1331 Socket *s = SOCKET(u);
1332 SocketPort *p;
1333 int r;
1334
1335 assert(u);
1336 assert(f);
1337 assert(fds);
1338
1339 unit_serialize_item(u, f, "state", socket_state_to_string(s->state));
1340 unit_serialize_item(u, f, "failure", yes_no(s->failure));
1341 unit_serialize_item_format(u, f, "n-accepted", "%u", s->n_accepted);
1342
1343 if (s->control_pid > 0)
5925dd3c 1344 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid);
a16e1123
LP
1345
1346 if (s->control_command_id >= 0)
1347 unit_serialize_item(u, f, "control-command", socket_exec_command_to_string(s->control_command_id));
1348
1349 LIST_FOREACH(port, p, s->ports) {
1350 int copy;
1351
1352 if (p->fd < 0)
1353 continue;
1354
1355 if ((copy = fdset_put_dup(fds, p->fd)) < 0)
1356 return copy;
1357
1358 if (p->type == SOCKET_SOCKET) {
1359 char *t;
1360
1361 if ((r = socket_address_print(&p->address, &t)) < 0)
1362 return r;
1363
27ca8d7a 1364 unit_serialize_item_format(u, f, "socket", "%i %i %s", copy, p->address.type, t);
a16e1123
LP
1365 free(t);
1366 } else {
1367 assert(p->type == SOCKET_FIFO);
1368 unit_serialize_item_format(u, f, "fifo", "%i %s", copy, p->path);
1369 }
1370 }
1371
1372 return 0;
1373}
1374
1375static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1376 Socket *s = SOCKET(u);
a16e1123
LP
1377
1378 assert(u);
1379 assert(key);
1380 assert(value);
1381 assert(fds);
1382
1383 if (streq(key, "state")) {
1384 SocketState state;
1385
1386 if ((state = socket_state_from_string(value)) < 0)
1387 log_debug("Failed to parse state value %s", value);
1388 else
1389 s->deserialized_state = state;
1390 } else if (streq(key, "failure")) {
1391 int b;
1392
1393 if ((b = parse_boolean(value)) < 0)
1394 log_debug("Failed to parse failure value %s", value);
1395 else
1396 s->failure = b || s->failure;
1397
1398 } else if (streq(key, "n-accepted")) {
1399 unsigned k;
1400
e364ad06 1401 if (safe_atou(value, &k) < 0)
a16e1123
LP
1402 log_debug("Failed to parse n-accepted value %s", value);
1403 else
1404 s->n_accepted += k;
1405 } else if (streq(key, "control-pid")) {
5925dd3c 1406 pid_t pid;
a16e1123 1407
e364ad06 1408 if (parse_pid(value, &pid) < 0)
a16e1123
LP
1409 log_debug("Failed to parse control-pid value %s", value);
1410 else
5925dd3c 1411 s->control_pid = pid;
a16e1123
LP
1412 } else if (streq(key, "control-command")) {
1413 SocketExecCommand id;
1414
1415 if ((id = socket_exec_command_from_string(value)) < 0)
1416 log_debug("Failed to parse exec-command value %s", value);
1417 else {
1418 s->control_command_id = id;
1419 s->control_command = s->exec_command[id];
1420 }
1421 } else if (streq(key, "fifo")) {
1422 int fd, skip = 0;
1423 SocketPort *p;
1424
1425 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1426 log_debug("Failed to parse fifo value %s", value);
1427 else {
1428
1429 LIST_FOREACH(port, p, s->ports)
1430 if (streq(p->path, value+skip))
1431 break;
1432
1433 if (p) {
1434 if (p->fd >= 0)
1435 close_nointr_nofail(p->fd);
1436 p->fd = fdset_remove(fds, fd);
1437 }
1438 }
1439
1440 } else if (streq(key, "socket")) {
27ca8d7a 1441 int fd, type, skip = 0;
a16e1123
LP
1442 SocketPort *p;
1443
27ca8d7a 1444 if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd))
a16e1123
LP
1445 log_debug("Failed to parse socket value %s", value);
1446 else {
1447
1448 LIST_FOREACH(port, p, s->ports)
27ca8d7a 1449 if (socket_address_is(&p->address, value+skip, type))
a16e1123
LP
1450 break;
1451
1452 if (p) {
1453 if (p->fd >= 0)
1454 close_nointr_nofail(p->fd);
1455 p->fd = fdset_remove(fds, fd);
1456 }
1457 }
1458
1459 } else
1460 log_debug("Unknown serialization key '%s'", key);
1461
1462 return 0;
1463}
1464
87f0e418
LP
1465static UnitActiveState socket_active_state(Unit *u) {
1466 assert(u);
5cb5a6ff 1467
acbb0225 1468 return state_translation_table[SOCKET(u)->state];
5cb5a6ff
LP
1469}
1470
10a94420
LP
1471static const char *socket_sub_state_to_string(Unit *u) {
1472 assert(u);
1473
a16e1123 1474 return socket_state_to_string(SOCKET(u)->state);
10a94420
LP
1475}
1476
6cf6bbc2
LP
1477static bool socket_check_gc(Unit *u) {
1478 Socket *s = SOCKET(u);
1479
1480 assert(u);
1481
1482 return s->n_connections > 0;
1483}
1484
acbb0225 1485static void socket_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
87f0e418 1486 Socket *s = SOCKET(u);
4f2d528d 1487 int cfd = -1;
9152c765 1488
034c6ed7 1489 assert(s);
8d567588 1490 assert(fd >= 0);
9152c765 1491
871d7de4
LP
1492 if (s->state != SOCKET_LISTENING)
1493 return;
1494
9e2f7c11 1495 log_debug("Incoming traffic on %s", u->meta.id);
9152c765 1496
4f2d528d
LP
1497 if (events != EPOLLIN) {
1498 log_error("Got invalid poll event on socket.");
8d567588 1499 goto fail;
4f2d528d
LP
1500 }
1501
cabab516 1502 if (w->socket_accept) {
4f2d528d
LP
1503 for (;;) {
1504
1505 if ((cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK)) < 0) {
1506
1507 if (errno == EINTR)
1508 continue;
1509
1510 log_error("Failed to accept socket: %m");
8d567588 1511 goto fail;
4f2d528d
LP
1512 }
1513
1514 break;
1515 }
4fd5948e
LP
1516
1517 socket_apply_socket_options(s, cfd);
4f2d528d 1518 }
9152c765 1519
4f2d528d 1520 socket_enter_running(s, cfd);
8d567588
LP
1521 return;
1522
1523fail:
1524 socket_enter_stop_pre(s, false);
9152c765
LP
1525}
1526
87f0e418
LP
1527static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1528 Socket *s = SOCKET(u);
034c6ed7 1529 bool success;
5cb5a6ff
LP
1530
1531 assert(s);
034c6ed7 1532 assert(pid >= 0);
5cb5a6ff 1533
8c47c732
LP
1534 if (pid != s->control_pid)
1535 return;
542563ba 1536
034c6ed7
LP
1537 s->control_pid = 0;
1538
8c47c732 1539 success = is_clean_exit(code, status);
8c47c732 1540
b708e7ce 1541 if (s->control_command) {
b58b4116 1542 exec_status_exit(&s->control_command->exec_status, pid, code, status);
a16e1123 1543
b708e7ce
LP
1544 if (s->control_command->ignore)
1545 success = true;
1546 }
1547
92abbefb
LP
1548 log_full(success ? LOG_DEBUG : LOG_NOTICE,
1549 "%s control process exited, code=%s status=%i", u->meta.id, sigchld_code_to_string(code), status);
b708e7ce 1550 s->failure = s->failure || !success;
034c6ed7 1551
a16e1123
LP
1552 if (s->control_command && s->control_command->command_next && success) {
1553 log_debug("%s running next command for state %s", u->meta.id, socket_state_to_string(s->state));
034c6ed7 1554 socket_run_next(s, success);
acbb0225 1555 } else {
a16e1123
LP
1556 s->control_command = NULL;
1557 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
1558
034c6ed7
LP
1559 /* No further commands for this step, so let's figure
1560 * out what to do next */
5cb5a6ff 1561
a16e1123 1562 log_debug("%s got final SIGCHLD for state %s", u->meta.id, socket_state_to_string(s->state));
acbb0225 1563
034c6ed7
LP
1564 switch (s->state) {
1565
1566 case SOCKET_START_PRE:
1567 if (success)
acbb0225 1568 socket_enter_start_post(s);
034c6ed7 1569 else
80876c20 1570 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
034c6ed7
LP
1571 break;
1572
1573 case SOCKET_START_POST:
1574 if (success)
e9af15c3 1575 socket_enter_listening(s);
034c6ed7
LP
1576 else
1577 socket_enter_stop_pre(s, false);
1578 break;
1579
1580 case SOCKET_STOP_PRE:
1581 case SOCKET_STOP_PRE_SIGTERM:
1582 case SOCKET_STOP_PRE_SIGKILL:
1583 socket_enter_stop_post(s, success);
1584 break;
1585
1586 case SOCKET_STOP_POST:
80876c20
LP
1587 case SOCKET_FINAL_SIGTERM:
1588 case SOCKET_FINAL_SIGKILL:
034c6ed7
LP
1589 socket_enter_dead(s, success);
1590 break;
1591
1592 default:
1593 assert_not_reached("Uh, control process died at wrong time.");
1594 }
1595 }
1596}
5cb5a6ff 1597
acbb0225 1598static void socket_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
87f0e418 1599 Socket *s = SOCKET(u);
5cb5a6ff 1600
034c6ed7
LP
1601 assert(s);
1602 assert(elapsed == 1);
acbb0225 1603 assert(w == &s->timer_watch);
034c6ed7
LP
1604
1605 switch (s->state) {
1606
1607 case SOCKET_START_PRE:
9e2f7c11 1608 log_warning("%s starting timed out. Terminating.", u->meta.id);
80876c20
LP
1609 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1610
034c6ed7 1611 case SOCKET_START_POST:
9e2f7c11 1612 log_warning("%s starting timed out. Stopping.", u->meta.id);
034c6ed7
LP
1613 socket_enter_stop_pre(s, false);
1614 break;
1615
1616 case SOCKET_STOP_PRE:
9e2f7c11 1617 log_warning("%s stopping timed out. Terminating.", u->meta.id);
034c6ed7
LP
1618 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, false);
1619 break;
1620
1621 case SOCKET_STOP_PRE_SIGTERM:
9e2f7c11 1622 log_warning("%s stopping timed out. Killing.", u->meta.id);
034c6ed7
LP
1623 socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, false);
1624 break;
1625
1626 case SOCKET_STOP_PRE_SIGKILL:
9e2f7c11 1627 log_warning("%s still around after SIGKILL. Ignoring.", u->meta.id);
034c6ed7
LP
1628 socket_enter_stop_post(s, false);
1629 break;
1630
1631 case SOCKET_STOP_POST:
9e2f7c11 1632 log_warning("%s stopping timed out (2). Terminating.", u->meta.id);
80876c20 1633 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
034c6ed7
LP
1634 break;
1635
80876c20 1636 case SOCKET_FINAL_SIGTERM:
9e2f7c11 1637 log_warning("%s stopping timed out (2). Killing.", u->meta.id);
80876c20 1638 socket_enter_signal(s, SOCKET_FINAL_SIGKILL, false);
034c6ed7
LP
1639 break;
1640
80876c20 1641 case SOCKET_FINAL_SIGKILL:
18c78fb1 1642 log_warning("%s still around after SIGKILL (2). Entering maintenance mode.", u->meta.id);
034c6ed7
LP
1643 socket_enter_dead(s, false);
1644 break;
1645
1646 default:
1647 assert_not_reached("Timeout at wrong time.");
1648 }
5cb5a6ff
LP
1649}
1650
44d8db9e
LP
1651int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
1652 int *rfds;
1653 unsigned rn_fds, k;
1654 SocketPort *p;
1655
1656 assert(s);
1657 assert(fds);
1658 assert(n_fds);
1659
1660 /* Called from the service code for requesting our fds */
1661
1662 rn_fds = 0;
1663 LIST_FOREACH(port, p, s->ports)
1664 if (p->fd >= 0)
1665 rn_fds++;
1666
e364ad06 1667 if (!(rfds = new(int, rn_fds)))
44d8db9e
LP
1668 return -ENOMEM;
1669
1670 k = 0;
1671 LIST_FOREACH(port, p, s->ports)
1672 if (p->fd >= 0)
1673 rfds[k++] = p->fd;
1674
1675 assert(k == rn_fds);
1676
1677 *fds = rfds;
1678 *n_fds = rn_fds;
1679
1680 return 0;
1681}
1682
ceee3d82
LP
1683void socket_notify_service_dead(Socket *s) {
1684 assert(s);
1685
6cf6bbc2
LP
1686 /* The service is dead. Dang!
1687 *
1688 * This is strictly for one-instance-for-all-connections
1689 * services. */
ceee3d82
LP
1690
1691 if (s->state == SOCKET_RUNNING) {
9e2f7c11 1692 log_debug("%s got notified about service death.", s->meta.id);
ceee3d82
LP
1693 socket_enter_listening(s);
1694 }
1695}
1696
6cf6bbc2
LP
1697void socket_connection_unref(Socket *s) {
1698 assert(s);
1699
1700 /* The service is dead. Yay!
1701 *
1702 * This is strictly for one-onstance-per-connection
1703 * services. */
1704
1705 assert(s->n_connections > 0);
1706 s->n_connections--;
1707
1708 log_debug("%s: One connection closed, %u left.", s->meta.id, s->n_connections);
1709}
1710
5632e374
LP
1711static void socket_reset_maintenance(Unit *u) {
1712 Socket *s = SOCKET(u);
1713
1714 assert(s);
1715
1716 if (s->state == SOCKET_MAINTENANCE)
1717 socket_set_state(s, SOCKET_DEAD);
1718
1719 s->failure = false;
1720}
1721
a16e1123
LP
1722static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
1723 [SOCKET_DEAD] = "dead",
1724 [SOCKET_START_PRE] = "start-pre",
1725 [SOCKET_START_POST] = "start-post",
1726 [SOCKET_LISTENING] = "listening",
1727 [SOCKET_RUNNING] = "running",
1728 [SOCKET_STOP_PRE] = "stop-pre",
1729 [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
1730 [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
1731 [SOCKET_STOP_POST] = "stop-post",
1732 [SOCKET_FINAL_SIGTERM] = "final-sigterm",
1733 [SOCKET_FINAL_SIGKILL] = "final-sigkill",
18c78fb1 1734 [SOCKET_MAINTENANCE] = "maintenance"
a16e1123
LP
1735};
1736
1737DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
1738
1739static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
1740 [SOCKET_EXEC_START_PRE] = "StartPre",
1741 [SOCKET_EXEC_START_POST] = "StartPost",
1742 [SOCKET_EXEC_STOP_PRE] = "StopPre",
1743 [SOCKET_EXEC_STOP_POST] = "StopPost"
1744};
1745
1746DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
1747
87f0e418 1748const UnitVTable socket_vtable = {
5cb5a6ff
LP
1749 .suffix = ".socket",
1750
034c6ed7
LP
1751 .init = socket_init,
1752 .done = socket_done,
a16e1123
LP
1753 .load = socket_load,
1754
1755 .coldplug = socket_coldplug,
034c6ed7 1756
5cb5a6ff
LP
1757 .dump = socket_dump,
1758
542563ba
LP
1759 .start = socket_start,
1760 .stop = socket_stop,
5cb5a6ff 1761
a16e1123
LP
1762 .serialize = socket_serialize,
1763 .deserialize_item = socket_deserialize_item,
1764
5cb5a6ff 1765 .active_state = socket_active_state,
10a94420 1766 .sub_state_to_string = socket_sub_state_to_string,
5cb5a6ff 1767
6cf6bbc2
LP
1768 .check_gc = socket_check_gc,
1769
9152c765 1770 .fd_event = socket_fd_event,
034c6ed7 1771 .sigchld_event = socket_sigchld_event,
4139c1b2
LP
1772 .timer_event = socket_timer_event,
1773
5632e374
LP
1774 .reset_maintenance = socket_reset_maintenance,
1775
4139c1b2 1776 .bus_message_handler = bus_socket_message_handler
5cb5a6ff 1777};