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>
34 #include "netinet/tcp.h"
36 #include "load-dropin.h"
37 #include "load-fragment.h"
40 #include "unit-name.h"
41 #include "dbus-socket.h"
44 #include "bus-errors.h"
46 #include "exit-status.h"
49 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
50 [SOCKET_DEAD
] = UNIT_INACTIVE
,
51 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
52 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
53 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
54 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
55 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
56 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
57 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
58 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
59 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
60 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
61 [SOCKET_FAILED
] = UNIT_FAILED
64 static void socket_init(Unit
*u
) {
65 Socket
*s
= SOCKET(u
);
68 assert(u
->load_state
== UNIT_STUB
);
70 s
->backlog
= SOMAXCONN
;
71 s
->timeout_usec
= DEFAULT_TIMEOUT_USEC
;
72 s
->directory_mode
= 0755;
73 s
->socket_mode
= 0666;
75 s
->max_connections
= 64;
82 exec_context_init(&s
->exec_context
);
83 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
84 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
86 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
89 static void socket_unwatch_control_pid(Socket
*s
) {
92 if (s
->control_pid
<= 0)
95 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
99 static void socket_done(Unit
*u
) {
100 Socket
*s
= SOCKET(u
);
105 while ((p
= s
->ports
)) {
106 LIST_REMOVE(SocketPort
, port
, s
->ports
, p
);
109 unit_unwatch_fd(UNIT(s
), &p
->fd_watch
);
110 close_nointr_nofail(p
->fd
);
117 exec_context_done(&s
->exec_context
);
118 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
119 s
->control_command
= NULL
;
121 socket_unwatch_control_pid(s
);
123 unit_ref_unset(&s
->service
);
125 free(s
->tcp_congestion
);
126 s
->tcp_congestion
= NULL
;
128 free(s
->bind_to_device
);
129 s
->bind_to_device
= NULL
;
131 unit_unwatch_timer(u
, &s
->timer_watch
);
134 static int socket_instantiate_service(Socket
*s
) {
141 /* This fills in s->service if it isn't filled in yet. For
142 * Accept=yes sockets we create the next connection service
143 * here. For Accept=no this is mostly a NOP since the service
144 * is figured out at load time anyway. */
146 if (UNIT_DEREF(s
->service
))
151 if (!(prefix
= unit_name_to_prefix(UNIT(s
)->id
)))
154 r
= asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
);
160 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
166 #ifdef HAVE_SYSV_COMPAT
167 if (SERVICE(u
)->sysv_path
) {
168 log_error("Using SysV services for socket activation is not supported. Refusing.");
174 unit_ref_set(&s
->service
, u
);
176 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
179 static bool have_non_accept_socket(Socket
*s
) {
187 LIST_FOREACH(port
, p
, s
->ports
) {
189 if (p
->type
!= SOCKET_SOCKET
)
192 if (!socket_address_can_accept(&p
->address
))
199 static int socket_verify(Socket
*s
) {
202 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
206 log_error("%s lacks Listen setting. Refusing.", UNIT(s
)->id
);
210 if (s
->accept
&& have_non_accept_socket(s
)) {
211 log_error("%s configured for accepting sockets, but sockets are non-accepting. Refusing.", UNIT(s
)->id
);
215 if (s
->accept
&& s
->max_connections
<= 0) {
216 log_error("%s's MaxConnection setting too small. Refusing.", UNIT(s
)->id
);
220 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
221 log_error("Explicit service configuration for accepting sockets not supported on %s. Refusing.", UNIT(s
)->id
);
225 if (s
->exec_context
.pam_name
&& s
->exec_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
226 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s
)->id
);
233 static bool socket_needs_mount(Socket
*s
, const char *prefix
) {
238 LIST_FOREACH(port
, p
, s
->ports
) {
240 if (p
->type
== SOCKET_SOCKET
) {
241 if (socket_address_needs_mount(&p
->address
, prefix
))
243 } else if (p
->type
== SOCKET_FIFO
|| p
->type
== SOCKET_SPECIAL
) {
244 if (path_startswith(p
->path
, prefix
))
252 int socket_add_one_mount_link(Socket
*s
, Mount
*m
) {
258 if (UNIT(s
)->load_state
!= UNIT_LOADED
||
259 UNIT(m
)->load_state
!= UNIT_LOADED
)
262 if (!socket_needs_mount(s
, m
->where
))
265 if ((r
= unit_add_two_dependencies(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, UNIT(m
), true)) < 0)
271 static int socket_add_mount_links(Socket
*s
) {
277 LIST_FOREACH(units_by_type
, other
, UNIT(s
)->manager
->units_by_type
[UNIT_MOUNT
])
278 if ((r
= socket_add_one_mount_link(s
, MOUNT(other
))) < 0)
284 static int socket_add_device_link(Socket
*s
) {
290 if (!s
->bind_to_device
)
293 if (asprintf(&t
, "/sys/subsystem/net/devices/%s", s
->bind_to_device
) < 0)
296 r
= unit_add_node_link(UNIT(s
), t
, false);
302 static int socket_add_default_dependencies(Socket
*s
) {
306 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
307 if ((r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true)) < 0)
310 if ((r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true)) < 0)
314 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
317 static bool socket_has_exec(Socket
*s
) {
321 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
322 if (s
->exec_command
[i
])
328 static int socket_load(Unit
*u
) {
329 Socket
*s
= SOCKET(u
);
333 assert(u
->load_state
== UNIT_STUB
);
335 if ((r
= unit_load_fragment_and_dropin(u
)) < 0)
338 /* This is a new unit? Then let's add in some extras */
339 if (u
->load_state
== UNIT_LOADED
) {
341 if (have_non_accept_socket(s
)) {
343 if (!UNIT_DEREF(s
->service
)) {
346 r
= unit_load_related_unit(u
, ".service", &x
);
350 unit_ref_set(&s
->service
, x
);
353 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
358 if ((r
= socket_add_mount_links(s
)) < 0)
361 if ((r
= socket_add_device_link(s
)) < 0)
364 if (socket_has_exec(s
))
365 if ((r
= unit_add_exec_dependencies(u
, &s
->exec_context
)) < 0)
368 if ((r
= unit_add_default_cgroups(u
)) < 0)
371 if (UNIT(s
)->default_dependencies
)
372 if ((r
= socket_add_default_dependencies(s
)) < 0)
376 return socket_verify(s
);
379 static const char* listen_lookup(int family
, int type
) {
381 if (family
== AF_NETLINK
)
382 return "ListenNetlink";
384 if (type
== SOCK_STREAM
)
385 return "ListenStream";
386 else if (type
== SOCK_DGRAM
)
387 return "ListenDatagram";
388 else if (type
== SOCK_SEQPACKET
)
389 return "ListenSequentialPacket";
391 assert_not_reached("Unknown socket type");
395 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
398 Socket
*s
= SOCKET(u
);
406 p2
= strappend(prefix
, "\t");
407 prefix2
= p2
? p2
: prefix
;
410 "%sSocket State: %s\n"
412 "%sBindIPv6Only: %s\n"
414 "%sSocketMode: %04o\n"
415 "%sDirectoryMode: %04o\n"
418 "%sTransparent: %s\n"
420 "%sPassCredentials: %s\n"
421 "%sPassSecurity: %s\n"
422 "%sTCPCongestion: %s\n",
423 prefix
, socket_state_to_string(s
->state
),
424 prefix
, socket_result_to_string(s
->result
),
425 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
427 prefix
, s
->socket_mode
,
428 prefix
, s
->directory_mode
,
429 prefix
, yes_no(s
->keep_alive
),
430 prefix
, yes_no(s
->free_bind
),
431 prefix
, yes_no(s
->transparent
),
432 prefix
, yes_no(s
->broadcast
),
433 prefix
, yes_no(s
->pass_cred
),
434 prefix
, yes_no(s
->pass_sec
),
435 prefix
, strna(s
->tcp_congestion
));
437 if (s
->control_pid
> 0)
439 "%sControl PID: %lu\n",
440 prefix
, (unsigned long) s
->control_pid
);
442 if (s
->bind_to_device
)
444 "%sBindToDevice: %s\n",
445 prefix
, s
->bind_to_device
);
450 "%sNConnections: %u\n"
451 "%sMaxConnections: %u\n",
452 prefix
, s
->n_accepted
,
453 prefix
, s
->n_connections
,
454 prefix
, s
->max_connections
);
456 if (s
->priority
>= 0)
459 prefix
, s
->priority
);
461 if (s
->receive_buffer
> 0)
463 "%sReceiveBuffer: %zu\n",
464 prefix
, s
->receive_buffer
);
466 if (s
->send_buffer
> 0)
468 "%sSendBuffer: %zu\n",
469 prefix
, s
->send_buffer
);
481 if (s
->pipe_size
> 0)
484 prefix
, s
->pipe_size
);
491 if (s
->mq_maxmsg
> 0)
493 "%sMessageQueueMaxMessages: %li\n",
494 prefix
, s
->mq_maxmsg
);
496 if (s
->mq_msgsize
> 0)
498 "%sMessageQueueMessageSize: %li\n",
499 prefix
, s
->mq_msgsize
);
501 LIST_FOREACH(port
, p
, s
->ports
) {
503 if (p
->type
== SOCKET_SOCKET
) {
508 if ((r
= socket_address_print(&p
->address
, &k
)) < 0)
513 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
515 } else if (p
->type
== SOCKET_SPECIAL
)
516 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
517 else if (p
->type
== SOCKET_MQUEUE
)
518 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
520 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
523 exec_context_dump(&s
->exec_context
, f
, prefix
);
525 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
526 if (!s
->exec_command
[c
])
529 fprintf(f
, "%s-> %s:\n",
530 prefix
, socket_exec_command_to_string(c
));
532 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
538 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
543 struct sockaddr_un un
;
544 struct sockaddr_in in
;
545 struct sockaddr_in6 in6
;
546 struct sockaddr_storage storage
;
553 if (getsockname(fd
, &local
.sa
, &l
) < 0)
557 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
560 switch (local
.sa
.sa_family
) {
564 a
= ntohl(local
.in
.sin_addr
.s_addr
),
565 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
568 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
570 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
571 ntohs(local
.in
.sin_port
),
572 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
573 ntohs(remote
.in
.sin_port
)) < 0)
580 static const char ipv4_prefix
[] = {
581 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
584 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
585 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
587 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
588 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
591 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
593 a
[0], a
[1], a
[2], a
[3],
594 ntohs(local
.in6
.sin6_port
),
595 b
[0], b
[1], b
[2], b
[3],
596 ntohs(remote
.in6
.sin6_port
)) < 0)
599 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
604 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
605 ntohs(local
.in6
.sin6_port
),
606 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
607 ntohs(remote
.in6
.sin6_port
)) < 0)
618 if (getsockopt(fd
, SOL_SOCKET
, SO_PEERCRED
, &ucred
, &l
) < 0)
624 (unsigned long) ucred
.pid
,
625 (unsigned long) ucred
.uid
) < 0)
632 assert_not_reached("Unhandled socket type.");
639 static void socket_close_fds(Socket
*s
) {
644 LIST_FOREACH(port
, p
, s
->ports
) {
648 unit_unwatch_fd(UNIT(s
), &p
->fd_watch
);
649 close_nointr_nofail(p
->fd
);
651 /* One little note: we should never delete any sockets
652 * in the file system here! After all some other
653 * process we spawned might still have a reference of
654 * this fd and wants to continue to use it. Therefore
655 * we delete sockets in the file system before we
656 * create a new one, not after we stopped using
663 static void socket_apply_socket_options(Socket
*s
, int fd
) {
668 int b
= s
->keep_alive
;
669 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
670 log_warning("SO_KEEPALIVE failed: %m");
675 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
676 log_warning("SO_BROADCAST failed: %m");
681 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
682 log_warning("SO_PASSCRED failed: %m");
687 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
688 log_warning("SO_PASSSEC failed: %m");
691 if (s
->priority
>= 0)
692 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
693 log_warning("SO_PRIORITY failed: %m");
695 if (s
->receive_buffer
> 0) {
696 int value
= (int) s
->receive_buffer
;
698 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
700 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
701 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
702 log_warning("SO_RCVBUF failed: %m");
705 if (s
->send_buffer
> 0) {
706 int value
= (int) s
->send_buffer
;
707 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
708 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
709 log_warning("SO_SNDBUF failed: %m");
713 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
714 log_warning("SO_MARK failed: %m");
717 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
718 log_warning("IP_TOS failed: %m");
720 if (s
->ip_ttl
>= 0) {
723 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
725 if (socket_ipv6_is_supported())
726 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
729 errno
= EAFNOSUPPORT
;
733 log_warning("IP_TTL/IPV6_UNICAST_HOPS failed: %m");
736 if (s
->tcp_congestion
)
737 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
738 log_warning("TCP_CONGESTION failed: %m");
741 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
745 if (s
->pipe_size
> 0)
746 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
747 log_warning("F_SETPIPE_SZ: %m");
750 static int fifo_address_create(
752 mode_t directory_mode
,
763 mkdir_parents(path
, directory_mode
);
765 r
= label_context_set(path
, S_IFIFO
);
769 /* Enforce the right access mode for the fifo */
770 old_mask
= umask(~ socket_mode
);
772 /* Include the original umask in our mask */
773 umask(~socket_mode
| old_mask
);
775 r
= mkfifo(path
, socket_mode
);
778 if (r
< 0 && errno
!= EEXIST
) {
783 if ((fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
)) < 0) {
788 label_context_clear();
790 if (fstat(fd
, &st
) < 0) {
795 if (!S_ISFIFO(st
.st_mode
) ||
796 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
797 st
.st_uid
!= getuid() ||
798 st
.st_gid
!= getgid()) {
808 label_context_clear();
811 close_nointr_nofail(fd
);
816 static int special_address_create(
826 if ((fd
= open(path
, O_RDONLY
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
)) < 0) {
831 if (fstat(fd
, &st
) < 0) {
836 /* Check whether this is a /proc, /sys or /dev file or char device */
837 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
)) {
847 close_nointr_nofail(fd
);
852 static int mq_address_create(
862 struct mq_attr _attr
, *attr
= NULL
;
867 if (maxmsg
> 0 && msgsize
> 0) {
869 _attr
.mq_flags
= O_NONBLOCK
;
870 _attr
.mq_maxmsg
= maxmsg
;
871 _attr
.mq_msgsize
= msgsize
;
875 /* Enforce the right access mode for the mq */
876 old_mask
= umask(~ mq_mode
);
878 /* Include the original umask in our mask */
879 umask(~mq_mode
| old_mask
);
881 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
889 if (fstat(fd
, &st
) < 0) {
894 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
895 st
.st_uid
!= getuid() ||
896 st
.st_gid
!= getgid()) {
907 close_nointr_nofail(fd
);
912 static int socket_open_fds(Socket
*s
) {
916 bool know_label
= false;
920 LIST_FOREACH(port
, p
, s
->ports
) {
925 if (p
->type
== SOCKET_SOCKET
) {
929 if ((r
= socket_instantiate_service(s
)) < 0)
932 if (UNIT_DEREF(s
->service
) &&
933 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
934 r
= label_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
945 if ((r
= socket_address_listen(
958 socket_apply_socket_options(s
, p
->fd
);
960 } else if (p
->type
== SOCKET_SPECIAL
) {
962 if ((r
= special_address_create(
967 } else if (p
->type
== SOCKET_FIFO
) {
969 if ((r
= fifo_address_create(
976 socket_apply_fifo_options(s
, p
->fd
);
977 } else if (p
->type
== SOCKET_MQUEUE
) {
979 if ((r
= mq_address_create(
987 assert_not_reached("Unknown port type");
999 static void socket_unwatch_fds(Socket
*s
) {
1004 LIST_FOREACH(port
, p
, s
->ports
) {
1008 unit_unwatch_fd(UNIT(s
), &p
->fd_watch
);
1012 static int socket_watch_fds(Socket
*s
) {
1018 LIST_FOREACH(port
, p
, s
->ports
) {
1022 p
->fd_watch
.socket_accept
=
1024 p
->type
== SOCKET_SOCKET
&&
1025 socket_address_can_accept(&p
->address
);
1027 if ((r
= unit_watch_fd(UNIT(s
), p
->fd
, EPOLLIN
, &p
->fd_watch
)) < 0)
1034 socket_unwatch_fds(s
);
1038 static void socket_set_state(Socket
*s
, SocketState state
) {
1039 SocketState old_state
;
1042 old_state
= s
->state
;
1045 if (state
!= SOCKET_START_PRE
&&
1046 state
!= SOCKET_START_POST
&&
1047 state
!= SOCKET_STOP_PRE
&&
1048 state
!= SOCKET_STOP_PRE_SIGTERM
&&
1049 state
!= SOCKET_STOP_PRE_SIGKILL
&&
1050 state
!= SOCKET_STOP_POST
&&
1051 state
!= SOCKET_FINAL_SIGTERM
&&
1052 state
!= SOCKET_FINAL_SIGKILL
) {
1053 unit_unwatch_timer(UNIT(s
), &s
->timer_watch
);
1054 socket_unwatch_control_pid(s
);
1055 s
->control_command
= NULL
;
1056 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1059 if (state
!= SOCKET_LISTENING
)
1060 socket_unwatch_fds(s
);
1062 if (state
!= SOCKET_START_POST
&&
1063 state
!= SOCKET_LISTENING
&&
1064 state
!= SOCKET_RUNNING
&&
1065 state
!= SOCKET_STOP_PRE
&&
1066 state
!= SOCKET_STOP_PRE_SIGTERM
&&
1067 state
!= SOCKET_STOP_PRE_SIGKILL
)
1068 socket_close_fds(s
);
1070 if (state
!= old_state
)
1071 log_debug("%s changed %s -> %s",
1073 socket_state_to_string(old_state
),
1074 socket_state_to_string(state
));
1076 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1079 static int socket_coldplug(Unit
*u
) {
1080 Socket
*s
= SOCKET(u
);
1084 assert(s
->state
== SOCKET_DEAD
);
1086 if (s
->deserialized_state
!= s
->state
) {
1088 if (s
->deserialized_state
== SOCKET_START_PRE
||
1089 s
->deserialized_state
== SOCKET_START_POST
||
1090 s
->deserialized_state
== SOCKET_STOP_PRE
||
1091 s
->deserialized_state
== SOCKET_STOP_PRE_SIGTERM
||
1092 s
->deserialized_state
== SOCKET_STOP_PRE_SIGKILL
||
1093 s
->deserialized_state
== SOCKET_STOP_POST
||
1094 s
->deserialized_state
== SOCKET_FINAL_SIGTERM
||
1095 s
->deserialized_state
== SOCKET_FINAL_SIGKILL
) {
1097 if (s
->control_pid
<= 0)
1100 if ((r
= unit_watch_pid(UNIT(s
), s
->control_pid
)) < 0)
1103 if ((r
= unit_watch_timer(UNIT(s
), s
->timeout_usec
, &s
->timer_watch
)) < 0)
1107 if (s
->deserialized_state
== SOCKET_START_POST
||
1108 s
->deserialized_state
== SOCKET_LISTENING
||
1109 s
->deserialized_state
== SOCKET_RUNNING
||
1110 s
->deserialized_state
== SOCKET_STOP_PRE
||
1111 s
->deserialized_state
== SOCKET_STOP_PRE_SIGTERM
||
1112 s
->deserialized_state
== SOCKET_STOP_PRE_SIGKILL
)
1113 if ((r
= socket_open_fds(s
)) < 0)
1116 if (s
->deserialized_state
== SOCKET_LISTENING
)
1117 if ((r
= socket_watch_fds(s
)) < 0)
1120 socket_set_state(s
, s
->deserialized_state
);
1126 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1135 if ((r
= unit_watch_timer(UNIT(s
), s
->timeout_usec
, &s
->timer_watch
)) < 0)
1138 if (!(argv
= unit_full_printf_strv(UNIT(s
), c
->argv
))) {
1147 UNIT(s
)->manager
->environment
,
1151 UNIT(s
)->manager
->confirm_spawn
,
1152 UNIT(s
)->cgroup_bondings
,
1153 UNIT(s
)->cgroup_attributes
,
1162 if ((r
= unit_watch_pid(UNIT(s
), pid
)) < 0)
1163 /* FIXME: we need to do something here */
1171 unit_unwatch_timer(UNIT(s
), &s
->timer_watch
);
1176 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1179 if (f
!= SOCKET_SUCCESS
)
1182 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1185 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1187 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1191 if (f
!= SOCKET_SUCCESS
)
1194 socket_unwatch_control_pid(s
);
1196 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1198 if ((s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
])) {
1199 if ((r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
)) < 0)
1202 socket_set_state(s
, SOCKET_STOP_POST
);
1204 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1209 log_warning("%s failed to run 'stop-post' task: %s", UNIT(s
)->id
, strerror(-r
));
1210 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1213 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1215 Set
*pid_set
= NULL
;
1216 bool wait_for_exit
= false;
1220 if (f
!= SOCKET_SUCCESS
)
1223 if (s
->exec_context
.kill_mode
!= KILL_NONE
) {
1224 int sig
= (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_FINAL_SIGTERM
) ? s
->exec_context
.kill_signal
: SIGKILL
;
1226 if (s
->control_pid
> 0) {
1227 if (kill_and_sigcont(s
->control_pid
, sig
) < 0 && errno
!= ESRCH
)
1229 log_warning("Failed to kill control process %li: %m", (long) s
->control_pid
);
1231 wait_for_exit
= true;
1234 if (s
->exec_context
.kill_mode
== KILL_CONTROL_GROUP
) {
1236 if (!(pid_set
= set_new(trivial_hash_func
, trivial_compare_func
))) {
1241 /* Exclude the control pid from being killed via the cgroup */
1242 if (s
->control_pid
> 0)
1243 if ((r
= set_put(pid_set
, LONG_TO_PTR(s
->control_pid
))) < 0)
1246 r
= cgroup_bonding_kill_list(UNIT(s
)->cgroup_bondings
, sig
, true, false, pid_set
, NULL
);
1248 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
1249 log_warning("Failed to kill control group: %s", strerror(-r
));
1251 wait_for_exit
= true;
1258 if (wait_for_exit
) {
1259 if ((r
= unit_watch_timer(UNIT(s
), s
->timeout_usec
, &s
->timer_watch
)) < 0)
1262 socket_set_state(s
, state
);
1263 } else if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1264 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1266 socket_enter_dead(s
, SOCKET_SUCCESS
);
1271 log_warning("%s failed to kill processes: %s", UNIT(s
)->id
, strerror(-r
));
1273 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1274 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1276 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1282 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1286 if (f
!= SOCKET_SUCCESS
)
1289 socket_unwatch_control_pid(s
);
1291 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1293 if ((s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
])) {
1294 if ((r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
)) < 0)
1297 socket_set_state(s
, SOCKET_STOP_PRE
);
1299 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1304 log_warning("%s failed to run 'stop-pre' task: %s", UNIT(s
)->id
, strerror(-r
));
1305 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1308 static void socket_enter_listening(Socket
*s
) {
1312 r
= socket_watch_fds(s
);
1314 log_warning("%s failed to watch sockets: %s", UNIT(s
)->id
, strerror(-r
));
1318 socket_set_state(s
, SOCKET_LISTENING
);
1322 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1325 static void socket_enter_start_post(Socket
*s
) {
1329 r
= socket_open_fds(s
);
1331 log_warning("%s failed to listen on sockets: %s", UNIT(s
)->id
, strerror(-r
));
1335 socket_unwatch_control_pid(s
);
1337 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1339 if ((s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
])) {
1340 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1342 log_warning("%s failed to run 'start-post' task: %s", UNIT(s
)->id
, strerror(-r
));
1346 socket_set_state(s
, SOCKET_START_POST
);
1348 socket_enter_listening(s
);
1353 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1356 static void socket_enter_start_pre(Socket
*s
) {
1360 socket_unwatch_control_pid(s
);
1362 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1364 if ((s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
])) {
1365 if ((r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
)) < 0)
1368 socket_set_state(s
, SOCKET_START_PRE
);
1370 socket_enter_start_post(s
);
1375 log_warning("%s failed to run 'start-pre' task: %s", UNIT(s
)->id
, strerror(-r
));
1376 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1379 static void socket_enter_running(Socket
*s
, int cfd
) {
1384 dbus_error_init(&error
);
1386 /* We don't take connections anymore if we are supposed to
1387 * shut down anyway */
1388 if (unit_pending_inactive(UNIT(s
))) {
1389 log_debug("Suppressing connection request on %s since unit stop is scheduled.", UNIT(s
)->id
);
1392 close_nointr_nofail(cfd
);
1394 /* Flush all sockets by closing and reopening them */
1395 socket_close_fds(s
);
1397 r
= socket_watch_fds(s
);
1399 log_warning("%s failed to watch sockets: %s", UNIT(s
)->id
, strerror(-r
));
1400 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1410 bool pending
= false;
1412 /* If there's already a start pending don't bother to
1414 SET_FOREACH(u
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1415 if (unit_pending_active(u
)) {
1421 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, true, &error
, NULL
);
1426 socket_set_state(s
, SOCKET_RUNNING
);
1428 char *prefix
, *instance
= NULL
, *name
;
1431 if (s
->n_connections
>= s
->max_connections
) {
1432 log_warning("Too many incoming connections (%u)", s
->n_connections
);
1433 close_nointr_nofail(cfd
);
1437 r
= socket_instantiate_service(s
);
1441 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1446 /* ENOTCONN is legitimate if TCP RST was received.
1447 * This connection is over, but the socket unit lives on. */
1448 close_nointr_nofail(cfd
);
1452 prefix
= unit_name_to_prefix(UNIT(s
)->id
);
1459 name
= unit_name_build(prefix
, instance
, ".service");
1468 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1474 service
= SERVICE(UNIT_DEREF(s
->service
));
1475 unit_ref_unset(&s
->service
);
1478 UNIT(service
)->no_gc
= false;
1480 unit_choose_id(UNIT(service
), name
);
1483 r
= service_set_socket_fd(service
, cfd
, s
);
1488 s
->n_connections
++;
1490 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, true, &error
, NULL
);
1494 /* Notify clients about changed counters */
1495 unit_add_to_dbus_queue(UNIT(s
));
1501 log_warning("%s failed to queue socket startup job: %s", UNIT(s
)->id
, bus_error(&error
, r
));
1502 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1505 close_nointr_nofail(cfd
);
1507 dbus_error_free(&error
);
1510 static void socket_run_next(Socket
*s
) {
1514 assert(s
->control_command
);
1515 assert(s
->control_command
->command_next
);
1517 socket_unwatch_control_pid(s
);
1519 s
->control_command
= s
->control_command
->command_next
;
1521 if ((r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
)) < 0)
1527 log_warning("%s failed to run next task: %s", UNIT(s
)->id
, strerror(-r
));
1529 if (s
->state
== SOCKET_START_POST
)
1530 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1531 else if (s
->state
== SOCKET_STOP_POST
)
1532 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1534 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1537 static int socket_start(Unit
*u
) {
1538 Socket
*s
= SOCKET(u
);
1542 /* We cannot fulfill this request right now, try again later
1544 if (s
->state
== SOCKET_STOP_PRE
||
1545 s
->state
== SOCKET_STOP_PRE_SIGKILL
||
1546 s
->state
== SOCKET_STOP_PRE_SIGTERM
||
1547 s
->state
== SOCKET_STOP_POST
||
1548 s
->state
== SOCKET_FINAL_SIGTERM
||
1549 s
->state
== SOCKET_FINAL_SIGKILL
)
1552 if (s
->state
== SOCKET_START_PRE
||
1553 s
->state
== SOCKET_START_POST
)
1556 /* Cannot run this without the service being around */
1557 if (UNIT_DEREF(s
->service
)) {
1560 service
= SERVICE(UNIT_DEREF(s
->service
));
1562 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
1563 log_error("Socket service %s not loaded, refusing.", UNIT(service
)->id
);
1567 /* If the service is already active we cannot start the
1569 if (service
->state
!= SERVICE_DEAD
&&
1570 service
->state
!= SERVICE_FAILED
&&
1571 service
->state
!= SERVICE_AUTO_RESTART
) {
1572 log_error("Socket service %s already active, refusing.", UNIT(service
)->id
);
1576 #ifdef HAVE_SYSV_COMPAT
1577 if (service
->sysv_path
) {
1578 log_error("Using SysV services for socket activation is not supported. Refusing.");
1584 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
1586 s
->result
= SOCKET_SUCCESS
;
1587 socket_enter_start_pre(s
);
1591 static int socket_stop(Unit
*u
) {
1592 Socket
*s
= SOCKET(u
);
1597 if (s
->state
== SOCKET_STOP_PRE
||
1598 s
->state
== SOCKET_STOP_PRE_SIGTERM
||
1599 s
->state
== SOCKET_STOP_PRE_SIGKILL
||
1600 s
->state
== SOCKET_STOP_POST
||
1601 s
->state
== SOCKET_FINAL_SIGTERM
||
1602 s
->state
== SOCKET_FINAL_SIGKILL
)
1605 /* If there's already something running we go directly into
1607 if (s
->state
== SOCKET_START_PRE
||
1608 s
->state
== SOCKET_START_POST
) {
1609 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
1613 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
1615 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
1619 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
1620 Socket
*s
= SOCKET(u
);
1628 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
1629 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
1630 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
1632 if (s
->control_pid
> 0)
1633 unit_serialize_item_format(u
, f
, "control-pid", "%lu", (unsigned long) s
->control_pid
);
1635 if (s
->control_command_id
>= 0)
1636 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
1638 LIST_FOREACH(port
, p
, s
->ports
) {
1644 if ((copy
= fdset_put_dup(fds
, p
->fd
)) < 0)
1647 if (p
->type
== SOCKET_SOCKET
) {
1650 if ((r
= socket_address_print(&p
->address
, &t
)) < 0)
1653 if (socket_address_family(&p
->address
) == AF_NETLINK
)
1654 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
1656 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
1658 } else if (p
->type
== SOCKET_SPECIAL
)
1659 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
1661 assert(p
->type
== SOCKET_FIFO
);
1662 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
1669 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
1670 Socket
*s
= SOCKET(u
);
1677 if (streq(key
, "state")) {
1680 if ((state
= socket_state_from_string(value
)) < 0)
1681 log_debug("Failed to parse state value %s", value
);
1683 s
->deserialized_state
= state
;
1684 } else if (streq(key
, "result")) {
1687 f
= socket_result_from_string(value
);
1689 log_debug("Failed to parse result value %s", value
);
1690 else if (f
!= SOCKET_SUCCESS
)
1693 } else if (streq(key
, "n-accepted")) {
1696 if (safe_atou(value
, &k
) < 0)
1697 log_debug("Failed to parse n-accepted value %s", value
);
1700 } else if (streq(key
, "control-pid")) {
1703 if (parse_pid(value
, &pid
) < 0)
1704 log_debug("Failed to parse control-pid value %s", value
);
1706 s
->control_pid
= pid
;
1707 } else if (streq(key
, "control-command")) {
1708 SocketExecCommand id
;
1710 if ((id
= socket_exec_command_from_string(value
)) < 0)
1711 log_debug("Failed to parse exec-command value %s", value
);
1713 s
->control_command_id
= id
;
1714 s
->control_command
= s
->exec_command
[id
];
1716 } else if (streq(key
, "fifo")) {
1720 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
1721 log_debug("Failed to parse fifo value %s", value
);
1724 LIST_FOREACH(port
, p
, s
->ports
)
1725 if (p
->type
== SOCKET_FIFO
&&
1726 streq_ptr(p
->path
, value
+skip
))
1731 close_nointr_nofail(p
->fd
);
1732 p
->fd
= fdset_remove(fds
, fd
);
1736 } else if (streq(key
, "special")) {
1740 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
1741 log_debug("Failed to parse special value %s", value
);
1744 LIST_FOREACH(port
, p
, s
->ports
)
1745 if (p
->type
== SOCKET_SPECIAL
&&
1746 streq_ptr(p
->path
, value
+skip
))
1751 close_nointr_nofail(p
->fd
);
1752 p
->fd
= fdset_remove(fds
, fd
);
1756 } else if (streq(key
, "socket")) {
1757 int fd
, type
, skip
= 0;
1760 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
1761 log_debug("Failed to parse socket value %s", value
);
1764 LIST_FOREACH(port
, p
, s
->ports
)
1765 if (socket_address_is(&p
->address
, value
+skip
, type
))
1770 close_nointr_nofail(p
->fd
);
1771 p
->fd
= fdset_remove(fds
, fd
);
1775 } else if (streq(key
, "netlink")) {
1779 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
1780 log_debug("Failed to parse socket value %s", value
);
1783 LIST_FOREACH(port
, p
, s
->ports
)
1784 if (socket_address_is_netlink(&p
->address
, value
+skip
))
1789 close_nointr_nofail(p
->fd
);
1790 p
->fd
= fdset_remove(fds
, fd
);
1795 log_debug("Unknown serialization key '%s'", key
);
1800 static UnitActiveState
socket_active_state(Unit
*u
) {
1803 return state_translation_table
[SOCKET(u
)->state
];
1806 static const char *socket_sub_state_to_string(Unit
*u
) {
1809 return socket_state_to_string(SOCKET(u
)->state
);
1812 static bool socket_check_gc(Unit
*u
) {
1813 Socket
*s
= SOCKET(u
);
1817 return s
->n_connections
> 0;
1820 static void socket_fd_event(Unit
*u
, int fd
, uint32_t events
, Watch
*w
) {
1821 Socket
*s
= SOCKET(u
);
1827 if (s
->state
!= SOCKET_LISTENING
)
1830 log_debug("Incoming traffic on %s", u
->id
);
1832 if (events
!= EPOLLIN
) {
1834 if (events
& EPOLLHUP
)
1835 log_error("%s: Got POLLHUP on a listening socket. The service probably invoked shutdown() on it, and should better not do that.", u
->id
);
1837 log_error("%s: Got unexpected poll event (0x%x) on socket.", u
->id
, events
);
1842 if (w
->socket_accept
) {
1845 if ((cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
)) < 0) {
1850 log_error("Failed to accept socket: %m");
1857 socket_apply_socket_options(s
, cfd
);
1860 socket_enter_running(s
, cfd
);
1864 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1867 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
1868 Socket
*s
= SOCKET(u
);
1874 if (pid
!= s
->control_pid
)
1879 if (is_clean_exit(code
, status
))
1881 else if (code
== CLD_EXITED
)
1882 f
= SOCKET_FAILURE_EXIT_CODE
;
1883 else if (code
== CLD_KILLED
)
1884 f
= SOCKET_FAILURE_SIGNAL
;
1885 else if (code
== CLD_DUMPED
)
1886 f
= SOCKET_FAILURE_CORE_DUMP
;
1888 assert_not_reached("Unknown code");
1890 if (s
->control_command
) {
1891 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
1893 if (s
->control_command
->ignore
)
1897 log_full(f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
,
1898 "%s control process exited, code=%s status=%i", u
->id
, sigchld_code_to_string(code
), status
);
1900 if (f
!= SOCKET_SUCCESS
)
1903 if (s
->control_command
&&
1904 s
->control_command
->command_next
&&
1905 f
== SOCKET_SUCCESS
) {
1907 log_debug("%s running next command for state %s", u
->id
, socket_state_to_string(s
->state
));
1910 s
->control_command
= NULL
;
1911 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1913 /* No further commands for this step, so let's figure
1914 * out what to do next */
1916 log_debug("%s got final SIGCHLD for state %s", u
->id
, socket_state_to_string(s
->state
));
1920 case SOCKET_START_PRE
:
1921 if (f
== SOCKET_SUCCESS
)
1922 socket_enter_start_post(s
);
1924 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
1927 case SOCKET_START_POST
:
1928 if (f
== SOCKET_SUCCESS
)
1929 socket_enter_listening(s
);
1931 socket_enter_stop_pre(s
, f
);
1934 case SOCKET_STOP_PRE
:
1935 case SOCKET_STOP_PRE_SIGTERM
:
1936 case SOCKET_STOP_PRE_SIGKILL
:
1937 socket_enter_stop_post(s
, f
);
1940 case SOCKET_STOP_POST
:
1941 case SOCKET_FINAL_SIGTERM
:
1942 case SOCKET_FINAL_SIGKILL
:
1943 socket_enter_dead(s
, f
);
1947 assert_not_reached("Uh, control process died at wrong time.");
1951 /* Notify clients about changed exit status */
1952 unit_add_to_dbus_queue(u
);
1955 static void socket_timer_event(Unit
*u
, uint64_t elapsed
, Watch
*w
) {
1956 Socket
*s
= SOCKET(u
);
1959 assert(elapsed
== 1);
1960 assert(w
== &s
->timer_watch
);
1964 case SOCKET_START_PRE
:
1965 log_warning("%s starting timed out. Terminating.", u
->id
);
1966 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
1969 case SOCKET_START_POST
:
1970 log_warning("%s starting timed out. Stopping.", u
->id
);
1971 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
1974 case SOCKET_STOP_PRE
:
1975 log_warning("%s stopping timed out. Terminating.", u
->id
);
1976 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
1979 case SOCKET_STOP_PRE_SIGTERM
:
1980 if (s
->exec_context
.send_sigkill
) {
1981 log_warning("%s stopping timed out. Killing.", u
->id
);
1982 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
1984 log_warning("%s stopping timed out. Skipping SIGKILL. Ignoring.", u
->id
);
1985 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
1989 case SOCKET_STOP_PRE_SIGKILL
:
1990 log_warning("%s still around after SIGKILL. Ignoring.", u
->id
);
1991 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
1994 case SOCKET_STOP_POST
:
1995 log_warning("%s stopping timed out (2). Terminating.", u
->id
);
1996 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
1999 case SOCKET_FINAL_SIGTERM
:
2000 if (s
->exec_context
.send_sigkill
) {
2001 log_warning("%s stopping timed out (2). Killing.", u
->id
);
2002 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2004 log_warning("%s stopping timed out (2). Skipping SIGKILL. Ignoring.", u
->id
);
2005 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2009 case SOCKET_FINAL_SIGKILL
:
2010 log_warning("%s still around after SIGKILL (2). Entering failed mode.", u
->id
);
2011 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2015 assert_not_reached("Timeout at wrong time.");
2019 int socket_collect_fds(Socket
*s
, int **fds
, unsigned *n_fds
) {
2028 /* Called from the service code for requesting our fds */
2031 LIST_FOREACH(port
, p
, s
->ports
)
2041 if (!(rfds
= new(int, rn_fds
)))
2045 LIST_FOREACH(port
, p
, s
->ports
)
2049 assert(k
== rn_fds
);
2057 void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2060 /* The service is dead. Dang!
2062 * This is strictly for one-instance-for-all-connections
2065 if (s
->state
== SOCKET_RUNNING
) {
2066 log_debug("%s got notified about service death (failed permanently: %s)", UNIT(s
)->id
, yes_no(failed_permanent
));
2067 if (failed_permanent
)
2068 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2070 socket_enter_listening(s
);
2074 void socket_connection_unref(Socket
*s
) {
2077 /* The service is dead. Yay!
2079 * This is strictly for one-instance-per-connection
2082 assert(s
->n_connections
> 0);
2085 log_debug("%s: One connection closed, %u left.", UNIT(s
)->id
, s
->n_connections
);
2088 static void socket_reset_failed(Unit
*u
) {
2089 Socket
*s
= SOCKET(u
);
2093 if (s
->state
== SOCKET_FAILED
)
2094 socket_set_state(s
, SOCKET_DEAD
);
2096 s
->result
= SOCKET_SUCCESS
;
2099 static int socket_kill(Unit
*u
, KillWho who
, KillMode mode
, int signo
, DBusError
*error
) {
2100 Socket
*s
= SOCKET(u
);
2102 Set
*pid_set
= NULL
;
2106 if (who
== KILL_MAIN
) {
2107 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "Socket units have no main processes");
2111 if (s
->control_pid
<= 0 && who
== KILL_CONTROL
) {
2112 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
2116 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
2117 if (s
->control_pid
> 0)
2118 if (kill(s
->control_pid
, signo
) < 0)
2121 if (who
== KILL_ALL
&& mode
== KILL_CONTROL_GROUP
) {
2124 if (!(pid_set
= set_new(trivial_hash_func
, trivial_compare_func
)))
2127 /* Exclude the control pid from being killed via the cgroup */
2128 if (s
->control_pid
> 0)
2129 if ((q
= set_put(pid_set
, LONG_TO_PTR(s
->control_pid
))) < 0) {
2134 q
= cgroup_bonding_kill_list(UNIT(s
)->cgroup_bondings
, signo
, false, false, pid_set
, NULL
);
2136 if (q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
2147 static const char* const socket_state_table
[_SOCKET_STATE_MAX
] = {
2148 [SOCKET_DEAD
] = "dead",
2149 [SOCKET_START_PRE
] = "start-pre",
2150 [SOCKET_START_POST
] = "start-post",
2151 [SOCKET_LISTENING
] = "listening",
2152 [SOCKET_RUNNING
] = "running",
2153 [SOCKET_STOP_PRE
] = "stop-pre",
2154 [SOCKET_STOP_PRE_SIGTERM
] = "stop-pre-sigterm",
2155 [SOCKET_STOP_PRE_SIGKILL
] = "stop-pre-sigkill",
2156 [SOCKET_STOP_POST
] = "stop-post",
2157 [SOCKET_FINAL_SIGTERM
] = "final-sigterm",
2158 [SOCKET_FINAL_SIGKILL
] = "final-sigkill",
2159 [SOCKET_FAILED
] = "failed"
2162 DEFINE_STRING_TABLE_LOOKUP(socket_state
, SocketState
);
2164 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2165 [SOCKET_EXEC_START_PRE
] = "StartPre",
2166 [SOCKET_EXEC_START_POST
] = "StartPost",
2167 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2168 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2171 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2173 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2174 [SOCKET_SUCCESS
] = "success",
2175 [SOCKET_FAILURE_RESOURCES
] = "resources",
2176 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2177 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2178 [SOCKET_FAILURE_SIGNAL
] = "signal",
2179 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2180 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2183 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2185 const UnitVTable socket_vtable
= {
2186 .suffix
= ".socket",
2187 .object_size
= sizeof(Socket
),
2193 .init
= socket_init
,
2194 .done
= socket_done
,
2195 .load
= socket_load
,
2197 .kill
= socket_kill
,
2199 .coldplug
= socket_coldplug
,
2201 .dump
= socket_dump
,
2203 .start
= socket_start
,
2204 .stop
= socket_stop
,
2206 .serialize
= socket_serialize
,
2207 .deserialize_item
= socket_deserialize_item
,
2209 .active_state
= socket_active_state
,
2210 .sub_state_to_string
= socket_sub_state_to_string
,
2212 .check_gc
= socket_check_gc
,
2214 .fd_event
= socket_fd_event
,
2215 .sigchld_event
= socket_sigchld_event
,
2216 .timer_event
= socket_timer_event
,
2218 .reset_failed
= socket_reset_failed
,
2220 .bus_interface
= "org.freedesktop.systemd1.Socket",
2221 .bus_message_handler
= bus_socket_message_handler
,
2222 .bus_invalidating_properties
= bus_socket_invalidating_properties