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>
31 #include <attr/xattr.h>
35 #include "netinet/tcp.h"
37 #include "load-dropin.h"
38 #include "load-fragment.h"
41 #include "path-util.h"
42 #include "unit-name.h"
43 #include "unit-printf.h"
44 #include "dbus-socket.h"
47 #include "bus-errors.h"
49 #include "exit-status.h"
52 static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
53 [SOCKET_DEAD] = UNIT_INACTIVE,
54 [SOCKET_START_PRE] = UNIT_ACTIVATING,
55 [SOCKET_START_POST] = UNIT_ACTIVATING,
56 [SOCKET_LISTENING] = UNIT_ACTIVE,
57 [SOCKET_RUNNING] = UNIT_ACTIVE,
58 [SOCKET_STOP_PRE] = UNIT_DEACTIVATING,
59 [SOCKET_STOP_PRE_SIGTERM] = UNIT_DEACTIVATING,
60 [SOCKET_STOP_PRE_SIGKILL] = UNIT_DEACTIVATING,
61 [SOCKET_STOP_POST] = UNIT_DEACTIVATING,
62 [SOCKET_FINAL_SIGTERM] = UNIT_DEACTIVATING,
63 [SOCKET_FINAL_SIGKILL] = UNIT_DEACTIVATING,
64 [SOCKET_FAILED] = UNIT_FAILED
67 static void socket_init(Unit *u) {
68 Socket *s = SOCKET(u);
71 assert(u->load_state == UNIT_STUB);
73 s->backlog = SOMAXCONN;
74 s->timeout_usec = DEFAULT_TIMEOUT_USEC;
75 s->directory_mode = 0755;
76 s->socket_mode = 0666;
78 s->max_connections = 64;
85 exec_context_init(&s->exec_context);
86 s->exec_context.std_output = u->manager->default_std_output;
87 s->exec_context.std_error = u->manager->default_std_error;
88 kill_context_init(&s->kill_context);
90 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
93 static void socket_unwatch_control_pid(Socket *s) {
96 if (s->control_pid <= 0)
99 unit_unwatch_pid(UNIT(s), s->control_pid);
103 static void socket_done(Unit *u) {
104 Socket *s = SOCKET(u);
109 while ((p = s->ports)) {
110 LIST_REMOVE(SocketPort, port, s->ports, p);
113 unit_unwatch_fd(UNIT(s), &p->fd_watch);
114 close_nointr_nofail(p->fd);
121 exec_context_done(&s->exec_context);
122 exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
123 s->control_command = NULL;
125 socket_unwatch_control_pid(s);
127 unit_ref_unset(&s->service);
129 free(s->tcp_congestion);
130 s->tcp_congestion = NULL;
132 free(s->bind_to_device);
133 s->bind_to_device = NULL;
136 free(s->smack_ip_in);
137 free(s->smack_ip_out);
139 free(s->socket_user);
140 s->socket_user = NULL;
142 free(s->socket_group);
143 s->socket_group = NULL;
145 unit_unwatch_timer(u, &s->timer_watch);
148 static int socket_instantiate_service(Socket *s) {
155 /* This fills in s->service if it isn't filled in yet. For
156 * Accept=yes sockets we create the next connection service
157 * here. For Accept=no this is mostly a NOP since the service
158 * is figured out at load time anyway. */
160 if (UNIT_DEREF(s->service))
165 if (!(prefix = unit_name_to_prefix(UNIT(s)->id)))
168 r = asprintf(&name, "%s@%u.service", prefix, s->n_accepted);
174 r = manager_load_unit(UNIT(s)->manager, name, NULL, NULL, &u);
180 #ifdef HAVE_SYSV_COMPAT
181 if (SERVICE(u)->is_sysv) {
182 log_error("Using SysV services for socket activation is not supported. Refusing.");
188 unit_ref_set(&s->service, u);
190 return unit_add_two_dependencies(UNIT(s), UNIT_BEFORE, UNIT_TRIGGERS, u, false);
193 static bool have_non_accept_socket(Socket *s) {
201 LIST_FOREACH(port, p, s->ports) {
203 if (p->type != SOCKET_SOCKET)
206 if (!socket_address_can_accept(&p->address))
213 static int socket_verify(Socket *s) {
216 if (UNIT(s)->load_state != UNIT_LOADED)
220 log_error("%s lacks Listen setting. Refusing.", UNIT(s)->id);
224 if (s->accept && have_non_accept_socket(s)) {
225 log_error("%s configured for accepting sockets, but sockets are non-accepting. Refusing.", UNIT(s)->id);
229 if (s->accept && s->max_connections <= 0) {
230 log_error("%s's MaxConnection setting too small. Refusing.", UNIT(s)->id);
234 if (s->accept && UNIT_DEREF(s->service)) {
235 log_error("Explicit service configuration for accepting sockets not supported on %s. Refusing.", UNIT(s)->id);
239 if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
240 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
247 static bool socket_needs_mount(Socket *s, const char *prefix) {
252 LIST_FOREACH(port, p, s->ports) {
254 if (p->type == SOCKET_SOCKET) {
255 if (socket_address_needs_mount(&p->address, prefix))
257 } else if (p->type == SOCKET_FIFO || p->type == SOCKET_SPECIAL) {
258 if (path_startswith(p->path, prefix))
266 int socket_add_one_mount_link(Socket *s, Mount *m) {
272 if (UNIT(s)->load_state != UNIT_LOADED ||
273 UNIT(m)->load_state != UNIT_LOADED)
276 if (!socket_needs_mount(s, m->where))
279 r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
286 static int socket_add_mount_links(Socket *s) {
292 LIST_FOREACH(units_by_type, other, UNIT(s)->manager->units_by_type[UNIT_MOUNT]) {
293 r = socket_add_one_mount_link(s, MOUNT(other));
301 static int socket_add_device_link(Socket *s) {
307 if (!s->bind_to_device)
310 if (asprintf(&t, "/sys/subsystem/net/devices/%s", s->bind_to_device) < 0)
313 r = unit_add_node_link(UNIT(s), t, false);
319 static int socket_add_default_dependencies(Socket *s) {
323 if (UNIT(s)->manager->running_as == SYSTEMD_SYSTEM) {
324 if ((r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, NULL, true)) < 0)
327 if ((r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true)) < 0)
331 return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
334 static bool socket_has_exec(Socket *s) {
338 for (i = 0; i < _SOCKET_EXEC_COMMAND_MAX; i++)
339 if (s->exec_command[i])
345 static int socket_load(Unit *u) {
346 Socket *s = SOCKET(u);
350 assert(u->load_state == UNIT_STUB);
352 if ((r = unit_load_fragment_and_dropin(u)) < 0)
355 /* This is a new unit? Then let's add in some extras */
356 if (u->load_state == UNIT_LOADED) {
358 if (have_non_accept_socket(s)) {
360 if (!UNIT_DEREF(s->service)) {
363 r = unit_load_related_unit(u, ".service", &x);
367 unit_ref_set(&s->service, x);
370 r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(s->service), true);
375 if ((r = socket_add_mount_links(s)) < 0)
378 if ((r = socket_add_device_link(s)) < 0)
381 if (socket_has_exec(s))
382 if ((r = unit_add_exec_dependencies(u, &s->exec_context)) < 0)
385 if ((r = unit_add_default_cgroups(u)) < 0)
388 if (UNIT(s)->default_dependencies)
389 if ((r = socket_add_default_dependencies(s)) < 0)
392 r = unit_exec_context_defaults(u, &s->exec_context);
397 return socket_verify(s);
400 static const char* listen_lookup(int family, int type) {
402 if (family == AF_NETLINK)
403 return "ListenNetlink";
405 if (type == SOCK_STREAM)
406 return "ListenStream";
407 else if (type == SOCK_DGRAM)
408 return "ListenDatagram";
409 else if (type == SOCK_SEQPACKET)
410 return "ListenSequentialPacket";
412 assert_not_reached("Unknown socket type");
416 static void socket_dump(Unit *u, FILE *f, const char *prefix) {
419 Socket *s = SOCKET(u);
427 p2 = strappend(prefix, "\t");
428 prefix2 = p2 ? p2 : prefix;
431 "%sSocket State: %s\n"
433 "%sBindIPv6Only: %s\n"
435 "%sSocketMode: %04o\n"
436 "%sDirectoryMode: %04o\n"
439 "%sTransparent: %s\n"
441 "%sPassCredentials: %s\n"
442 "%sPassSecurity: %s\n"
443 "%sTCPCongestion: %s\n",
444 prefix, socket_state_to_string(s->state),
445 prefix, socket_result_to_string(s->result),
446 prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only),
448 prefix, s->socket_mode,
449 prefix, s->directory_mode,
450 prefix, yes_no(s->keep_alive),
451 prefix, yes_no(s->free_bind),
452 prefix, yes_no(s->transparent),
453 prefix, yes_no(s->broadcast),
454 prefix, yes_no(s->pass_cred),
455 prefix, yes_no(s->pass_sec),
456 prefix, strna(s->tcp_congestion));
468 if (s->control_pid > 0)
470 "%sControl PID: %lu\n",
471 prefix, (unsigned long) s->control_pid);
473 if (s->bind_to_device)
475 "%sBindToDevice: %s\n",
476 prefix, s->bind_to_device);
481 "%sNConnections: %u\n"
482 "%sMaxConnections: %u\n",
483 prefix, s->n_accepted,
484 prefix, s->n_connections,
485 prefix, s->max_connections);
487 if (s->priority >= 0)
490 prefix, s->priority);
492 if (s->receive_buffer > 0)
494 "%sReceiveBuffer: %zu\n",
495 prefix, s->receive_buffer);
497 if (s->send_buffer > 0)
499 "%sSendBuffer: %zu\n",
500 prefix, s->send_buffer);
512 if (s->pipe_size > 0)
515 prefix, s->pipe_size);
522 if (s->mq_maxmsg > 0)
524 "%sMessageQueueMaxMessages: %li\n",
525 prefix, s->mq_maxmsg);
527 if (s->mq_msgsize > 0)
529 "%sMessageQueueMessageSize: %li\n",
530 prefix, s->mq_msgsize);
534 "%sSmackLabel: %s\n",
539 "%sSmackLabelIPIn: %s\n",
540 prefix, s->smack_ip_in);
544 "%sSmackLabelIPOut: %s\n",
545 prefix, s->smack_ip_out);
547 LIST_FOREACH(port, p, s->ports) {
549 if (p->type == SOCKET_SOCKET) {
554 if ((r = socket_address_print(&p->address, &k)) < 0)
559 fprintf(f, "%s%s: %s\n", prefix, listen_lookup(socket_address_family(&p->address), p->address.type), t);
561 } else if (p->type == SOCKET_SPECIAL)
562 fprintf(f, "%sListenSpecial: %s\n", prefix, p->path);
563 else if (p->type == SOCKET_MQUEUE)
564 fprintf(f, "%sListenMessageQueue: %s\n", prefix, p->path);
566 fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
569 exec_context_dump(&s->exec_context, f, prefix);
570 kill_context_dump(&s->kill_context, f, prefix);
572 for (c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
573 if (!s->exec_command[c])
576 fprintf(f, "%s-> %s:\n",
577 prefix, socket_exec_command_to_string(c));
579 exec_command_dump_list(s->exec_command[c], f, prefix2);
585 static int instance_from_socket(int fd, unsigned nr, char **instance) {
590 struct sockaddr_un un;
591 struct sockaddr_in in;
592 struct sockaddr_in6 in6;
593 struct sockaddr_storage storage;
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 if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &l) < 0)
671 (unsigned long) ucred.pid,
672 (unsigned long) ucred.uid) < 0)
679 assert_not_reached("Unhandled socket type.");
686 static void socket_close_fds(Socket *s) {
691 LIST_FOREACH(port, p, s->ports) {
695 unit_unwatch_fd(UNIT(s), &p->fd_watch);
696 close_nointr_nofail(p->fd);
698 /* One little note: we should never delete any sockets
699 * in the file system here! After all some other
700 * process we spawned might still have a reference of
701 * this fd and wants to continue to use it. Therefore
702 * we delete sockets in the file system before we
703 * create a new one, not after we stopped using
710 static void socket_apply_socket_options(Socket *s, int fd) {
718 int b = s->keep_alive;
719 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &b, sizeof(b)) < 0)
720 log_warning("SO_KEEPALIVE failed: %m");
725 if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)) < 0)
726 log_warning("SO_BROADCAST failed: %m");
731 if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0)
732 log_warning("SO_PASSCRED failed: %m");
737 if (setsockopt(fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one)) < 0)
738 log_warning("SO_PASSSEC failed: %m");
741 if (s->priority >= 0)
742 if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &s->priority, sizeof(s->priority)) < 0)
743 log_warning("SO_PRIORITY failed: %m");
745 if (s->receive_buffer > 0) {
746 int value = (int) s->receive_buffer;
748 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
750 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof(value)) < 0)
751 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0)
752 log_warning("SO_RCVBUF failed: %m");
755 if (s->send_buffer > 0) {
756 int value = (int) s->send_buffer;
757 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof(value)) < 0)
758 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0)
759 log_warning("SO_SNDBUF failed: %m");
763 if (setsockopt(fd, SOL_SOCKET, SO_MARK, &s->mark, sizeof(s->mark)) < 0)
764 log_warning("SO_MARK failed: %m");
767 if (setsockopt(fd, IPPROTO_IP, IP_TOS, &s->ip_tos, sizeof(s->ip_tos)) < 0)
768 log_warning("IP_TOS failed: %m");
770 if (s->ip_ttl >= 0) {
773 r = setsockopt(fd, IPPROTO_IP, IP_TTL, &s->ip_ttl, sizeof(s->ip_ttl));
775 if (socket_ipv6_is_supported())
776 x = setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &s->ip_ttl, sizeof(s->ip_ttl));
779 errno = EAFNOSUPPORT;
783 log_warning("IP_TTL/IPV6_UNICAST_HOPS failed: %m");
786 if (s->tcp_congestion)
787 if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
788 log_warning("TCP_CONGESTION failed: %m");
791 if (fsetxattr(fd, "security.SMACK64IPIN", s->smack_ip_in, strlen(s->smack_ip_in), 0) < 0)
792 log_error("fsetxattr(\"security.SMACK64IPIN\"): %m");
795 if (fsetxattr(fd, "security.SMACK64IPOUT", s->smack_ip_out, strlen(s->smack_ip_out), 0) < 0)
796 log_error("fsetxattr(\"security.SMACK64IPOUT\"): %m");
798 if (s->socket_user &&
799 get_user_creds((const char **)&s->socket_user, &uid,
800 NULL, NULL, NULL) < 0) {
801 log_warning("failed to lookup user: %s", s->socket_user);
804 if (s->socket_group &&
805 get_group_creds((const char **)&s->socket_group, &gid) < 0) {
806 log_warning("failed to lookup group: %s", s->socket_group);
809 if ((uid != 0 || gid != 0) && fchown(fd, uid, gid) < 0) {
810 log_warning("failed to change ownership of socket");
814 static void socket_apply_fifo_options(Socket *s, int fd) {
818 if (s->pipe_size > 0)
819 if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
820 log_warning("F_SETPIPE_SZ: %m");
823 if (fsetxattr(fd, "security.SMACK64", s->smack, strlen(s->smack), 0) < 0)
824 log_error("fsetxattr(\"security.SMACK64\"): %m");
827 static int fifo_address_create(
829 mode_t directory_mode,
831 const char *socket_user,
832 const char *socket_group,
844 mkdir_parents_label(path, directory_mode);
846 r = label_context_set(path, S_IFIFO);
850 /* Enforce the right access mode for the fifo */
851 old_mask = umask(~ socket_mode);
853 /* Include the original umask in our mask */
854 umask(~socket_mode | old_mask);
856 r = mkfifo(path, socket_mode);
859 if (r < 0 && errno != EEXIST) {
864 fd = open(path, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW);
870 label_context_clear();
872 if (fstat(fd, &st) < 0) {
878 get_user_creds(&socket_user, &uid, NULL, NULL, NULL) < 0) {
880 log_error("failed to lookup user: %s", socket_user);
885 get_group_creds(&socket_group, &gid) < 0) {
887 log_error("failed to lookup group: %s", socket_group);
891 if (!S_ISFIFO(st.st_mode) ||
892 (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
900 if ((uid != 0 || gid != 0) && fchown(fd, uid, gid) < 0) {
902 log_error("failed to changed ownership of FIFO: %s", path);
910 label_context_clear();
913 close_nointr_nofail(fd);
918 static int special_address_create(
928 if ((fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW)) < 0) {
933 if (fstat(fd, &st) < 0) {
938 /* Check whether this is a /proc, /sys or /dev file or char device */
939 if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
949 close_nointr_nofail(fd);
954 static int mq_address_create(
964 struct mq_attr _attr, *attr = NULL;
969 if (maxmsg > 0 && msgsize > 0) {
971 _attr.mq_flags = O_NONBLOCK;
972 _attr.mq_maxmsg = maxmsg;
973 _attr.mq_msgsize = msgsize;
977 /* Enforce the right access mode for the mq */
978 old_mask = umask(~ mq_mode);
980 /* Include the original umask in our mask */
981 umask(~mq_mode | old_mask);
983 fd = mq_open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_CREAT, mq_mode, attr);
991 if (fstat(fd, &st) < 0) {
996 if ((st.st_mode & 0777) != (mq_mode & ~old_mask) ||
997 st.st_uid != getuid() ||
998 st.st_gid != getgid()) {
1009 close_nointr_nofail(fd);
1014 static int socket_open_fds(Socket *s) {
1018 bool know_label = false;
1022 LIST_FOREACH(port, p, s->ports) {
1027 if (p->type == SOCKET_SOCKET) {
1031 if ((r = socket_instantiate_service(s)) < 0)
1034 if (UNIT_DEREF(s->service) &&
1035 SERVICE(UNIT_DEREF(s->service))->exec_command[SERVICE_EXEC_START]) {
1036 r = label_get_create_label_from_exe(SERVICE(UNIT_DEREF(s->service))->exec_command[SERVICE_EXEC_START]->path, &label);
1047 if ((r = socket_address_listen(
1060 socket_apply_socket_options(s, p->fd);
1062 } else if (p->type == SOCKET_SPECIAL) {
1064 if ((r = special_address_create(
1069 } else if (p->type == SOCKET_FIFO) {
1071 if ((r = fifo_address_create(
1080 socket_apply_fifo_options(s, p->fd);
1081 } else if (p->type == SOCKET_MQUEUE) {
1083 if ((r = mq_address_create(
1091 assert_not_reached("Unknown port type");
1098 socket_close_fds(s);
1103 static void socket_unwatch_fds(Socket *s) {
1108 LIST_FOREACH(port, p, s->ports) {
1112 unit_unwatch_fd(UNIT(s), &p->fd_watch);
1116 static int socket_watch_fds(Socket *s) {
1122 LIST_FOREACH(port, p, s->ports) {
1126 p->fd_watch.socket_accept =
1128 p->type == SOCKET_SOCKET &&
1129 socket_address_can_accept(&p->address);
1131 if ((r = unit_watch_fd(UNIT(s), p->fd, EPOLLIN, &p->fd_watch)) < 0)
1138 socket_unwatch_fds(s);
1142 static void socket_set_state(Socket *s, SocketState state) {
1143 SocketState old_state;
1146 old_state = s->state;
1149 if (state != SOCKET_START_PRE &&
1150 state != SOCKET_START_POST &&
1151 state != SOCKET_STOP_PRE &&
1152 state != SOCKET_STOP_PRE_SIGTERM &&
1153 state != SOCKET_STOP_PRE_SIGKILL &&
1154 state != SOCKET_STOP_POST &&
1155 state != SOCKET_FINAL_SIGTERM &&
1156 state != SOCKET_FINAL_SIGKILL) {
1157 unit_unwatch_timer(UNIT(s), &s->timer_watch);
1158 socket_unwatch_control_pid(s);
1159 s->control_command = NULL;
1160 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
1163 if (state != SOCKET_LISTENING)
1164 socket_unwatch_fds(s);
1166 if (state != SOCKET_START_POST &&
1167 state != SOCKET_LISTENING &&
1168 state != SOCKET_RUNNING &&
1169 state != SOCKET_STOP_PRE &&
1170 state != SOCKET_STOP_PRE_SIGTERM &&
1171 state != SOCKET_STOP_PRE_SIGKILL)
1172 socket_close_fds(s);
1174 if (state != old_state)
1175 log_debug("%s changed %s -> %s",
1177 socket_state_to_string(old_state),
1178 socket_state_to_string(state));
1180 unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true);
1183 static int socket_coldplug(Unit *u) {
1184 Socket *s = SOCKET(u);
1188 assert(s->state == SOCKET_DEAD);
1190 if (s->deserialized_state != s->state) {
1192 if (s->deserialized_state == SOCKET_START_PRE ||
1193 s->deserialized_state == SOCKET_START_POST ||
1194 s->deserialized_state == SOCKET_STOP_PRE ||
1195 s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
1196 s->deserialized_state == SOCKET_STOP_PRE_SIGKILL ||
1197 s->deserialized_state == SOCKET_STOP_POST ||
1198 s->deserialized_state == SOCKET_FINAL_SIGTERM ||
1199 s->deserialized_state == SOCKET_FINAL_SIGKILL) {
1201 if (s->control_pid <= 0)
1204 if ((r = unit_watch_pid(UNIT(s), s->control_pid)) < 0)
1207 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
1211 if (s->deserialized_state == SOCKET_START_POST ||
1212 s->deserialized_state == SOCKET_LISTENING ||
1213 s->deserialized_state == SOCKET_RUNNING ||
1214 s->deserialized_state == SOCKET_STOP_PRE ||
1215 s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
1216 s->deserialized_state == SOCKET_STOP_PRE_SIGKILL)
1217 if ((r = socket_open_fds(s)) < 0)
1220 if (s->deserialized_state == SOCKET_LISTENING)
1221 if ((r = socket_watch_fds(s)) < 0)
1224 socket_set_state(s, s->deserialized_state);
1230 static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
1239 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
1242 if (!(argv = unit_full_printf_strv(UNIT(s), c->argv))) {
1251 UNIT(s)->manager->environment,
1255 UNIT(s)->manager->confirm_spawn,
1256 UNIT(s)->cgroup_bondings,
1257 UNIT(s)->cgroup_attributes,
1267 if ((r = unit_watch_pid(UNIT(s), pid)) < 0)
1268 /* FIXME: we need to do something here */
1276 unit_unwatch_timer(UNIT(s), &s->timer_watch);
1281 static void socket_enter_dead(Socket *s, SocketResult f) {
1284 if (f != SOCKET_SUCCESS)
1287 socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
1290 static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
1292 static void socket_enter_stop_post(Socket *s, SocketResult f) {
1296 if (f != SOCKET_SUCCESS)
1299 socket_unwatch_control_pid(s);
1301 s->control_command_id = SOCKET_EXEC_STOP_POST;
1303 if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST])) {
1304 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1307 socket_set_state(s, SOCKET_STOP_POST);
1309 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_SUCCESS);
1314 log_warning("%s failed to run 'stop-post' task: %s", UNIT(s)->id, strerror(-r));
1315 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
1318 static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
1320 Set *pid_set = NULL;
1321 bool wait_for_exit = false;
1325 if (f != SOCKET_SUCCESS)
1328 if (s->kill_context.kill_mode != KILL_NONE) {
1329 int sig = (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_FINAL_SIGTERM) ? s->kill_context.kill_signal : SIGKILL;
1331 if (s->control_pid > 0) {
1332 if (kill_and_sigcont(s->control_pid, sig) < 0 && errno != ESRCH)
1334 log_warning("Failed to kill control process %li: %m", (long) s->control_pid);
1336 wait_for_exit = true;
1339 if (s->kill_context.kill_mode == KILL_CONTROL_GROUP) {
1341 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
1346 /* Exclude the control pid from being killed via the cgroup */
1347 if (s->control_pid > 0)
1348 if ((r = set_put(pid_set, LONG_TO_PTR(s->control_pid))) < 0)
1351 r = cgroup_bonding_kill_list(UNIT(s)->cgroup_bondings, sig, true, false, pid_set, NULL);
1353 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
1354 log_warning("Failed to kill control group: %s", strerror(-r));
1356 wait_for_exit = true;
1363 if (wait_for_exit) {
1364 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
1367 socket_set_state(s, state);
1368 } else if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
1369 socket_enter_stop_post(s, SOCKET_SUCCESS);
1371 socket_enter_dead(s, SOCKET_SUCCESS);
1376 log_warning("%s failed to kill processes: %s", UNIT(s)->id, strerror(-r));
1378 if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
1379 socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
1381 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1387 static void socket_enter_stop_pre(Socket *s, SocketResult f) {
1391 if (f != SOCKET_SUCCESS)
1394 socket_unwatch_control_pid(s);
1396 s->control_command_id = SOCKET_EXEC_STOP_PRE;
1398 if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE])) {
1399 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1402 socket_set_state(s, SOCKET_STOP_PRE);
1404 socket_enter_stop_post(s, SOCKET_SUCCESS);
1409 log_warning("%s failed to run 'stop-pre' task: %s", UNIT(s)->id, strerror(-r));
1410 socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
1413 static void socket_enter_listening(Socket *s) {
1417 r = socket_watch_fds(s);
1419 log_warning("%s failed to watch sockets: %s", UNIT(s)->id, strerror(-r));
1423 socket_set_state(s, SOCKET_LISTENING);
1427 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1430 static void socket_enter_start_post(Socket *s) {
1434 r = socket_open_fds(s);
1436 log_warning("%s failed to listen on sockets: %s", UNIT(s)->id, strerror(-r));
1440 socket_unwatch_control_pid(s);
1442 s->control_command_id = SOCKET_EXEC_START_POST;
1444 if ((s->control_command = s->exec_command[SOCKET_EXEC_START_POST])) {
1445 r = socket_spawn(s, s->control_command, &s->control_pid);
1447 log_warning("%s failed to run 'start-post' task: %s", UNIT(s)->id, strerror(-r));
1451 socket_set_state(s, SOCKET_START_POST);
1453 socket_enter_listening(s);
1458 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1461 static void socket_enter_start_pre(Socket *s) {
1465 socket_unwatch_control_pid(s);
1467 s->control_command_id = SOCKET_EXEC_START_PRE;
1469 if ((s->control_command = s->exec_command[SOCKET_EXEC_START_PRE])) {
1470 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1473 socket_set_state(s, SOCKET_START_PRE);
1475 socket_enter_start_post(s);
1480 log_warning("%s failed to run 'start-pre' task: %s", UNIT(s)->id, strerror(-r));
1481 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1484 static void socket_enter_running(Socket *s, int cfd) {
1489 dbus_error_init(&error);
1491 /* We don't take connections anymore if we are supposed to
1492 * shut down anyway */
1493 if (unit_pending_inactive(UNIT(s))) {
1494 log_debug("Suppressing connection request on %s since unit stop is scheduled.", UNIT(s)->id);
1497 close_nointr_nofail(cfd);
1499 /* Flush all sockets by closing and reopening them */
1500 socket_close_fds(s);
1502 r = socket_watch_fds(s);
1504 log_warning("%s failed to watch sockets: %s", UNIT(s)->id, strerror(-r));
1505 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1515 bool pending = false;
1517 /* If there's already a start pending don't bother to
1519 SET_FOREACH(u, UNIT(s)->dependencies[UNIT_TRIGGERS], i)
1520 if (unit_pending_active(u)) {
1526 r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, true, &error, NULL);
1531 socket_set_state(s, SOCKET_RUNNING);
1533 char *prefix, *instance = NULL, *name;
1536 if (s->n_connections >= s->max_connections) {
1537 log_warning("Too many incoming connections (%u)", s->n_connections);
1538 close_nointr_nofail(cfd);
1542 r = socket_instantiate_service(s);
1546 r = instance_from_socket(cfd, s->n_accepted, &instance);
1551 /* ENOTCONN is legitimate if TCP RST was received.
1552 * This connection is over, but the socket unit lives on. */
1553 close_nointr_nofail(cfd);
1557 prefix = unit_name_to_prefix(UNIT(s)->id);
1564 name = unit_name_build(prefix, instance, ".service");
1573 r = unit_add_name(UNIT_DEREF(s->service), name);
1579 service = SERVICE(UNIT_DEREF(s->service));
1580 unit_ref_unset(&s->service);
1583 UNIT(service)->no_gc = false;
1585 unit_choose_id(UNIT(service), name);
1588 r = service_set_socket_fd(service, cfd, s);
1593 s->n_connections ++;
1595 r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT(service), JOB_REPLACE, true, &error, NULL);
1599 /* Notify clients about changed counters */
1600 unit_add_to_dbus_queue(UNIT(s));
1606 log_warning("%s failed to queue socket startup job: %s", UNIT(s)->id, bus_error(&error, r));
1607 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1610 close_nointr_nofail(cfd);
1612 dbus_error_free(&error);
1615 static void socket_run_next(Socket *s) {
1619 assert(s->control_command);
1620 assert(s->control_command->command_next);
1622 socket_unwatch_control_pid(s);
1624 s->control_command = s->control_command->command_next;
1626 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1632 log_warning("%s failed to run next task: %s", UNIT(s)->id, strerror(-r));
1634 if (s->state == SOCKET_START_POST)
1635 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1636 else if (s->state == SOCKET_STOP_POST)
1637 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1639 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
1642 static int socket_start(Unit *u) {
1643 Socket *s = SOCKET(u);
1647 /* We cannot fulfill this request right now, try again later
1649 if (s->state == SOCKET_STOP_PRE ||
1650 s->state == SOCKET_STOP_PRE_SIGKILL ||
1651 s->state == SOCKET_STOP_PRE_SIGTERM ||
1652 s->state == SOCKET_STOP_POST ||
1653 s->state == SOCKET_FINAL_SIGTERM ||
1654 s->state == SOCKET_FINAL_SIGKILL)
1657 if (s->state == SOCKET_START_PRE ||
1658 s->state == SOCKET_START_POST)
1661 /* Cannot run this without the service being around */
1662 if (UNIT_DEREF(s->service)) {
1665 service = SERVICE(UNIT_DEREF(s->service));
1667 if (UNIT(service)->load_state != UNIT_LOADED) {
1668 log_error("Socket service %s not loaded, refusing.", UNIT(service)->id);
1672 /* If the service is already active we cannot start the
1674 if (service->state != SERVICE_DEAD &&
1675 service->state != SERVICE_FAILED &&
1676 service->state != SERVICE_AUTO_RESTART) {
1677 log_error("Socket service %s already active, refusing.", UNIT(service)->id);
1681 #ifdef HAVE_SYSV_COMPAT
1682 if (service->is_sysv) {
1683 log_error("Using SysV services for socket activation is not supported. Refusing.");
1689 assert(s->state == SOCKET_DEAD || s->state == SOCKET_FAILED);
1691 s->result = SOCKET_SUCCESS;
1692 socket_enter_start_pre(s);
1696 static int socket_stop(Unit *u) {
1697 Socket *s = SOCKET(u);
1702 if (s->state == SOCKET_STOP_PRE ||
1703 s->state == SOCKET_STOP_PRE_SIGTERM ||
1704 s->state == SOCKET_STOP_PRE_SIGKILL ||
1705 s->state == SOCKET_STOP_POST ||
1706 s->state == SOCKET_FINAL_SIGTERM ||
1707 s->state == SOCKET_FINAL_SIGKILL)
1710 /* If there's already something running we go directly into
1712 if (s->state == SOCKET_START_PRE ||
1713 s->state == SOCKET_START_POST) {
1714 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
1718 assert(s->state == SOCKET_LISTENING || s->state == SOCKET_RUNNING);
1720 socket_enter_stop_pre(s, SOCKET_SUCCESS);
1724 static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
1725 Socket *s = SOCKET(u);
1733 unit_serialize_item(u, f, "state", socket_state_to_string(s->state));
1734 unit_serialize_item(u, f, "result", socket_result_to_string(s->result));
1735 unit_serialize_item_format(u, f, "n-accepted", "%u", s->n_accepted);
1737 if (s->control_pid > 0)
1738 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid);
1740 if (s->control_command_id >= 0)
1741 unit_serialize_item(u, f, "control-command", socket_exec_command_to_string(s->control_command_id));
1743 LIST_FOREACH(port, p, s->ports) {
1749 if ((copy = fdset_put_dup(fds, p->fd)) < 0)
1752 if (p->type == SOCKET_SOCKET) {
1755 if ((r = socket_address_print(&p->address, &t)) < 0)
1758 if (socket_address_family(&p->address) == AF_NETLINK)
1759 unit_serialize_item_format(u, f, "netlink", "%i %s", copy, t);
1761 unit_serialize_item_format(u, f, "socket", "%i %i %s", copy, p->address.type, t);
1763 } else if (p->type == SOCKET_SPECIAL)
1764 unit_serialize_item_format(u, f, "special", "%i %s", copy, p->path);
1766 assert(p->type == SOCKET_FIFO);
1767 unit_serialize_item_format(u, f, "fifo", "%i %s", copy, p->path);
1774 static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1775 Socket *s = SOCKET(u);
1782 if (streq(key, "state")) {
1785 if ((state = socket_state_from_string(value)) < 0)
1786 log_debug("Failed to parse state value %s", value);
1788 s->deserialized_state = state;
1789 } else if (streq(key, "result")) {
1792 f = socket_result_from_string(value);
1794 log_debug("Failed to parse result value %s", value);
1795 else if (f != SOCKET_SUCCESS)
1798 } else if (streq(key, "n-accepted")) {
1801 if (safe_atou(value, &k) < 0)
1802 log_debug("Failed to parse n-accepted value %s", value);
1805 } else if (streq(key, "control-pid")) {
1808 if (parse_pid(value, &pid) < 0)
1809 log_debug("Failed to parse control-pid value %s", value);
1811 s->control_pid = pid;
1812 } else if (streq(key, "control-command")) {
1813 SocketExecCommand id;
1815 if ((id = socket_exec_command_from_string(value)) < 0)
1816 log_debug("Failed to parse exec-command value %s", value);
1818 s->control_command_id = id;
1819 s->control_command = s->exec_command[id];
1821 } else if (streq(key, "fifo")) {
1825 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1826 log_debug("Failed to parse fifo value %s", value);
1829 LIST_FOREACH(port, p, s->ports)
1830 if (p->type == SOCKET_FIFO &&
1831 streq_ptr(p->path, value+skip))
1836 close_nointr_nofail(p->fd);
1837 p->fd = fdset_remove(fds, fd);
1841 } else if (streq(key, "special")) {
1845 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1846 log_debug("Failed to parse special value %s", value);
1849 LIST_FOREACH(port, p, s->ports)
1850 if (p->type == SOCKET_SPECIAL &&
1851 streq_ptr(p->path, value+skip))
1856 close_nointr_nofail(p->fd);
1857 p->fd = fdset_remove(fds, fd);
1861 } else if (streq(key, "socket")) {
1862 int fd, type, skip = 0;
1865 if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd))
1866 log_debug("Failed to parse socket value %s", value);
1869 LIST_FOREACH(port, p, s->ports)
1870 if (socket_address_is(&p->address, value+skip, type))
1875 close_nointr_nofail(p->fd);
1876 p->fd = fdset_remove(fds, fd);
1880 } else if (streq(key, "netlink")) {
1884 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1885 log_debug("Failed to parse socket value %s", value);
1888 LIST_FOREACH(port, p, s->ports)
1889 if (socket_address_is_netlink(&p->address, value+skip))
1894 close_nointr_nofail(p->fd);
1895 p->fd = fdset_remove(fds, fd);
1900 log_debug("Unknown serialization key '%s'", key);
1905 static UnitActiveState socket_active_state(Unit *u) {
1908 return state_translation_table[SOCKET(u)->state];
1911 static const char *socket_sub_state_to_string(Unit *u) {
1914 return socket_state_to_string(SOCKET(u)->state);
1917 static bool socket_check_gc(Unit *u) {
1918 Socket *s = SOCKET(u);
1922 return s->n_connections > 0;
1925 static void socket_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
1926 Socket *s = SOCKET(u);
1932 if (s->state != SOCKET_LISTENING)
1935 log_debug("Incoming traffic on %s", u->id);
1937 if (events != EPOLLIN) {
1939 if (events & EPOLLHUP)
1940 log_error("%s: Got POLLHUP on a listening socket. The service probably invoked shutdown() on it, and should better not do that.", u->id);
1942 log_error("%s: Got unexpected poll event (0x%x) on socket.", u->id, events);
1947 if (w->socket_accept) {
1950 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK);
1956 log_error("Failed to accept socket: %m");
1963 socket_apply_socket_options(s, cfd);
1966 socket_enter_running(s, cfd);
1970 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1973 static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1974 Socket *s = SOCKET(u);
1980 if (pid != s->control_pid)
1985 if (is_clean_exit(code, status, NULL))
1987 else if (code == CLD_EXITED)
1988 f = SOCKET_FAILURE_EXIT_CODE;
1989 else if (code == CLD_KILLED)
1990 f = SOCKET_FAILURE_SIGNAL;
1991 else if (code == CLD_DUMPED)
1992 f = SOCKET_FAILURE_CORE_DUMP;
1994 assert_not_reached("Unknown code");
1996 if (s->control_command) {
1997 exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
1999 if (s->control_command->ignore)
2003 log_full(f == SOCKET_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
2004 "%s control process exited, code=%s status=%i", u->id, sigchld_code_to_string(code), status);
2006 if (f != SOCKET_SUCCESS)
2009 if (s->control_command &&
2010 s->control_command->command_next &&
2011 f == SOCKET_SUCCESS) {
2013 log_debug("%s running next command for state %s", u->id, socket_state_to_string(s->state));
2016 s->control_command = NULL;
2017 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
2019 /* No further commands for this step, so let's figure
2020 * out what to do next */
2022 log_debug("%s got final SIGCHLD for state %s", u->id, socket_state_to_string(s->state));
2026 case SOCKET_START_PRE:
2027 if (f == SOCKET_SUCCESS)
2028 socket_enter_start_post(s);
2030 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, f);
2033 case SOCKET_START_POST:
2034 if (f == SOCKET_SUCCESS)
2035 socket_enter_listening(s);
2037 socket_enter_stop_pre(s, f);
2040 case SOCKET_STOP_PRE:
2041 case SOCKET_STOP_PRE_SIGTERM:
2042 case SOCKET_STOP_PRE_SIGKILL:
2043 socket_enter_stop_post(s, f);
2046 case SOCKET_STOP_POST:
2047 case SOCKET_FINAL_SIGTERM:
2048 case SOCKET_FINAL_SIGKILL:
2049 socket_enter_dead(s, f);
2053 assert_not_reached("Uh, control process died at wrong time.");
2057 /* Notify clients about changed exit status */
2058 unit_add_to_dbus_queue(u);
2061 static void socket_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
2062 Socket *s = SOCKET(u);
2065 assert(elapsed == 1);
2066 assert(w == &s->timer_watch);
2070 case SOCKET_START_PRE:
2071 log_warning("%s starting timed out. Terminating.", u->id);
2072 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2075 case SOCKET_START_POST:
2076 log_warning("%s starting timed out. Stopping.", u->id);
2077 socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
2080 case SOCKET_STOP_PRE:
2081 log_warning("%s stopping timed out. Terminating.", u->id);
2082 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2085 case SOCKET_STOP_PRE_SIGTERM:
2086 if (s->kill_context.send_sigkill) {
2087 log_warning("%s stopping timed out. Killing.", u->id);
2088 socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
2090 log_warning("%s stopping timed out. Skipping SIGKILL. Ignoring.", u->id);
2091 socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
2095 case SOCKET_STOP_PRE_SIGKILL:
2096 log_warning("%s still around after SIGKILL. Ignoring.", u->id);
2097 socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
2100 case SOCKET_STOP_POST:
2101 log_warning("%s stopping timed out (2). Terminating.", u->id);
2102 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2105 case SOCKET_FINAL_SIGTERM:
2106 if (s->kill_context.send_sigkill) {
2107 log_warning("%s stopping timed out (2). Killing.", u->id);
2108 socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
2110 log_warning("%s stopping timed out (2). Skipping SIGKILL. Ignoring.", u->id);
2111 socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
2115 case SOCKET_FINAL_SIGKILL:
2116 log_warning("%s still around after SIGKILL (2). Entering failed mode.", u->id);
2117 socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
2121 assert_not_reached("Timeout at wrong time.");
2125 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
2134 /* Called from the service code for requesting our fds */
2137 LIST_FOREACH(port, p, s->ports)
2147 if (!(rfds = new(int, rn_fds)))
2151 LIST_FOREACH(port, p, s->ports)
2155 assert(k == rn_fds);
2163 void socket_notify_service_dead(Socket *s, bool failed_permanent) {
2166 /* The service is dead. Dang!
2168 * This is strictly for one-instance-for-all-connections
2171 if (s->state == SOCKET_RUNNING) {
2172 log_debug("%s got notified about service death (failed permanently: %s)", UNIT(s)->id, yes_no(failed_permanent));
2173 if (failed_permanent)
2174 socket_enter_stop_pre(s, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT);
2176 socket_enter_listening(s);
2180 void socket_connection_unref(Socket *s) {
2183 /* The service is dead. Yay!
2185 * This is strictly for one-instance-per-connection
2188 assert(s->n_connections > 0);
2191 log_debug("%s: One connection closed, %u left.", UNIT(s)->id, s->n_connections);
2194 static void socket_reset_failed(Unit *u) {
2195 Socket *s = SOCKET(u);
2199 if (s->state == SOCKET_FAILED)
2200 socket_set_state(s, SOCKET_DEAD);
2202 s->result = SOCKET_SUCCESS;
2205 static int socket_kill(Unit *u, KillWho who, int signo, DBusError *error) {
2206 Socket *s = SOCKET(u);
2208 Set *pid_set = NULL;
2212 if (who == KILL_MAIN) {
2213 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Socket units have no main processes");
2217 if (s->control_pid <= 0 && who == KILL_CONTROL) {
2218 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2222 if (who == KILL_CONTROL || who == KILL_ALL)
2223 if (s->control_pid > 0)
2224 if (kill(s->control_pid, signo) < 0)
2227 if (who == KILL_ALL) {
2230 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2234 /* Exclude the control pid from being killed via the cgroup */
2235 if (s->control_pid > 0) {
2236 q = set_put(pid_set, LONG_TO_PTR(s->control_pid));
2243 q = cgroup_bonding_kill_list(UNIT(s)->cgroup_bondings, signo, false, false, pid_set, NULL);
2244 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2255 static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
2256 [SOCKET_DEAD] = "dead",
2257 [SOCKET_START_PRE] = "start-pre",
2258 [SOCKET_START_POST] = "start-post",
2259 [SOCKET_LISTENING] = "listening",
2260 [SOCKET_RUNNING] = "running",
2261 [SOCKET_STOP_PRE] = "stop-pre",
2262 [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
2263 [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
2264 [SOCKET_STOP_POST] = "stop-post",
2265 [SOCKET_FINAL_SIGTERM] = "final-sigterm",
2266 [SOCKET_FINAL_SIGKILL] = "final-sigkill",
2267 [SOCKET_FAILED] = "failed"
2270 DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
2272 static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
2273 [SOCKET_EXEC_START_PRE] = "StartPre",
2274 [SOCKET_EXEC_START_POST] = "StartPost",
2275 [SOCKET_EXEC_STOP_PRE] = "StopPre",
2276 [SOCKET_EXEC_STOP_POST] = "StopPost"
2279 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
2281 static const char* const socket_result_table[_SOCKET_RESULT_MAX] = {
2282 [SOCKET_SUCCESS] = "success",
2283 [SOCKET_FAILURE_RESOURCES] = "resources",
2284 [SOCKET_FAILURE_TIMEOUT] = "timeout",
2285 [SOCKET_FAILURE_EXIT_CODE] = "exit-code",
2286 [SOCKET_FAILURE_SIGNAL] = "signal",
2287 [SOCKET_FAILURE_CORE_DUMP] = "core-dump",
2288 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT] = "service-failed-permanent"
2291 DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
2293 const UnitVTable socket_vtable = {
2294 .object_size = sizeof(Socket),
2295 .exec_context_offset = offsetof(Socket, exec_context),
2302 .init = socket_init,
2303 .done = socket_done,
2304 .load = socket_load,
2306 .kill = socket_kill,
2308 .coldplug = socket_coldplug,
2310 .dump = socket_dump,
2312 .start = socket_start,
2313 .stop = socket_stop,
2315 .serialize = socket_serialize,
2316 .deserialize_item = socket_deserialize_item,
2318 .active_state = socket_active_state,
2319 .sub_state_to_string = socket_sub_state_to_string,
2321 .check_gc = socket_check_gc,
2323 .fd_event = socket_fd_event,
2324 .sigchld_event = socket_sigchld_event,
2325 .timer_event = socket_timer_event,
2327 .reset_failed = socket_reset_failed,
2329 .bus_interface = "org.freedesktop.systemd1.Socket",
2330 .bus_message_handler = bus_socket_message_handler,
2331 .bus_invalidating_properties = bus_socket_invalidating_properties,
2333 .status_message_formats = {
2334 /*.starting_stopping = {
2335 [0] = "Starting socket %s...",
2336 [1] = "Stopping socket %s...",
2338 .finished_start_job = {
2339 [JOB_DONE] = "Listening on %s.",
2340 [JOB_FAILED] = "Failed to listen on %s.",
2341 [JOB_DEPENDENCY] = "Dependency failed for %s.",
2342 [JOB_TIMEOUT] = "Timed out starting %s.",
2344 .finished_stop_job = {
2345 [JOB_DONE] = "Closed %s.",
2346 [JOB_FAILED] = "Failed stopping %s.",
2347 [JOB_TIMEOUT] = "Timed out stopping %s.",