1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
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 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/types.h>
27 #include <sys/epoll.h>
29 #include <arpa/inet.h>
30 #include <netinet/tcp.h>
33 #include <attr/xattr.h>
38 #include "load-dropin.h"
39 #include "load-fragment.h"
42 #include "path-util.h"
43 #include "unit-name.h"
44 #include "unit-printf.h"
48 #include "exit-status.h"
50 #include "smack-util.h"
52 #include "bus-error.h"
53 #include "dbus-socket.h"
57 static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
58 [SOCKET_DEAD] = UNIT_INACTIVE,
59 [SOCKET_START_PRE] = UNIT_ACTIVATING,
60 [SOCKET_START_POST] = UNIT_ACTIVATING,
61 [SOCKET_LISTENING] = UNIT_ACTIVE,
62 [SOCKET_RUNNING] = UNIT_ACTIVE,
63 [SOCKET_STOP_PRE] = UNIT_DEACTIVATING,
64 [SOCKET_STOP_PRE_SIGTERM] = UNIT_DEACTIVATING,
65 [SOCKET_STOP_PRE_SIGKILL] = UNIT_DEACTIVATING,
66 [SOCKET_STOP_POST] = UNIT_DEACTIVATING,
67 [SOCKET_FINAL_SIGTERM] = UNIT_DEACTIVATING,
68 [SOCKET_FINAL_SIGKILL] = UNIT_DEACTIVATING,
69 [SOCKET_FAILED] = UNIT_FAILED
72 static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
73 static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata);
75 static void socket_init(Unit *u) {
76 Socket *s = SOCKET(u);
79 assert(u->load_state == UNIT_STUB);
81 s->backlog = SOMAXCONN;
82 s->timeout_usec = u->manager->default_timeout_start_usec;
83 s->directory_mode = 0755;
84 s->socket_mode = 0666;
86 s->max_connections = 64;
93 s->exec_context.std_output = u->manager->default_std_output;
94 s->exec_context.std_error = u->manager->default_std_error;
96 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
99 static void socket_unwatch_control_pid(Socket *s) {
102 if (s->control_pid <= 0)
105 unit_unwatch_pid(UNIT(s), s->control_pid);
109 void socket_free_ports(Socket *s) {
114 while ((p = s->ports)) {
115 LIST_REMOVE(port, s->ports, p);
117 sd_event_source_unref(p->event_source);
125 static void socket_done(Unit *u) {
126 Socket *s = SOCKET(u);
130 socket_free_ports(s);
132 s->exec_runtime = exec_runtime_unref(s->exec_runtime);
133 exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
134 s->control_command = NULL;
136 socket_unwatch_control_pid(s);
138 unit_ref_unset(&s->service);
140 free(s->tcp_congestion);
141 s->tcp_congestion = NULL;
143 free(s->bind_to_device);
144 s->bind_to_device = NULL;
147 free(s->smack_ip_in);
148 free(s->smack_ip_out);
150 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
153 static int socket_arm_timer(Socket *s) {
158 if (s->timeout_usec <= 0) {
159 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
163 if (s->timer_event_source) {
164 r = sd_event_source_set_time(s->timer_event_source, now(CLOCK_MONOTONIC) + s->timeout_usec);
168 return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT);
171 return sd_event_add_time(
172 UNIT(s)->manager->event,
173 &s->timer_event_source,
175 now(CLOCK_MONOTONIC) + s->timeout_usec, 0,
176 socket_dispatch_timer, s);
179 static int socket_instantiate_service(Socket *s) {
180 _cleanup_free_ char *prefix = NULL;
181 _cleanup_free_ char *name = NULL;
187 /* This fills in s->service if it isn't filled in yet. For
188 * Accept=yes sockets we create the next connection service
189 * here. For Accept=no this is mostly a NOP since the service
190 * is figured out at load time anyway. */
192 if (UNIT_DEREF(s->service))
197 prefix = unit_name_to_prefix(UNIT(s)->id);
201 if (asprintf(&name, "%s@%u.service", prefix, s->n_accepted) < 0)
204 r = manager_load_unit(UNIT(s)->manager, name, NULL, NULL, &u);
208 #ifdef HAVE_SYSV_COMPAT
209 if (SERVICE(u)->is_sysv) {
210 log_error("Using SysV services for socket activation is not supported. Refusing.");
216 unit_ref_set(&s->service, u);
218 return unit_add_two_dependencies(UNIT(s), UNIT_BEFORE, UNIT_TRIGGERS, u, false);
221 static bool have_non_accept_socket(Socket *s) {
229 LIST_FOREACH(port, p, s->ports) {
231 if (p->type != SOCKET_SOCKET)
234 if (!socket_address_can_accept(&p->address))
241 static int socket_add_mount_links(Socket *s) {
247 LIST_FOREACH(port, p, s->ports) {
248 const char *path = NULL;
250 if (p->type == SOCKET_SOCKET)
251 path = socket_address_get_path(&p->address);
252 else if (p->type == SOCKET_FIFO || p->type == SOCKET_SPECIAL)
258 r = unit_require_mounts_for(UNIT(s), path);
266 static int socket_add_device_link(Socket *s) {
271 if (!s->bind_to_device || streq(s->bind_to_device, "lo"))
274 t = strappenda("/sys/subsystem/net/devices/", s->bind_to_device);
275 return unit_add_node_link(UNIT(s), t, false);
278 static int socket_add_default_dependencies(Socket *s) {
282 r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, NULL, true);
286 if (UNIT(s)->manager->running_as == SYSTEMD_SYSTEM) {
287 r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true);
292 return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
295 _pure_ static bool socket_has_exec(Socket *s) {
299 for (i = 0; i < _SOCKET_EXEC_COMMAND_MAX; i++)
300 if (s->exec_command[i])
306 static int socket_add_extras(Socket *s) {
312 if (have_non_accept_socket(s)) {
314 if (!UNIT_DEREF(s->service)) {
317 r = unit_load_related_unit(u, ".service", &x);
321 unit_ref_set(&s->service, x);
324 r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(s->service), true);
329 r = socket_add_mount_links(s);
333 r = socket_add_device_link(s);
337 r = unit_patch_contexts(u);
341 if (socket_has_exec(s)) {
342 r = unit_add_exec_dependencies(u, &s->exec_context);
346 r = unit_add_default_slice(u, &s->cgroup_context);
351 if (u->default_dependencies) {
352 r = socket_add_default_dependencies(s);
360 static int socket_verify(Socket *s) {
363 if (UNIT(s)->load_state != UNIT_LOADED)
367 log_error_unit(UNIT(s)->id, "%s lacks Listen setting. Refusing.", UNIT(s)->id);
371 if (s->accept && have_non_accept_socket(s)) {
372 log_error_unit(UNIT(s)->id, "%s configured for accepting sockets, but sockets are non-accepting. Refusing.",
377 if (s->accept && s->max_connections <= 0) {
378 log_error_unit(UNIT(s)->id, "%s's MaxConnection setting too small. Refusing.", UNIT(s)->id);
382 if (s->accept && UNIT_DEREF(s->service)) {
383 log_error_unit(UNIT(s)->id, "Explicit service configuration for accepting sockets not supported on %s. Refusing.", UNIT(s)->id);
387 if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
388 log_error_unit(UNIT(s)->id, "%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
395 static int socket_load(Unit *u) {
396 Socket *s = SOCKET(u);
400 assert(u->load_state == UNIT_STUB);
402 r = unit_load_fragment_and_dropin(u);
406 if (u->load_state == UNIT_LOADED) {
407 /* This is a new unit? Then let's add in some extras */
408 r = socket_add_extras(s);
413 return socket_verify(s);
416 _const_ static const char* listen_lookup(int family, int type) {
418 if (family == AF_NETLINK)
419 return "ListenNetlink";
421 if (type == SOCK_STREAM)
422 return "ListenStream";
423 else if (type == SOCK_DGRAM)
424 return "ListenDatagram";
425 else if (type == SOCK_SEQPACKET)
426 return "ListenSequentialPacket";
428 assert_not_reached("Unknown socket type");
432 static void socket_dump(Unit *u, FILE *f, const char *prefix) {
434 Socket *s = SOCKET(u);
441 prefix2 = strappenda(prefix, "\t");
444 "%sSocket State: %s\n"
446 "%sBindIPv6Only: %s\n"
448 "%sSocketMode: %04o\n"
449 "%sDirectoryMode: %04o\n"
452 "%sTransparent: %s\n"
454 "%sPassCredentials: %s\n"
455 "%sPassSecurity: %s\n"
456 "%sTCPCongestion: %s\n",
457 prefix, socket_state_to_string(s->state),
458 prefix, socket_result_to_string(s->result),
459 prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only),
461 prefix, s->socket_mode,
462 prefix, s->directory_mode,
463 prefix, yes_no(s->keep_alive),
464 prefix, yes_no(s->free_bind),
465 prefix, yes_no(s->transparent),
466 prefix, yes_no(s->broadcast),
467 prefix, yes_no(s->pass_cred),
468 prefix, yes_no(s->pass_sec),
469 prefix, strna(s->tcp_congestion));
471 if (s->control_pid > 0)
473 "%sControl PID: %lu\n",
474 prefix, (unsigned long) s->control_pid);
476 if (s->bind_to_device)
478 "%sBindToDevice: %s\n",
479 prefix, s->bind_to_device);
484 "%sNConnections: %u\n"
485 "%sMaxConnections: %u\n",
486 prefix, s->n_accepted,
487 prefix, s->n_connections,
488 prefix, s->max_connections);
490 if (s->priority >= 0)
493 prefix, s->priority);
495 if (s->receive_buffer > 0)
497 "%sReceiveBuffer: %zu\n",
498 prefix, s->receive_buffer);
500 if (s->send_buffer > 0)
502 "%sSendBuffer: %zu\n",
503 prefix, s->send_buffer);
515 if (s->pipe_size > 0)
518 prefix, s->pipe_size);
525 if (s->mq_maxmsg > 0)
527 "%sMessageQueueMaxMessages: %li\n",
528 prefix, s->mq_maxmsg);
530 if (s->mq_msgsize > 0)
532 "%sMessageQueueMessageSize: %li\n",
533 prefix, s->mq_msgsize);
538 prefix, yes_no(s->reuse_port));
542 "%sSmackLabel: %s\n",
547 "%sSmackLabelIPIn: %s\n",
548 prefix, s->smack_ip_in);
552 "%sSmackLabelIPOut: %s\n",
553 prefix, s->smack_ip_out);
555 LIST_FOREACH(port, p, s->ports) {
557 if (p->type == SOCKET_SOCKET) {
562 if ((r = socket_address_print(&p->address, &k)) < 0)
567 fprintf(f, "%s%s: %s\n", prefix, listen_lookup(socket_address_family(&p->address), p->address.type), t);
569 } else if (p->type == SOCKET_SPECIAL)
570 fprintf(f, "%sListenSpecial: %s\n", prefix, p->path);
571 else if (p->type == SOCKET_MQUEUE)
572 fprintf(f, "%sListenMessageQueue: %s\n", prefix, p->path);
574 fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
577 exec_context_dump(&s->exec_context, f, prefix);
578 kill_context_dump(&s->kill_context, f, prefix);
580 for (c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
581 if (!s->exec_command[c])
584 fprintf(f, "%s-> %s:\n",
585 prefix, socket_exec_command_to_string(c));
587 exec_command_dump_list(s->exec_command[c], f, prefix2);
591 static int instance_from_socket(int fd, unsigned nr, char **instance) {
594 union sockaddr_union local, remote;
600 if (getsockname(fd, &local.sa, &l) < 0)
604 if (getpeername(fd, &remote.sa, &l) < 0)
607 switch (local.sa.sa_family) {
611 a = ntohl(local.in.sin_addr.s_addr),
612 b = ntohl(remote.in.sin_addr.s_addr);
615 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
617 a >> 24, (a >> 16) & 0xFF, (a >> 8) & 0xFF, a & 0xFF,
618 ntohs(local.in.sin_port),
619 b >> 24, (b >> 16) & 0xFF, (b >> 8) & 0xFF, b & 0xFF,
620 ntohs(remote.in.sin_port)) < 0)
627 static const unsigned char ipv4_prefix[] = {
628 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
631 if (memcmp(&local.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0 &&
632 memcmp(&remote.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0) {
634 *a = local.in6.sin6_addr.s6_addr+12,
635 *b = remote.in6.sin6_addr.s6_addr+12;
638 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
640 a[0], a[1], a[2], a[3],
641 ntohs(local.in6.sin6_port),
642 b[0], b[1], b[2], b[3],
643 ntohs(remote.in6.sin6_port)) < 0)
646 char a[INET6_ADDRSTRLEN], b[INET6_ADDRSTRLEN];
651 inet_ntop(AF_INET6, &local.in6.sin6_addr, a, sizeof(a)),
652 ntohs(local.in6.sin6_port),
653 inet_ntop(AF_INET6, &remote.in6.sin6_addr, b, sizeof(b)),
654 ntohs(remote.in6.sin6_port)) < 0)
665 k = getpeercred(fd, &ucred);
668 "%u-"PID_FMT"-"UID_FMT,
669 nr, ucred.pid, ucred.uid) < 0)
671 } else if (k == -ENODATA) {
672 /* This handles the case where somebody is
673 * connecting from another pid/uid namespace
674 * (e.g. from outside of our container). */
684 assert_not_reached("Unhandled socket type.");
691 static void socket_close_fds(Socket *s) {
696 LIST_FOREACH(port, p, s->ports) {
698 p->event_source = sd_event_source_unref(p->event_source);
703 p->fd = safe_close(p->fd);
705 /* One little note: we should never delete any sockets
706 * in the file system here! After all some other
707 * process we spawned might still have a reference of
708 * this fd and wants to continue to use it. Therefore
709 * we delete sockets in the file system before we
710 * create a new one, not after we stopped using
715 static void socket_apply_socket_options(Socket *s, int fd) {
720 int b = s->keep_alive;
721 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &b, sizeof(b)) < 0)
722 log_warning_unit(UNIT(s)->id, "SO_KEEPALIVE failed: %m");
727 if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)) < 0)
728 log_warning_unit(UNIT(s)->id, "SO_BROADCAST failed: %m");
733 if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0)
734 log_warning_unit(UNIT(s)->id, "SO_PASSCRED failed: %m");
739 if (setsockopt(fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one)) < 0)
740 log_warning_unit(UNIT(s)->id, "SO_PASSSEC failed: %m");
743 if (s->priority >= 0)
744 if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &s->priority, sizeof(s->priority)) < 0)
745 log_warning_unit(UNIT(s)->id, "SO_PRIORITY failed: %m");
747 if (s->receive_buffer > 0) {
748 int value = (int) s->receive_buffer;
750 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
752 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof(value)) < 0)
753 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0)
754 log_warning_unit(UNIT(s)->id, "SO_RCVBUF failed: %m");
757 if (s->send_buffer > 0) {
758 int value = (int) s->send_buffer;
759 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof(value)) < 0)
760 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0)
761 log_warning_unit(UNIT(s)->id, "SO_SNDBUF failed: %m");
765 if (setsockopt(fd, SOL_SOCKET, SO_MARK, &s->mark, sizeof(s->mark)) < 0)
766 log_warning_unit(UNIT(s)->id, "SO_MARK failed: %m");
769 if (setsockopt(fd, IPPROTO_IP, IP_TOS, &s->ip_tos, sizeof(s->ip_tos)) < 0)
770 log_warning_unit(UNIT(s)->id, "IP_TOS failed: %m");
772 if (s->ip_ttl >= 0) {
775 r = setsockopt(fd, IPPROTO_IP, IP_TTL, &s->ip_ttl, sizeof(s->ip_ttl));
777 if (socket_ipv6_is_supported())
778 x = setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &s->ip_ttl, sizeof(s->ip_ttl));
781 errno = EAFNOSUPPORT;
785 log_warning_unit(UNIT(s)->id,
786 "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
789 if (s->tcp_congestion)
790 if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
791 log_warning_unit(UNIT(s)->id, "TCP_CONGESTION failed: %m");
794 int b = s->reuse_port;
795 if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &b, sizeof(b)) < 0)
796 log_warning_unit(UNIT(s)->id, "SO_REUSEPORT failed: %m");
800 if (smack_label_ip_in_fd(fd, s->smack_ip_in) < 0)
801 log_error_unit(UNIT(s)->id, "smack_label_ip_in_fd: %m");
804 if (smack_label_ip_out_fd(fd, s->smack_ip_out) < 0)
805 log_error_unit(UNIT(s)->id, "smack_label_ip_out_fd: %m");
808 static void socket_apply_fifo_options(Socket *s, int fd) {
812 if (s->pipe_size > 0)
813 if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
814 log_warning_unit(UNIT(s)->id,
818 if (smack_label_fd(fd, s->smack) < 0)
819 log_error_unit(UNIT(s)->id, "smack_label_fd: %m");
822 static int fifo_address_create(
824 mode_t directory_mode,
835 mkdir_parents_label(path, directory_mode);
837 r = label_context_set(path, S_IFIFO);
841 /* Enforce the right access mode for the fifo */
842 old_mask = umask(~ socket_mode);
844 /* Include the original umask in our mask */
845 umask(~socket_mode | old_mask);
847 r = mkfifo(path, socket_mode);
850 if (r < 0 && errno != EEXIST) {
855 if ((fd = open(path, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW)) < 0) {
860 label_context_clear();
862 if (fstat(fd, &st) < 0) {
867 if (!S_ISFIFO(st.st_mode) ||
868 (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
869 st.st_uid != getuid() ||
870 st.st_gid != getgid()) {
880 label_context_clear();
886 static int special_address_create(
896 if ((fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW)) < 0) {
901 if (fstat(fd, &st) < 0) {
906 /* Check whether this is a /proc, /sys or /dev file or char device */
907 if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
921 static int mq_address_create(
931 struct mq_attr _attr, *attr = NULL;
936 if (maxmsg > 0 && msgsize > 0) {
938 _attr.mq_flags = O_NONBLOCK;
939 _attr.mq_maxmsg = maxmsg;
940 _attr.mq_msgsize = msgsize;
944 /* Enforce the right access mode for the mq */
945 old_mask = umask(~ mq_mode);
947 /* Include the original umask in our mask */
948 umask(~mq_mode | old_mask);
950 fd = mq_open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_CREAT, mq_mode, attr);
958 if (fstat(fd, &st) < 0) {
963 if ((st.st_mode & 0777) != (mq_mode & ~old_mask) ||
964 st.st_uid != getuid() ||
965 st.st_gid != getgid()) {
979 static int socket_open_fds(Socket *s) {
983 bool know_label = false;
987 LIST_FOREACH(port, p, s->ports) {
992 if (p->type == SOCKET_SOCKET) {
996 if ((r = socket_instantiate_service(s)) < 0)
999 if (UNIT_ISSET(s->service) &&
1000 SERVICE(UNIT_DEREF(s->service))->exec_command[SERVICE_EXEC_START]) {
1001 r = label_get_create_label_from_exe(SERVICE(UNIT_DEREF(s->service))->exec_command[SERVICE_EXEC_START]->path, &label);
1012 r = socket_address_listen(
1014 SOCK_CLOEXEC|SOCK_NONBLOCK,
1027 socket_apply_socket_options(s, p->fd);
1029 } else if (p->type == SOCKET_SPECIAL) {
1031 r = special_address_create(
1037 } else if (p->type == SOCKET_FIFO) {
1039 r = fifo_address_create(
1047 socket_apply_fifo_options(s, p->fd);
1048 } else if (p->type == SOCKET_MQUEUE) {
1050 r = mq_address_create(
1059 assert_not_reached("Unknown port type");
1066 socket_close_fds(s);
1071 static void socket_unwatch_fds(Socket *s) {
1077 LIST_FOREACH(port, p, s->ports) {
1081 if (p->event_source) {
1082 r = sd_event_source_set_enabled(p->event_source, SD_EVENT_OFF);
1084 log_debug_unit(UNIT(s)->id, "Failed to disable event source.");
1089 static int socket_watch_fds(Socket *s) {
1095 LIST_FOREACH(port, p, s->ports) {
1099 if (p->event_source)
1100 r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
1102 r = sd_event_add_io(UNIT(s)->manager->event, &p->event_source, p->fd, EPOLLIN, socket_dispatch_io, p);
1105 log_warning_unit(UNIT(s)->id, "Failed to watch listening fds: %s", strerror(-r));
1113 socket_unwatch_fds(s);
1117 static void socket_set_state(Socket *s, SocketState state) {
1118 SocketState old_state;
1121 old_state = s->state;
1124 if (state != SOCKET_START_PRE &&
1125 state != SOCKET_START_POST &&
1126 state != SOCKET_STOP_PRE &&
1127 state != SOCKET_STOP_PRE_SIGTERM &&
1128 state != SOCKET_STOP_PRE_SIGKILL &&
1129 state != SOCKET_STOP_POST &&
1130 state != SOCKET_FINAL_SIGTERM &&
1131 state != SOCKET_FINAL_SIGKILL) {
1133 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
1134 socket_unwatch_control_pid(s);
1135 s->control_command = NULL;
1136 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
1139 if (state != SOCKET_LISTENING)
1140 socket_unwatch_fds(s);
1142 if (state != SOCKET_START_POST &&
1143 state != SOCKET_LISTENING &&
1144 state != SOCKET_RUNNING &&
1145 state != SOCKET_STOP_PRE &&
1146 state != SOCKET_STOP_PRE_SIGTERM &&
1147 state != SOCKET_STOP_PRE_SIGKILL)
1148 socket_close_fds(s);
1150 if (state != old_state)
1151 log_debug_unit(UNIT(s)->id, "%s changed %s -> %s",
1152 UNIT(s)->id, socket_state_to_string(old_state), socket_state_to_string(state));
1154 unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true);
1157 static int socket_coldplug(Unit *u) {
1158 Socket *s = SOCKET(u);
1162 assert(s->state == SOCKET_DEAD);
1164 if (s->deserialized_state == s->state)
1167 if (s->deserialized_state == SOCKET_START_PRE ||
1168 s->deserialized_state == SOCKET_START_POST ||
1169 s->deserialized_state == SOCKET_STOP_PRE ||
1170 s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
1171 s->deserialized_state == SOCKET_STOP_PRE_SIGKILL ||
1172 s->deserialized_state == SOCKET_STOP_POST ||
1173 s->deserialized_state == SOCKET_FINAL_SIGTERM ||
1174 s->deserialized_state == SOCKET_FINAL_SIGKILL) {
1176 if (s->control_pid <= 0)
1179 r = unit_watch_pid(UNIT(s), s->control_pid);
1183 r = socket_arm_timer(s);
1188 if (s->deserialized_state == SOCKET_START_POST ||
1189 s->deserialized_state == SOCKET_LISTENING ||
1190 s->deserialized_state == SOCKET_RUNNING ||
1191 s->deserialized_state == SOCKET_STOP_PRE ||
1192 s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
1193 s->deserialized_state == SOCKET_STOP_PRE_SIGKILL) {
1194 r = socket_open_fds(s);
1199 if (s->deserialized_state == SOCKET_LISTENING) {
1200 r = socket_watch_fds(s);
1205 socket_set_state(s, s->deserialized_state);
1209 static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
1218 unit_realize_cgroup(UNIT(s));
1220 r = unit_setup_exec_runtime(UNIT(s));
1224 r = socket_arm_timer(s);
1228 r = unit_full_printf_strv(UNIT(s), c->argv, &argv);
1236 UNIT(s)->manager->environment,
1240 UNIT(s)->manager->confirm_spawn,
1241 UNIT(s)->manager->cgroup_supported,
1242 UNIT(s)->cgroup_path,
1243 manager_get_runtime_prefix(UNIT(s)->manager),
1254 r = unit_watch_pid(UNIT(s), pid);
1256 /* FIXME: we need to do something here */
1264 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
1269 static void socket_enter_dead(Socket *s, SocketResult f) {
1272 if (f != SOCKET_SUCCESS)
1275 exec_runtime_destroy(s->exec_runtime);
1276 s->exec_runtime = exec_runtime_unref(s->exec_runtime);
1278 exec_context_destroy_runtime_directory(&s->exec_context, manager_get_runtime_prefix(UNIT(s)->manager));
1280 socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
1283 static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
1285 static void socket_enter_stop_post(Socket *s, SocketResult f) {
1289 if (f != SOCKET_SUCCESS)
1292 socket_unwatch_control_pid(s);
1294 s->control_command_id = SOCKET_EXEC_STOP_POST;
1296 if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST])) {
1297 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1300 socket_set_state(s, SOCKET_STOP_POST);
1302 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_SUCCESS);
1307 log_warning_unit(UNIT(s)->id,
1308 "%s failed to run 'stop-post' task: %s",
1309 UNIT(s)->id, strerror(-r));
1310 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
1313 static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
1318 if (f != SOCKET_SUCCESS)
1321 r = unit_kill_context(
1324 state != SOCKET_STOP_PRE_SIGTERM && state != SOCKET_FINAL_SIGTERM,
1332 r = socket_arm_timer(s);
1336 socket_set_state(s, state);
1337 } else if (state == SOCKET_STOP_PRE_SIGTERM)
1338 socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS);
1339 else if (state == SOCKET_STOP_PRE_SIGKILL)
1340 socket_enter_stop_post(s, SOCKET_SUCCESS);
1341 else if (state == SOCKET_FINAL_SIGTERM)
1342 socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
1344 socket_enter_dead(s, SOCKET_SUCCESS);
1349 log_warning_unit(UNIT(s)->id, "%s failed to kill processes: %s", UNIT(s)->id, strerror(-r));
1351 if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
1352 socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
1354 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1357 static void socket_enter_stop_pre(Socket *s, SocketResult f) {
1361 if (f != SOCKET_SUCCESS)
1364 socket_unwatch_control_pid(s);
1366 s->control_command_id = SOCKET_EXEC_STOP_PRE;
1368 if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE])) {
1369 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1372 socket_set_state(s, SOCKET_STOP_PRE);
1374 socket_enter_stop_post(s, SOCKET_SUCCESS);
1379 log_warning_unit(UNIT(s)->id, "%s failed to run 'stop-pre' task: %s", UNIT(s)->id, strerror(-r));
1380 socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
1383 static void socket_enter_listening(Socket *s) {
1387 r = socket_watch_fds(s);
1389 log_warning_unit(UNIT(s)->id, "%s failed to watch sockets: %s", UNIT(s)->id, strerror(-r));
1393 socket_set_state(s, SOCKET_LISTENING);
1397 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1400 static void socket_enter_start_post(Socket *s) {
1404 r = socket_open_fds(s);
1406 log_warning_unit(UNIT(s)->id, "%s failed to listen on sockets: %s", UNIT(s)->id, strerror(-r));
1410 socket_unwatch_control_pid(s);
1412 s->control_command_id = SOCKET_EXEC_START_POST;
1414 if ((s->control_command = s->exec_command[SOCKET_EXEC_START_POST])) {
1415 r = socket_spawn(s, s->control_command, &s->control_pid);
1417 log_warning_unit(UNIT(s)->id, "%s failed to run 'start-post' task: %s", UNIT(s)->id, strerror(-r));
1421 socket_set_state(s, SOCKET_START_POST);
1423 socket_enter_listening(s);
1428 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1431 static void socket_enter_start_pre(Socket *s) {
1435 socket_unwatch_control_pid(s);
1437 s->control_command_id = SOCKET_EXEC_START_PRE;
1439 if ((s->control_command = s->exec_command[SOCKET_EXEC_START_PRE])) {
1440 r = socket_spawn(s, s->control_command, &s->control_pid);
1444 socket_set_state(s, SOCKET_START_PRE);
1446 socket_enter_start_post(s);
1451 log_warning_unit(UNIT(s)->id, "%s failed to run 'start-pre' task: %s", UNIT(s)->id, strerror(-r));
1452 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1455 static void socket_enter_running(Socket *s, int cfd) {
1456 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1461 /* We don't take connections anymore if we are supposed to
1462 * shut down anyway */
1463 if (unit_stop_pending(UNIT(s))) {
1465 log_debug_unit(UNIT(s)->id, "Suppressing connection request on %s since unit stop is scheduled.", UNIT(s)->id);
1470 /* Flush all sockets by closing and reopening them */
1471 socket_close_fds(s);
1473 r = socket_open_fds(s);
1475 log_warning_unit(UNIT(s)->id, "%s failed to listen on sockets: %s", UNIT(s)->id, strerror(-r));
1476 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1480 r = socket_watch_fds(s);
1482 log_warning_unit(UNIT(s)->id, "%s failed to watch sockets: %s", UNIT(s)->id, strerror(-r));
1483 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1493 bool pending = false;
1495 /* If there's already a start pending don't bother to
1497 SET_FOREACH(other, UNIT(s)->dependencies[UNIT_TRIGGERS], i)
1498 if (unit_active_or_pending(other)) {
1504 r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, true, &error, NULL);
1509 socket_set_state(s, SOCKET_RUNNING);
1511 _cleanup_free_ char *prefix = NULL, *instance = NULL, *name = NULL;
1514 if (s->n_connections >= s->max_connections) {
1515 log_warning_unit(UNIT(s)->id, "%s: Too many incoming connections (%u)", UNIT(s)->id, s->n_connections);
1520 r = socket_instantiate_service(s);
1524 r = instance_from_socket(cfd, s->n_accepted, &instance);
1529 /* ENOTCONN is legitimate if TCP RST was received.
1530 * This connection is over, but the socket unit lives on. */
1535 prefix = unit_name_to_prefix(UNIT(s)->id);
1541 name = unit_name_build(prefix, instance, ".service");
1547 r = unit_add_name(UNIT_DEREF(s->service), name);
1551 service = SERVICE(UNIT_DEREF(s->service));
1552 unit_ref_unset(&s->service);
1555 UNIT(service)->no_gc = false;
1557 unit_choose_id(UNIT(service), name);
1559 r = service_set_socket_fd(service, cfd, s);
1564 s->n_connections ++;
1566 r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT(service), JOB_REPLACE, true, &error, NULL);
1570 /* Notify clients about changed counters */
1571 unit_add_to_dbus_queue(UNIT(s));
1577 log_warning_unit(UNIT(s)->id, "%s failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
1578 UNIT(s)->id, cfd >= 0 ? "template" : "non-template",
1579 bus_error_message(&error, r));
1581 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1585 static void socket_run_next(Socket *s) {
1589 assert(s->control_command);
1590 assert(s->control_command->command_next);
1592 socket_unwatch_control_pid(s);
1594 s->control_command = s->control_command->command_next;
1596 r = socket_spawn(s, s->control_command, &s->control_pid);
1603 log_warning_unit(UNIT(s)->id, "%s failed to run next task: %s", UNIT(s)->id, strerror(-r));
1605 if (s->state == SOCKET_START_POST)
1606 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1607 else if (s->state == SOCKET_STOP_POST)
1608 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1610 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
1613 static int socket_start(Unit *u) {
1614 Socket *s = SOCKET(u);
1618 /* We cannot fulfill this request right now, try again later
1620 if (s->state == SOCKET_STOP_PRE ||
1621 s->state == SOCKET_STOP_PRE_SIGKILL ||
1622 s->state == SOCKET_STOP_PRE_SIGTERM ||
1623 s->state == SOCKET_STOP_POST ||
1624 s->state == SOCKET_FINAL_SIGTERM ||
1625 s->state == SOCKET_FINAL_SIGKILL)
1628 if (s->state == SOCKET_START_PRE ||
1629 s->state == SOCKET_START_POST)
1632 /* Cannot run this without the service being around */
1633 if (UNIT_ISSET(s->service)) {
1636 service = SERVICE(UNIT_DEREF(s->service));
1638 if (UNIT(service)->load_state != UNIT_LOADED) {
1639 log_error_unit(u->id, "Socket service %s not loaded, refusing.", UNIT(service)->id);
1643 /* If the service is already active we cannot start the
1645 if (service->state != SERVICE_DEAD &&
1646 service->state != SERVICE_FAILED &&
1647 service->state != SERVICE_AUTO_RESTART) {
1648 log_error_unit(u->id, "Socket service %s already active, refusing.", UNIT(service)->id);
1652 #ifdef HAVE_SYSV_COMPAT
1653 if (service->is_sysv) {
1654 log_error_unit(u->id,
1655 "Using SysV services for socket activation is not supported. Refusing.");
1661 assert(s->state == SOCKET_DEAD || s->state == SOCKET_FAILED);
1663 s->result = SOCKET_SUCCESS;
1664 socket_enter_start_pre(s);
1669 static int socket_stop(Unit *u) {
1670 Socket *s = SOCKET(u);
1675 if (s->state == SOCKET_STOP_PRE ||
1676 s->state == SOCKET_STOP_PRE_SIGTERM ||
1677 s->state == SOCKET_STOP_PRE_SIGKILL ||
1678 s->state == SOCKET_STOP_POST ||
1679 s->state == SOCKET_FINAL_SIGTERM ||
1680 s->state == SOCKET_FINAL_SIGKILL)
1683 /* If there's already something running we go directly into
1685 if (s->state == SOCKET_START_PRE ||
1686 s->state == SOCKET_START_POST) {
1687 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
1691 assert(s->state == SOCKET_LISTENING || s->state == SOCKET_RUNNING);
1693 socket_enter_stop_pre(s, SOCKET_SUCCESS);
1697 static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
1698 Socket *s = SOCKET(u);
1706 unit_serialize_item(u, f, "state", socket_state_to_string(s->state));
1707 unit_serialize_item(u, f, "result", socket_result_to_string(s->result));
1708 unit_serialize_item_format(u, f, "n-accepted", "%u", s->n_accepted);
1710 if (s->control_pid > 0)
1711 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid);
1713 if (s->control_command_id >= 0)
1714 unit_serialize_item(u, f, "control-command", socket_exec_command_to_string(s->control_command_id));
1716 LIST_FOREACH(port, p, s->ports) {
1722 copy = fdset_put_dup(fds, p->fd);
1726 if (p->type == SOCKET_SOCKET) {
1727 _cleanup_free_ char *t = NULL;
1729 r = socket_address_print(&p->address, &t);
1733 if (socket_address_family(&p->address) == AF_NETLINK)
1734 unit_serialize_item_format(u, f, "netlink", "%i %s", copy, t);
1736 unit_serialize_item_format(u, f, "socket", "%i %i %s", copy, p->address.type, t);
1738 } else if (p->type == SOCKET_SPECIAL)
1739 unit_serialize_item_format(u, f, "special", "%i %s", copy, p->path);
1740 else if (p->type == SOCKET_MQUEUE)
1741 unit_serialize_item_format(u, f, "mqueue", "%i %s", copy, p->path);
1743 assert(p->type == SOCKET_FIFO);
1744 unit_serialize_item_format(u, f, "fifo", "%i %s", copy, p->path);
1751 static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1752 Socket *s = SOCKET(u);
1758 if (streq(key, "state")) {
1761 state = socket_state_from_string(value);
1763 log_debug_unit(u->id, "Failed to parse state value %s", value);
1765 s->deserialized_state = state;
1766 } else if (streq(key, "result")) {
1769 f = socket_result_from_string(value);
1771 log_debug_unit(u->id, "Failed to parse result value %s", value);
1772 else if (f != SOCKET_SUCCESS)
1775 } else if (streq(key, "n-accepted")) {
1778 if (safe_atou(value, &k) < 0)
1779 log_debug_unit(u->id, "Failed to parse n-accepted value %s", value);
1782 } else if (streq(key, "control-pid")) {
1785 if (parse_pid(value, &pid) < 0)
1786 log_debug_unit(u->id, "Failed to parse control-pid value %s", value);
1788 s->control_pid = pid;
1789 } else if (streq(key, "control-command")) {
1790 SocketExecCommand id;
1792 id = socket_exec_command_from_string(value);
1794 log_debug_unit(u->id, "Failed to parse exec-command value %s", value);
1796 s->control_command_id = id;
1797 s->control_command = s->exec_command[id];
1799 } else if (streq(key, "fifo")) {
1803 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1804 log_debug_unit(u->id, "Failed to parse fifo value %s", value);
1807 LIST_FOREACH(port, p, s->ports)
1808 if (p->type == SOCKET_FIFO &&
1809 streq_ptr(p->path, value+skip))
1814 p->fd = fdset_remove(fds, fd);
1818 } else if (streq(key, "special")) {
1822 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1823 log_debug_unit(u->id, "Failed to parse special value %s", value);
1826 LIST_FOREACH(port, p, s->ports)
1827 if (p->type == SOCKET_SPECIAL &&
1828 streq_ptr(p->path, value+skip))
1833 p->fd = fdset_remove(fds, fd);
1837 } else if (streq(key, "mqueue")) {
1841 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1842 log_debug_unit(u->id, "Failed to parse mqueue value %s", value);
1845 LIST_FOREACH(port, p, s->ports)
1846 if (p->type == SOCKET_MQUEUE &&
1847 streq_ptr(p->path, value+skip))
1852 p->fd = fdset_remove(fds, fd);
1856 } else if (streq(key, "socket")) {
1857 int fd, type, skip = 0;
1860 if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd))
1861 log_debug_unit(u->id, "Failed to parse socket value %s", value);
1864 LIST_FOREACH(port, p, s->ports)
1865 if (socket_address_is(&p->address, value+skip, type))
1870 p->fd = fdset_remove(fds, fd);
1874 } else if (streq(key, "netlink")) {
1878 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1879 log_debug_unit(u->id, "Failed to parse socket value %s", value);
1882 LIST_FOREACH(port, p, s->ports)
1883 if (socket_address_is_netlink(&p->address, value+skip))
1888 p->fd = fdset_remove(fds, fd);
1892 log_debug_unit(UNIT(s)->id, "Unknown serialization key '%s'", key);
1897 static int socket_distribute_fds(Unit *u, FDSet *fds) {
1898 Socket *s = SOCKET(u);
1903 LIST_FOREACH(port, p, s->ports) {
1907 if (p->type != SOCKET_SOCKET)
1913 FDSET_FOREACH(fd, fds, i) {
1914 if (socket_address_matches_fd(&p->address, fd)) {
1915 p->fd = fdset_remove(fds, fd);
1916 s->deserialized_state = SOCKET_LISTENING;
1925 _pure_ static UnitActiveState socket_active_state(Unit *u) {
1928 return state_translation_table[SOCKET(u)->state];
1931 _pure_ static const char *socket_sub_state_to_string(Unit *u) {
1934 return socket_state_to_string(SOCKET(u)->state);
1937 const char* socket_port_type_to_string(SocketPort *p) {
1945 switch (p->address.type) {
1953 case SOCK_SEQPACKET:
1954 return "SequentialPacket";
1957 if (socket_address_family(&p->address) == AF_NETLINK)
1964 case SOCKET_SPECIAL:
1968 return "MessageQueue";
1978 _pure_ static bool socket_check_gc(Unit *u) {
1979 Socket *s = SOCKET(u);
1983 return s->n_connections > 0;
1986 static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1987 SocketPort *p = userdata;
1993 if (p->socket->state != SOCKET_LISTENING)
1996 log_debug_unit(UNIT(p->socket)->id, "Incoming traffic on %s", UNIT(p->socket)->id);
1998 if (revents != EPOLLIN) {
2000 if (revents & EPOLLHUP)
2001 log_error_unit(UNIT(p->socket)->id, "%s: Got POLLHUP on a listening socket. The service probably invoked shutdown() on it, and should better not do that.",
2002 UNIT(p->socket)->id);
2004 log_error_unit(UNIT(p->socket)->id, "%s: Got unexpected poll event (0x%x) on socket.",
2005 UNIT(p->socket)->id, revents);
2010 if (p->socket->accept &&
2011 p->type == SOCKET_SOCKET &&
2012 socket_address_can_accept(&p->address)) {
2016 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK);
2022 log_error_unit(UNIT(p->socket)->id,
2023 "Failed to accept socket: %m");
2030 socket_apply_socket_options(p->socket, cfd);
2033 socket_enter_running(p->socket, cfd);
2037 socket_enter_stop_pre(p->socket, SOCKET_FAILURE_RESOURCES);
2041 static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
2042 Socket *s = SOCKET(u);
2048 if (pid != s->control_pid)
2053 if (is_clean_exit(code, status, NULL))
2055 else if (code == CLD_EXITED)
2056 f = SOCKET_FAILURE_EXIT_CODE;
2057 else if (code == CLD_KILLED)
2058 f = SOCKET_FAILURE_SIGNAL;
2059 else if (code == CLD_DUMPED)
2060 f = SOCKET_FAILURE_CORE_DUMP;
2062 assert_not_reached("Unknown code");
2064 if (s->control_command) {
2065 exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
2067 if (s->control_command->ignore)
2071 log_full_unit(f == SOCKET_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
2073 "%s control process exited, code=%s status=%i",
2074 u->id, sigchld_code_to_string(code), status);
2076 if (f != SOCKET_SUCCESS)
2079 if (s->control_command &&
2080 s->control_command->command_next &&
2081 f == SOCKET_SUCCESS) {
2083 log_debug_unit(u->id,
2084 "%s running next command for state %s",
2085 u->id, socket_state_to_string(s->state));
2088 s->control_command = NULL;
2089 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
2091 /* No further commands for this step, so let's figure
2092 * out what to do next */
2094 log_debug_unit(u->id,
2095 "%s got final SIGCHLD for state %s",
2096 u->id, socket_state_to_string(s->state));
2100 case SOCKET_START_PRE:
2101 if (f == SOCKET_SUCCESS)
2102 socket_enter_start_post(s);
2104 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, f);
2107 case SOCKET_START_POST:
2108 if (f == SOCKET_SUCCESS)
2109 socket_enter_listening(s);
2111 socket_enter_stop_pre(s, f);
2114 case SOCKET_STOP_PRE:
2115 case SOCKET_STOP_PRE_SIGTERM:
2116 case SOCKET_STOP_PRE_SIGKILL:
2117 socket_enter_stop_post(s, f);
2120 case SOCKET_STOP_POST:
2121 case SOCKET_FINAL_SIGTERM:
2122 case SOCKET_FINAL_SIGKILL:
2123 socket_enter_dead(s, f);
2127 assert_not_reached("Uh, control process died at wrong time.");
2131 /* Notify clients about changed exit status */
2132 unit_add_to_dbus_queue(u);
2135 static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
2136 Socket *s = SOCKET(userdata);
2139 assert(s->timer_event_source == source);
2143 case SOCKET_START_PRE:
2144 log_warning_unit(UNIT(s)->id,
2145 "%s starting timed out. Terminating.", UNIT(s)->id);
2146 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2149 case SOCKET_START_POST:
2150 log_warning_unit(UNIT(s)->id,
2151 "%s starting timed out. Stopping.", UNIT(s)->id);
2152 socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
2155 case SOCKET_STOP_PRE:
2156 log_warning_unit(UNIT(s)->id,
2157 "%s stopping timed out. Terminating.", UNIT(s)->id);
2158 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2161 case SOCKET_STOP_PRE_SIGTERM:
2162 if (s->kill_context.send_sigkill) {
2163 log_warning_unit(UNIT(s)->id,
2164 "%s stopping timed out. Killing.", UNIT(s)->id);
2165 socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
2167 log_warning_unit(UNIT(s)->id,
2168 "%s stopping timed out. Skipping SIGKILL. Ignoring.",
2170 socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
2174 case SOCKET_STOP_PRE_SIGKILL:
2175 log_warning_unit(UNIT(s)->id,
2176 "%s still around after SIGKILL. Ignoring.", UNIT(s)->id);
2177 socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
2180 case SOCKET_STOP_POST:
2181 log_warning_unit(UNIT(s)->id,
2182 "%s stopping timed out (2). Terminating.", UNIT(s)->id);
2183 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2186 case SOCKET_FINAL_SIGTERM:
2187 if (s->kill_context.send_sigkill) {
2188 log_warning_unit(UNIT(s)->id,
2189 "%s stopping timed out (2). Killing.", UNIT(s)->id);
2190 socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
2192 log_warning_unit(UNIT(s)->id,
2193 "%s stopping timed out (2). Skipping SIGKILL. Ignoring.",
2195 socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
2199 case SOCKET_FINAL_SIGKILL:
2200 log_warning_unit(UNIT(s)->id,
2201 "%s still around after SIGKILL (2). Entering failed mode.",
2203 socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
2207 assert_not_reached("Timeout at wrong time.");
2213 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
2222 /* Called from the service code for requesting our fds */
2225 LIST_FOREACH(port, p, s->ports)
2235 if (!(rfds = new(int, rn_fds)))
2239 LIST_FOREACH(port, p, s->ports)
2243 assert(k == rn_fds);
2251 static void socket_reset_failed(Unit *u) {
2252 Socket *s = SOCKET(u);
2256 if (s->state == SOCKET_FAILED)
2257 socket_set_state(s, SOCKET_DEAD);
2259 s->result = SOCKET_SUCCESS;
2262 static void socket_notify_service_dead(Socket *s, bool failed_permanent) {
2265 /* The service is dead. Dang!
2267 * This is strictly for one-instance-for-all-connections
2270 if (s->state == SOCKET_RUNNING) {
2271 log_debug_unit(UNIT(s)->id, "%s got notified about service death (failed permanently: %s)", UNIT(s)->id, yes_no(failed_permanent));
2272 if (failed_permanent)
2273 socket_enter_stop_pre(s, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT);
2275 socket_enter_listening(s);
2279 void socket_connection_unref(Socket *s) {
2282 /* The service is dead. Yay!
2284 * This is strictly for one-instance-per-connection
2287 assert(s->n_connections > 0);
2290 log_debug_unit(UNIT(s)->id, "%s: One connection closed, %u left.", UNIT(s)->id, s->n_connections);
2293 static void socket_trigger_notify(Unit *u, Unit *other) {
2294 Socket *s = SOCKET(u);
2300 /* Don't propagate state changes from the service if we are
2301 already down or accepting connections */
2302 if ((s->state != SOCKET_RUNNING &&
2303 s->state != SOCKET_LISTENING) ||
2307 if (other->load_state != UNIT_LOADED ||
2308 other->type != UNIT_SERVICE)
2311 se = SERVICE(other);
2313 if (se->state == SERVICE_FAILED)
2314 socket_notify_service_dead(s, se->result == SERVICE_FAILURE_START_LIMIT);
2316 if (se->state == SERVICE_DEAD ||
2317 se->state == SERVICE_STOP ||
2318 se->state == SERVICE_STOP_SIGTERM ||
2319 se->state == SERVICE_STOP_SIGKILL ||
2320 se->state == SERVICE_STOP_POST ||
2321 se->state == SERVICE_FINAL_SIGTERM ||
2322 se->state == SERVICE_FINAL_SIGKILL ||
2323 se->state == SERVICE_AUTO_RESTART)
2324 socket_notify_service_dead(s, false);
2326 if (se->state == SERVICE_RUNNING)
2327 socket_set_state(s, SOCKET_RUNNING);
2330 static int socket_kill(Unit *u, KillWho who, int signo, sd_bus_error *error) {
2331 return unit_kill_common(u, who, signo, -1, SOCKET(u)->control_pid, error);
2334 static int socket_get_timeout(Unit *u, uint64_t *timeout) {
2335 Socket *s = SOCKET(u);
2338 if (!s->timer_event_source)
2341 r = sd_event_source_get_time(s->timer_event_source, timeout);
2348 static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
2349 [SOCKET_DEAD] = "dead",
2350 [SOCKET_START_PRE] = "start-pre",
2351 [SOCKET_START_POST] = "start-post",
2352 [SOCKET_LISTENING] = "listening",
2353 [SOCKET_RUNNING] = "running",
2354 [SOCKET_STOP_PRE] = "stop-pre",
2355 [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
2356 [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
2357 [SOCKET_STOP_POST] = "stop-post",
2358 [SOCKET_FINAL_SIGTERM] = "final-sigterm",
2359 [SOCKET_FINAL_SIGKILL] = "final-sigkill",
2360 [SOCKET_FAILED] = "failed"
2363 DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
2365 static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
2366 [SOCKET_EXEC_START_PRE] = "StartPre",
2367 [SOCKET_EXEC_START_POST] = "StartPost",
2368 [SOCKET_EXEC_STOP_PRE] = "StopPre",
2369 [SOCKET_EXEC_STOP_POST] = "StopPost"
2372 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
2374 static const char* const socket_result_table[_SOCKET_RESULT_MAX] = {
2375 [SOCKET_SUCCESS] = "success",
2376 [SOCKET_FAILURE_RESOURCES] = "resources",
2377 [SOCKET_FAILURE_TIMEOUT] = "timeout",
2378 [SOCKET_FAILURE_EXIT_CODE] = "exit-code",
2379 [SOCKET_FAILURE_SIGNAL] = "signal",
2380 [SOCKET_FAILURE_CORE_DUMP] = "core-dump",
2381 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT] = "service-failed-permanent"
2384 DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
2386 const UnitVTable socket_vtable = {
2387 .object_size = sizeof(Socket),
2388 .exec_context_offset = offsetof(Socket, exec_context),
2389 .cgroup_context_offset = offsetof(Socket, cgroup_context),
2390 .kill_context_offset = offsetof(Socket, kill_context),
2391 .exec_runtime_offset = offsetof(Socket, exec_runtime),
2397 .private_section = "Socket",
2399 .init = socket_init,
2400 .done = socket_done,
2401 .load = socket_load,
2403 .coldplug = socket_coldplug,
2405 .dump = socket_dump,
2407 .start = socket_start,
2408 .stop = socket_stop,
2410 .kill = socket_kill,
2412 .get_timeout = socket_get_timeout,
2414 .serialize = socket_serialize,
2415 .deserialize_item = socket_deserialize_item,
2416 .distribute_fds = socket_distribute_fds,
2418 .active_state = socket_active_state,
2419 .sub_state_to_string = socket_sub_state_to_string,
2421 .check_gc = socket_check_gc,
2423 .sigchld_event = socket_sigchld_event,
2425 .trigger_notify = socket_trigger_notify,
2427 .reset_failed = socket_reset_failed,
2429 .bus_interface = "org.freedesktop.systemd1.Socket",
2430 .bus_vtable = bus_socket_vtable,
2431 .bus_set_property = bus_socket_set_property,
2432 .bus_commit_properties = bus_socket_commit_properties,
2434 .status_message_formats = {
2435 /*.starting_stopping = {
2436 [0] = "Starting socket %s...",
2437 [1] = "Stopping socket %s...",
2439 .finished_start_job = {
2440 [JOB_DONE] = "Listening on %s.",
2441 [JOB_FAILED] = "Failed to listen on %s.",
2442 [JOB_DEPENDENCY] = "Dependency failed for %s.",
2443 [JOB_TIMEOUT] = "Timed out starting %s.",
2445 .finished_stop_job = {
2446 [JOB_DONE] = "Closed %s.",
2447 [JOB_FAILED] = "Failed stopping %s.",
2448 [JOB_TIMEOUT] = "Timed out stopping %s.",