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 <arpa/inet.h>
26 #include <netinet/tcp.h>
28 #include <sys/epoll.h>
34 #include "bus-error.h"
37 #include "dbus-socket.h"
39 #include "exit-status.h"
41 #include "formats-util.h"
46 #include "parse-util.h"
47 #include "path-util.h"
48 #include "selinux-util.h"
49 #include "signal-util.h"
50 #include "smack-util.h"
53 #include "string-util.h"
55 #include "unit-name.h"
56 #include "unit-printf.h"
58 #include "user-util.h"
60 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
61 [SOCKET_DEAD
] = UNIT_INACTIVE
,
62 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
63 [SOCKET_START_CHOWN
] = UNIT_ACTIVATING
,
64 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
65 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
66 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
67 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
68 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
69 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
70 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
71 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
72 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
73 [SOCKET_FAILED
] = UNIT_FAILED
76 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
77 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
79 static void socket_init(Unit
*u
) {
80 Socket
*s
= SOCKET(u
);
83 assert(u
->load_state
== UNIT_STUB
);
85 s
->backlog
= SOMAXCONN
;
86 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
87 s
->directory_mode
= 0755;
88 s
->socket_mode
= 0666;
90 s
->max_connections
= 64;
97 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
98 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
100 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
103 static void socket_unwatch_control_pid(Socket
*s
) {
106 if (s
->control_pid
<= 0)
109 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
113 static void socket_cleanup_fd_list(SocketPort
*p
) {
116 close_many(p
->auxiliary_fds
, p
->n_auxiliary_fds
);
117 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
118 p
->n_auxiliary_fds
= 0;
121 void socket_free_ports(Socket
*s
) {
126 while ((p
= s
->ports
)) {
127 LIST_REMOVE(port
, s
->ports
, p
);
129 sd_event_source_unref(p
->event_source
);
131 socket_cleanup_fd_list(p
);
138 static void socket_done(Unit
*u
) {
139 Socket
*s
= SOCKET(u
);
143 socket_free_ports(s
);
145 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
146 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
147 s
->control_command
= NULL
;
149 socket_unwatch_control_pid(s
);
151 unit_ref_unset(&s
->service
);
153 s
->tcp_congestion
= mfree(s
->tcp_congestion
);
154 s
->bind_to_device
= mfree(s
->bind_to_device
);
157 free(s
->smack_ip_in
);
158 free(s
->smack_ip_out
);
160 strv_free(s
->symlinks
);
165 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
168 static int socket_arm_timer(Socket
*s
) {
173 if (s
->timeout_usec
<= 0) {
174 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
178 if (s
->timer_event_source
) {
179 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
183 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
186 r
= sd_event_add_time(
187 UNIT(s
)->manager
->event
,
188 &s
->timer_event_source
,
190 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
191 socket_dispatch_timer
, s
);
195 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
200 int socket_instantiate_service(Socket
*s
) {
201 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
207 /* This fills in s->service if it isn't filled in yet. For
208 * Accept=yes sockets we create the next connection service
209 * here. For Accept=no this is mostly a NOP since the service
210 * is figured out at load time anyway. */
212 if (UNIT_DEREF(s
->service
))
218 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
222 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
225 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
230 unit_ref_set(&s
->service
, u
);
232 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
235 static bool have_non_accept_socket(Socket
*s
) {
243 LIST_FOREACH(port
, p
, s
->ports
) {
245 if (p
->type
!= SOCKET_SOCKET
)
248 if (!socket_address_can_accept(&p
->address
))
255 static int socket_add_mount_links(Socket
*s
) {
261 LIST_FOREACH(port
, p
, s
->ports
) {
262 const char *path
= NULL
;
264 if (p
->type
== SOCKET_SOCKET
)
265 path
= socket_address_get_path(&p
->address
);
266 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
272 r
= unit_require_mounts_for(UNIT(s
), path
);
280 static int socket_add_device_link(Socket
*s
) {
285 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
288 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
289 return unit_add_node_link(UNIT(s
), t
, false);
292 static int socket_add_default_dependencies(Socket
*s
) {
296 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
300 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
301 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
306 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
309 _pure_
static bool socket_has_exec(Socket
*s
) {
313 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
314 if (s
->exec_command
[i
])
320 static int socket_add_extras(Socket
*s
) {
326 if (have_non_accept_socket(s
)) {
328 if (!UNIT_DEREF(s
->service
)) {
331 r
= unit_load_related_unit(u
, ".service", &x
);
335 unit_ref_set(&s
->service
, x
);
338 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
343 r
= socket_add_mount_links(s
);
347 r
= socket_add_device_link(s
);
351 r
= unit_patch_contexts(u
);
355 if (socket_has_exec(s
)) {
356 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
360 r
= unit_set_default_slice(u
);
365 if (u
->default_dependencies
) {
366 r
= socket_add_default_dependencies(s
);
374 static const char *socket_find_symlink_target(Socket
*s
) {
375 const char *found
= NULL
;
378 LIST_FOREACH(port
, p
, s
->ports
) {
379 const char *f
= NULL
;
388 if (p
->address
.sockaddr
.un
.sun_path
[0] != 0)
389 f
= p
->address
.sockaddr
.un
.sun_path
;
407 static int socket_verify(Socket
*s
) {
410 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
414 log_unit_error(UNIT(s
), "Unit lacks Listen setting. Refusing.");
418 if (s
->accept
&& have_non_accept_socket(s
)) {
419 log_unit_error(UNIT(s
), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
423 if (s
->accept
&& s
->max_connections
<= 0) {
424 log_unit_error(UNIT(s
), "MaxConnection= setting too small. Refusing.");
428 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
429 log_unit_error(UNIT(s
), "Explicit service configuration for accepting socket units not supported. Refusing.");
433 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
434 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing.");
438 if (!strv_isempty(s
->symlinks
) && !socket_find_symlink_target(s
)) {
439 log_unit_error(UNIT(s
), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
446 static int socket_load(Unit
*u
) {
447 Socket
*s
= SOCKET(u
);
451 assert(u
->load_state
== UNIT_STUB
);
453 r
= unit_load_fragment_and_dropin(u
);
457 if (u
->load_state
== UNIT_LOADED
) {
458 /* This is a new unit? Then let's add in some extras */
459 r
= socket_add_extras(s
);
464 return socket_verify(s
);
467 _const_
static const char* listen_lookup(int family
, int type
) {
469 if (family
== AF_NETLINK
)
470 return "ListenNetlink";
472 if (type
== SOCK_STREAM
)
473 return "ListenStream";
474 else if (type
== SOCK_DGRAM
)
475 return "ListenDatagram";
476 else if (type
== SOCK_SEQPACKET
)
477 return "ListenSequentialPacket";
479 assert_not_reached("Unknown socket type");
483 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
484 char time_string
[FORMAT_TIMESPAN_MAX
];
486 Socket
*s
= SOCKET(u
);
493 prefix
= strempty(prefix
);
494 prefix2
= strjoina(prefix
, "\t");
497 "%sSocket State: %s\n"
499 "%sBindIPv6Only: %s\n"
501 "%sSocketMode: %04o\n"
502 "%sDirectoryMode: %04o\n"
506 "%sTransparent: %s\n"
508 "%sPassCredentials: %s\n"
509 "%sPassSecurity: %s\n"
510 "%sTCPCongestion: %s\n"
511 "%sRemoveOnStop: %s\n"
514 "%sSELinuxContextFromNet: %s\n",
515 prefix
, socket_state_to_string(s
->state
),
516 prefix
, socket_result_to_string(s
->result
),
517 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
519 prefix
, s
->socket_mode
,
520 prefix
, s
->directory_mode
,
521 prefix
, yes_no(s
->keep_alive
),
522 prefix
, yes_no(s
->no_delay
),
523 prefix
, yes_no(s
->free_bind
),
524 prefix
, yes_no(s
->transparent
),
525 prefix
, yes_no(s
->broadcast
),
526 prefix
, yes_no(s
->pass_cred
),
527 prefix
, yes_no(s
->pass_sec
),
528 prefix
, strna(s
->tcp_congestion
),
529 prefix
, yes_no(s
->remove_on_stop
),
530 prefix
, yes_no(s
->writable
),
531 prefix
, socket_fdname(s
),
532 prefix
, yes_no(s
->selinux_context_from_net
));
534 if (s
->control_pid
> 0)
536 "%sControl PID: "PID_FMT
"\n",
537 prefix
, s
->control_pid
);
539 if (s
->bind_to_device
)
541 "%sBindToDevice: %s\n",
542 prefix
, s
->bind_to_device
);
547 "%sNConnections: %u\n"
548 "%sMaxConnections: %u\n",
549 prefix
, s
->n_accepted
,
550 prefix
, s
->n_connections
,
551 prefix
, s
->max_connections
);
553 if (s
->priority
>= 0)
556 prefix
, s
->priority
);
558 if (s
->receive_buffer
> 0)
560 "%sReceiveBuffer: %zu\n",
561 prefix
, s
->receive_buffer
);
563 if (s
->send_buffer
> 0)
565 "%sSendBuffer: %zu\n",
566 prefix
, s
->send_buffer
);
578 if (s
->pipe_size
> 0)
581 prefix
, s
->pipe_size
);
588 if (s
->mq_maxmsg
> 0)
590 "%sMessageQueueMaxMessages: %li\n",
591 prefix
, s
->mq_maxmsg
);
593 if (s
->mq_msgsize
> 0)
595 "%sMessageQueueMessageSize: %li\n",
596 prefix
, s
->mq_msgsize
);
601 prefix
, yes_no(s
->reuse_port
));
605 "%sSmackLabel: %s\n",
610 "%sSmackLabelIPIn: %s\n",
611 prefix
, s
->smack_ip_in
);
615 "%sSmackLabelIPOut: %s\n",
616 prefix
, s
->smack_ip_out
);
618 if (!isempty(s
->user
) || !isempty(s
->group
))
621 "%sOwnerGroup: %s\n",
622 prefix
, strna(s
->user
),
623 prefix
, strna(s
->group
));
625 if (s
->keep_alive_time
> 0)
627 "%sKeepAliveTimeSec: %s\n",
628 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_time
, USEC_PER_SEC
));
630 if (s
->keep_alive_interval
)
632 "%sKeepAliveIntervalSec: %s\n",
633 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_interval
, USEC_PER_SEC
));
635 if (s
->keep_alive_cnt
)
637 "%sKeepAliveProbes: %u\n",
638 prefix
, s
->keep_alive_cnt
);
642 "%sDeferAcceptSec: %s\n",
643 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->defer_accept
, USEC_PER_SEC
));
645 LIST_FOREACH(port
, p
, s
->ports
) {
647 if (p
->type
== SOCKET_SOCKET
) {
652 r
= socket_address_print(&p
->address
, &k
);
658 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
660 } else if (p
->type
== SOCKET_SPECIAL
)
661 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
662 else if (p
->type
== SOCKET_USB_FUNCTION
)
663 fprintf(f
, "%sListenUSBFunction: %s\n", prefix
, p
->path
);
664 else if (p
->type
== SOCKET_MQUEUE
)
665 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
667 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
670 exec_context_dump(&s
->exec_context
, f
, prefix
);
671 kill_context_dump(&s
->kill_context
, f
, prefix
);
673 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
674 if (!s
->exec_command
[c
])
677 fprintf(f
, "%s-> %s:\n",
678 prefix
, socket_exec_command_to_string(c
));
680 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
684 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
687 union sockaddr_union local
, remote
;
693 if (getsockname(fd
, &local
.sa
, &l
) < 0)
697 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
700 switch (local
.sa
.sa_family
) {
704 a
= ntohl(local
.in
.sin_addr
.s_addr
),
705 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
708 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
710 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
711 ntohs(local
.in
.sin_port
),
712 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
713 ntohs(remote
.in
.sin_port
)) < 0)
720 static const unsigned char ipv4_prefix
[] = {
721 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
724 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
725 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
727 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
728 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
731 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
733 a
[0], a
[1], a
[2], a
[3],
734 ntohs(local
.in6
.sin6_port
),
735 b
[0], b
[1], b
[2], b
[3],
736 ntohs(remote
.in6
.sin6_port
)) < 0)
739 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
744 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
745 ntohs(local
.in6
.sin6_port
),
746 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
747 ntohs(remote
.in6
.sin6_port
)) < 0)
758 k
= getpeercred(fd
, &ucred
);
761 "%u-"PID_FMT
"-"UID_FMT
,
762 nr
, ucred
.pid
, ucred
.uid
) < 0)
764 } else if (k
== -ENODATA
) {
765 /* This handles the case where somebody is
766 * connecting from another pid/uid namespace
767 * (e.g. from outside of our container). */
779 assert_not_reached("Unhandled socket type.");
786 static void socket_close_fds(Socket
*s
) {
792 LIST_FOREACH(port
, p
, s
->ports
) {
794 p
->event_source
= sd_event_source_unref(p
->event_source
);
799 p
->fd
= safe_close(p
->fd
);
800 socket_cleanup_fd_list(p
);
802 /* One little note: we should normally not delete any
803 * sockets in the file system here! After all some
804 * other process we spawned might still have a
805 * reference of this fd and wants to continue to use
806 * it. Therefore we delete sockets in the file system
807 * before we create a new one, not after we stopped
810 if (s
->remove_on_stop
) {
822 socket_address_unlink(&p
->address
);
831 if (s
->remove_on_stop
)
832 STRV_FOREACH(i
, s
->symlinks
)
836 static void socket_apply_socket_options(Socket
*s
, int fd
) {
843 int b
= s
->keep_alive
;
844 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
845 log_unit_warning_errno(UNIT(s
), errno
, "SO_KEEPALIVE failed: %m");
848 if (s
->keep_alive_time
) {
849 int value
= s
->keep_alive_time
/ USEC_PER_SEC
;
850 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPIDLE
, &value
, sizeof(value
)) < 0)
851 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPIDLE failed: %m");
854 if (s
->keep_alive_interval
) {
855 int value
= s
->keep_alive_interval
/ USEC_PER_SEC
;
856 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPINTVL
, &value
, sizeof(value
)) < 0)
857 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPINTVL failed: %m");
860 if (s
->keep_alive_cnt
) {
861 int value
= s
->keep_alive_cnt
;
862 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPCNT
, &value
, sizeof(value
)) < 0)
863 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPCNT failed: %m");
866 if (s
->defer_accept
) {
867 int value
= s
->defer_accept
/ USEC_PER_SEC
;
868 if (setsockopt(fd
, SOL_TCP
, TCP_DEFER_ACCEPT
, &value
, sizeof(value
)) < 0)
869 log_unit_warning_errno(UNIT(s
), errno
, "TCP_DEFER_ACCEPT failed: %m");
874 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
875 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
880 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
881 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
886 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
887 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
892 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
893 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
896 if (s
->priority
>= 0)
897 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
898 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
900 if (s
->receive_buffer
> 0) {
901 int value
= (int) s
->receive_buffer
;
903 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
905 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
906 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
907 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
910 if (s
->send_buffer
> 0) {
911 int value
= (int) s
->send_buffer
;
912 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
913 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
914 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
918 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
919 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
922 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
923 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
925 if (s
->ip_ttl
>= 0) {
928 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
930 if (socket_ipv6_is_supported())
931 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
934 errno
= EAFNOSUPPORT
;
938 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
941 if (s
->tcp_congestion
)
942 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
943 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
945 if (s
->smack_ip_in
) {
946 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
948 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
951 if (s
->smack_ip_out
) {
952 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
954 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
958 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
964 if (s
->pipe_size
> 0)
965 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
966 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
969 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
971 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
975 static int fifo_address_create(
977 mode_t directory_mode
,
978 mode_t socket_mode
) {
980 _cleanup_close_
int fd
= -1;
987 mkdir_parents_label(path
, directory_mode
);
989 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
993 /* Enforce the right access mode for the fifo */
994 old_mask
= umask(~ socket_mode
);
996 /* Include the original umask in our mask */
997 (void) umask(~socket_mode
| old_mask
);
999 r
= mkfifo(path
, socket_mode
);
1000 (void) umask(old_mask
);
1002 if (r
< 0 && errno
!= EEXIST
) {
1007 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1013 mac_selinux_create_file_clear();
1015 if (fstat(fd
, &st
) < 0) {
1020 if (!S_ISFIFO(st
.st_mode
) ||
1021 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1022 st
.st_uid
!= getuid() ||
1023 st
.st_gid
!= getgid()) {
1034 mac_selinux_create_file_clear();
1038 static int special_address_create(const char *path
, bool writable
) {
1039 _cleanup_close_
int fd
= -1;
1045 fd
= open(path
, (writable
? O_RDWR
: O_RDONLY
)|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1049 if (fstat(fd
, &st
) < 0)
1052 /* Check whether this is a /proc, /sys or /dev file or char device */
1053 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1062 static int usbffs_address_create(const char *path
) {
1063 _cleanup_close_
int fd
= -1;
1069 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1073 if (fstat(fd
, &st
) < 0)
1076 /* Check whether this is a regular file (ffs endpoint)*/
1077 if (!S_ISREG(st
.st_mode
))
1086 static int mq_address_create(
1092 _cleanup_close_
int fd
= -1;
1095 struct mq_attr _attr
, *attr
= NULL
;
1100 if (maxmsg
> 0 && msgsize
> 0) {
1101 _attr
= (struct mq_attr
) {
1102 .mq_flags
= O_NONBLOCK
,
1103 .mq_maxmsg
= maxmsg
,
1104 .mq_msgsize
= msgsize
,
1109 /* Enforce the right access mode for the mq */
1110 old_mask
= umask(~ mq_mode
);
1112 /* Include the original umask in our mask */
1113 (void) umask(~mq_mode
| old_mask
);
1114 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1115 (void) umask(old_mask
);
1120 if (fstat(fd
, &st
) < 0)
1123 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1124 st
.st_uid
!= getuid() ||
1125 st
.st_gid
!= getgid())
1134 static int socket_symlink(Socket
*s
) {
1140 p
= socket_find_symlink_target(s
);
1144 STRV_FOREACH(i
, s
->symlinks
)
1145 symlink_label(p
, *i
);
1150 static int usbffs_write_descs(int fd
, Service
*s
) {
1153 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1156 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1160 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1163 static int usbffs_select_ep(const struct dirent
*d
) {
1164 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1167 static int usbffs_dispatch_eps(SocketPort
*p
) {
1168 _cleanup_free_
struct dirent
**ent
= NULL
;
1169 _cleanup_free_
char *path
= NULL
;
1172 r
= path_get_parent(p
->path
, &path
);
1176 r
= scandir(path
, &ent
, usbffs_select_ep
, alphasort
);
1181 p
->auxiliary_fds
= new(int, n
);
1182 if (!p
->auxiliary_fds
)
1185 p
->n_auxiliary_fds
= n
;
1188 for (i
= 0; i
< n
; ++i
) {
1189 _cleanup_free_
char *ep
= NULL
;
1191 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1195 path_kill_slashes(ep
);
1197 r
= usbffs_address_create(ep
);
1201 p
->auxiliary_fds
[k
] = r
;
1210 close_many(p
->auxiliary_fds
, k
);
1211 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1212 p
->n_auxiliary_fds
= 0;
1217 static int socket_open_fds(Socket
*s
) {
1218 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1219 bool know_label
= false;
1225 LIST_FOREACH(port
, p
, s
->ports
) {
1235 /* Figure out label, if we don't it know
1236 * yet. We do it once, for the first
1237 * socket where we need this and
1238 * remember it for the rest. */
1240 if (s
->selinux_context_from_net
) {
1241 /* Get it from the network label */
1243 r
= mac_selinux_get_our_label(&label
);
1244 if (r
< 0 && r
!= -EOPNOTSUPP
)
1248 /* Get it from the executable we are about to start */
1250 r
= socket_instantiate_service(s
);
1254 if (UNIT_ISSET(s
->service
) &&
1255 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1256 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1257 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1265 r
= socket_address_listen(
1267 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1281 socket_apply_socket_options(s
, p
->fd
);
1285 case SOCKET_SPECIAL
:
1287 p
->fd
= special_address_create(p
->path
, s
->writable
);
1296 p
->fd
= fifo_address_create(
1305 socket_apply_fifo_options(s
, p
->fd
);
1311 p
->fd
= mq_address_create(
1322 case SOCKET_USB_FUNCTION
:
1324 p
->fd
= usbffs_address_create(p
->path
);
1330 r
= usbffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1334 r
= usbffs_dispatch_eps(p
);
1341 assert_not_reached("Unknown port type");
1348 socket_close_fds(s
);
1352 static void socket_unwatch_fds(Socket
*s
) {
1358 LIST_FOREACH(port
, p
, s
->ports
) {
1362 if (!p
->event_source
)
1365 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1367 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1371 static int socket_watch_fds(Socket
*s
) {
1377 LIST_FOREACH(port
, p
, s
->ports
) {
1381 if (p
->event_source
) {
1382 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1386 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1390 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1397 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1398 socket_unwatch_fds(s
);
1402 static void socket_set_state(Socket
*s
, SocketState state
) {
1403 SocketState old_state
;
1406 old_state
= s
->state
;
1414 SOCKET_STOP_PRE_SIGTERM
,
1415 SOCKET_STOP_PRE_SIGKILL
,
1417 SOCKET_FINAL_SIGTERM
,
1418 SOCKET_FINAL_SIGKILL
)) {
1420 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1421 socket_unwatch_control_pid(s
);
1422 s
->control_command
= NULL
;
1423 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1426 if (state
!= SOCKET_LISTENING
)
1427 socket_unwatch_fds(s
);
1435 SOCKET_STOP_PRE_SIGTERM
,
1436 SOCKET_STOP_PRE_SIGKILL
))
1437 socket_close_fds(s
);
1439 if (state
!= old_state
)
1440 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1442 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1445 static int socket_coldplug(Unit
*u
) {
1446 Socket
*s
= SOCKET(u
);
1450 assert(s
->state
== SOCKET_DEAD
);
1452 if (s
->deserialized_state
== s
->state
)
1455 if (IN_SET(s
->deserialized_state
,
1460 SOCKET_STOP_PRE_SIGTERM
,
1461 SOCKET_STOP_PRE_SIGKILL
,
1463 SOCKET_FINAL_SIGTERM
,
1464 SOCKET_FINAL_SIGKILL
)) {
1466 if (s
->control_pid
<= 0)
1469 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1473 r
= socket_arm_timer(s
);
1478 if (IN_SET(s
->deserialized_state
,
1484 SOCKET_STOP_PRE_SIGTERM
,
1485 SOCKET_STOP_PRE_SIGKILL
)) {
1486 r
= socket_open_fds(s
);
1491 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1492 r
= socket_watch_fds(s
);
1497 socket_set_state(s
, s
->deserialized_state
);
1501 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1502 _cleanup_free_
char **argv
= NULL
;
1505 ExecParameters exec_params
= {
1506 .apply_permissions
= true,
1507 .apply_chroot
= true,
1508 .apply_tty_stdin
= true,
1509 .bus_endpoint_fd
= -1,
1519 (void) unit_realize_cgroup(UNIT(s
));
1520 if (s
->reset_cpu_usage
) {
1521 (void) unit_reset_cpu_usage(UNIT(s
));
1522 s
->reset_cpu_usage
= false;
1525 r
= unit_setup_exec_runtime(UNIT(s
));
1529 r
= socket_arm_timer(s
);
1533 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1537 exec_params
.argv
= argv
;
1538 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1539 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1540 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1541 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1542 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1543 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1545 r
= exec_spawn(UNIT(s
),
1554 r
= unit_watch_pid(UNIT(s
), pid
);
1556 /* FIXME: we need to do something here */
1563 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1567 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1571 r
= socket_arm_timer(s
);
1575 /* We have to resolve the user names out-of-process, hence
1576 * let's fork here. It's messy, but well, what can we do? */
1584 uid_t uid
= UID_INVALID
;
1585 gid_t gid
= GID_INVALID
;
1588 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1589 (void) ignore_signals(SIGPIPE
, -1);
1592 if (!isempty(s
->user
)) {
1593 const char *user
= s
->user
;
1595 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1602 if (!isempty(s
->group
)) {
1603 const char *group
= s
->group
;
1605 r
= get_group_creds(&group
, &gid
);
1612 LIST_FOREACH(port
, p
, s
->ports
) {
1613 const char *path
= NULL
;
1615 if (p
->type
== SOCKET_SOCKET
)
1616 path
= socket_address_get_path(&p
->address
);
1617 else if (p
->type
== SOCKET_FIFO
)
1623 if (chown(path
, uid
, gid
) < 0) {
1634 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1639 r
= unit_watch_pid(UNIT(s
), pid
);
1647 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1651 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1654 if (f
!= SOCKET_SUCCESS
)
1657 exec_runtime_destroy(s
->exec_runtime
);
1658 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1660 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1662 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1665 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1667 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1671 if (f
!= SOCKET_SUCCESS
)
1674 socket_unwatch_control_pid(s
);
1675 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1676 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1678 if (s
->control_command
) {
1679 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1683 socket_set_state(s
, SOCKET_STOP_POST
);
1685 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1690 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1691 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1694 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1699 if (f
!= SOCKET_SUCCESS
)
1702 r
= unit_kill_context(
1705 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1706 KILL_KILL
: KILL_TERMINATE
,
1714 r
= socket_arm_timer(s
);
1718 socket_set_state(s
, state
);
1719 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1720 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1721 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1722 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1723 else if (state
== SOCKET_FINAL_SIGTERM
)
1724 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1726 socket_enter_dead(s
, SOCKET_SUCCESS
);
1731 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1733 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1734 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1736 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1739 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1743 if (f
!= SOCKET_SUCCESS
)
1746 socket_unwatch_control_pid(s
);
1747 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1748 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1750 if (s
->control_command
) {
1751 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1755 socket_set_state(s
, SOCKET_STOP_PRE
);
1757 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1762 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1763 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1766 static void socket_enter_listening(Socket
*s
) {
1770 r
= socket_watch_fds(s
);
1772 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1776 socket_set_state(s
, SOCKET_LISTENING
);
1780 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1783 static void socket_enter_start_post(Socket
*s
) {
1787 socket_unwatch_control_pid(s
);
1788 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1789 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1791 if (s
->control_command
) {
1792 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1794 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1798 socket_set_state(s
, SOCKET_START_POST
);
1800 socket_enter_listening(s
);
1805 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1808 static void socket_enter_start_chown(Socket
*s
) {
1813 r
= socket_open_fds(s
);
1815 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1819 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1821 socket_unwatch_control_pid(s
);
1822 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1823 s
->control_command
= NULL
;
1825 r
= socket_chown(s
, &s
->control_pid
);
1827 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1831 socket_set_state(s
, SOCKET_START_CHOWN
);
1833 socket_enter_start_post(s
);
1838 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1841 static void socket_enter_start_pre(Socket
*s
) {
1845 socket_unwatch_control_pid(s
);
1846 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1847 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1849 if (s
->control_command
) {
1850 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1852 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1856 socket_set_state(s
, SOCKET_START_PRE
);
1858 socket_enter_start_chown(s
);
1863 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1866 static void socket_enter_running(Socket
*s
, int cfd
) {
1867 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1872 /* We don't take connections anymore if we are supposed to
1873 * shut down anyway */
1874 if (unit_stop_pending(UNIT(s
))) {
1876 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1881 /* Flush all sockets by closing and reopening them */
1882 socket_close_fds(s
);
1884 r
= socket_open_fds(s
);
1886 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1887 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1891 r
= socket_watch_fds(s
);
1893 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1894 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1904 bool pending
= false;
1906 /* If there's already a start pending don't bother to
1908 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1909 if (unit_active_or_pending(other
)) {
1915 if (!UNIT_ISSET(s
->service
)) {
1916 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1921 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, true, &error
, NULL
);
1926 socket_set_state(s
, SOCKET_RUNNING
);
1928 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1931 if (s
->n_connections
>= s
->max_connections
) {
1932 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1937 r
= socket_instantiate_service(s
);
1941 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1946 /* ENOTCONN is legitimate if TCP RST was received.
1947 * This connection is over, but the socket unit lives on. */
1952 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1956 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1960 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1964 service
= SERVICE(UNIT_DEREF(s
->service
));
1965 unit_ref_unset(&s
->service
);
1968 UNIT(service
)->no_gc
= false;
1970 unit_choose_id(UNIT(service
), name
);
1972 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1977 s
->n_connections
++;
1979 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, true, &error
, NULL
);
1983 /* Notify clients about changed counters */
1984 unit_add_to_dbus_queue(UNIT(s
));
1990 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
1991 cfd
>= 0 ? "template" : "non-template",
1992 bus_error_message(&error
, r
));
1994 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1998 static void socket_run_next(Socket
*s
) {
2002 assert(s
->control_command
);
2003 assert(s
->control_command
->command_next
);
2005 socket_unwatch_control_pid(s
);
2007 s
->control_command
= s
->control_command
->command_next
;
2009 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2016 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2018 if (s
->state
== SOCKET_START_POST
)
2019 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2020 else if (s
->state
== SOCKET_STOP_POST
)
2021 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2023 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2026 static int socket_start(Unit
*u
) {
2027 Socket
*s
= SOCKET(u
);
2031 /* We cannot fulfill this request right now, try again later
2033 if (IN_SET(s
->state
,
2035 SOCKET_STOP_PRE_SIGKILL
,
2036 SOCKET_STOP_PRE_SIGTERM
,
2038 SOCKET_FINAL_SIGTERM
,
2039 SOCKET_FINAL_SIGKILL
))
2042 /* Already on it! */
2043 if (IN_SET(s
->state
,
2049 /* Cannot run this without the service being around */
2050 if (UNIT_ISSET(s
->service
)) {
2053 service
= SERVICE(UNIT_DEREF(s
->service
));
2055 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2056 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2060 /* If the service is already active we cannot start the
2062 if (service
->state
!= SERVICE_DEAD
&&
2063 service
->state
!= SERVICE_FAILED
&&
2064 service
->state
!= SERVICE_AUTO_RESTART
) {
2065 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2070 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2072 s
->result
= SOCKET_SUCCESS
;
2073 s
->reset_cpu_usage
= true;
2075 socket_enter_start_pre(s
);
2080 static int socket_stop(Unit
*u
) {
2081 Socket
*s
= SOCKET(u
);
2086 if (IN_SET(s
->state
,
2088 SOCKET_STOP_PRE_SIGTERM
,
2089 SOCKET_STOP_PRE_SIGKILL
,
2091 SOCKET_FINAL_SIGTERM
,
2092 SOCKET_FINAL_SIGKILL
))
2095 /* If there's already something running we go directly into
2097 if (IN_SET(s
->state
,
2100 SOCKET_START_POST
)) {
2101 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2105 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2107 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2111 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2112 Socket
*s
= SOCKET(u
);
2120 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2121 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2122 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2124 if (s
->control_pid
> 0)
2125 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2127 if (s
->control_command_id
>= 0)
2128 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2130 LIST_FOREACH(port
, p
, s
->ports
) {
2136 copy
= fdset_put_dup(fds
, p
->fd
);
2140 if (p
->type
== SOCKET_SOCKET
) {
2141 _cleanup_free_
char *t
= NULL
;
2143 r
= socket_address_print(&p
->address
, &t
);
2147 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2148 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2150 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2152 } else if (p
->type
== SOCKET_SPECIAL
)
2153 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2154 else if (p
->type
== SOCKET_MQUEUE
)
2155 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2156 else if (p
->type
== SOCKET_USB_FUNCTION
)
2157 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2159 assert(p
->type
== SOCKET_FIFO
);
2160 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2167 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2168 Socket
*s
= SOCKET(u
);
2174 if (streq(key
, "state")) {
2177 state
= socket_state_from_string(value
);
2179 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2181 s
->deserialized_state
= state
;
2182 } else if (streq(key
, "result")) {
2185 f
= socket_result_from_string(value
);
2187 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2188 else if (f
!= SOCKET_SUCCESS
)
2191 } else if (streq(key
, "n-accepted")) {
2194 if (safe_atou(value
, &k
) < 0)
2195 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2198 } else if (streq(key
, "control-pid")) {
2201 if (parse_pid(value
, &pid
) < 0)
2202 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2204 s
->control_pid
= pid
;
2205 } else if (streq(key
, "control-command")) {
2206 SocketExecCommand id
;
2208 id
= socket_exec_command_from_string(value
);
2210 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2212 s
->control_command_id
= id
;
2213 s
->control_command
= s
->exec_command
[id
];
2215 } else if (streq(key
, "fifo")) {
2219 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2220 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2223 LIST_FOREACH(port
, p
, s
->ports
)
2224 if (p
->type
== SOCKET_FIFO
&&
2225 path_equal_or_files_same(p
->path
, value
+skip
))
2230 p
->fd
= fdset_remove(fds
, fd
);
2234 } else if (streq(key
, "special")) {
2238 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2239 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2242 LIST_FOREACH(port
, p
, s
->ports
)
2243 if (p
->type
== SOCKET_SPECIAL
&&
2244 path_equal_or_files_same(p
->path
, value
+skip
))
2249 p
->fd
= fdset_remove(fds
, fd
);
2253 } else if (streq(key
, "mqueue")) {
2257 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2258 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2261 LIST_FOREACH(port
, p
, s
->ports
)
2262 if (p
->type
== SOCKET_MQUEUE
&&
2263 streq(p
->path
, value
+skip
))
2268 p
->fd
= fdset_remove(fds
, fd
);
2272 } else if (streq(key
, "socket")) {
2273 int fd
, type
, skip
= 0;
2276 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2277 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2280 LIST_FOREACH(port
, p
, s
->ports
)
2281 if (socket_address_is(&p
->address
, value
+skip
, type
))
2286 p
->fd
= fdset_remove(fds
, fd
);
2290 } else if (streq(key
, "netlink")) {
2294 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2295 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2298 LIST_FOREACH(port
, p
, s
->ports
)
2299 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2304 p
->fd
= fdset_remove(fds
, fd
);
2308 } else if (streq(key
, "ffs")) {
2312 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2313 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2316 LIST_FOREACH(port
, p
, s
->ports
)
2317 if (p
->type
== SOCKET_USB_FUNCTION
&&
2318 path_equal_or_files_same(p
->path
, value
+skip
))
2323 p
->fd
= fdset_remove(fds
, fd
);
2328 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2333 static int socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2334 Socket
*s
= SOCKET(u
);
2339 LIST_FOREACH(port
, p
, s
->ports
) {
2343 if (p
->type
!= SOCKET_SOCKET
)
2349 FDSET_FOREACH(fd
, fds
, i
) {
2350 if (socket_address_matches_fd(&p
->address
, fd
)) {
2351 p
->fd
= fdset_remove(fds
, fd
);
2352 s
->deserialized_state
= SOCKET_LISTENING
;
2361 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2364 return state_translation_table
[SOCKET(u
)->state
];
2367 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2370 return socket_state_to_string(SOCKET(u
)->state
);
2373 const char* socket_port_type_to_string(SocketPort
*p
) {
2381 switch (p
->address
.type
) {
2389 case SOCK_SEQPACKET
:
2390 return "SequentialPacket";
2393 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2400 case SOCKET_SPECIAL
:
2404 return "MessageQueue";
2409 case SOCKET_USB_FUNCTION
:
2410 return "USBFunction";
2417 _pure_
static bool socket_check_gc(Unit
*u
) {
2418 Socket
*s
= SOCKET(u
);
2422 return s
->n_connections
> 0;
2425 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2426 SocketPort
*p
= userdata
;
2432 if (p
->socket
->state
!= SOCKET_LISTENING
)
2435 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2437 if (revents
!= EPOLLIN
) {
2439 if (revents
& EPOLLHUP
)
2440 log_unit_error(UNIT(p
->socket
), "Got POLLHUP on a listening socket. The service probably invoked shutdown() on it, and should better not do that.");
2442 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2446 if (p
->socket
->accept
&&
2447 p
->type
== SOCKET_SOCKET
&&
2448 socket_address_can_accept(&p
->address
)) {
2452 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2458 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2465 socket_apply_socket_options(p
->socket
, cfd
);
2468 socket_enter_running(p
->socket
, cfd
);
2472 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2476 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2477 Socket
*s
= SOCKET(u
);
2483 if (pid
!= s
->control_pid
)
2488 if (is_clean_exit(code
, status
, NULL
))
2490 else if (code
== CLD_EXITED
)
2491 f
= SOCKET_FAILURE_EXIT_CODE
;
2492 else if (code
== CLD_KILLED
)
2493 f
= SOCKET_FAILURE_SIGNAL
;
2494 else if (code
== CLD_DUMPED
)
2495 f
= SOCKET_FAILURE_CORE_DUMP
;
2497 assert_not_reached("Unknown sigchld code");
2499 if (s
->control_command
) {
2500 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2502 if (s
->control_command
->ignore
)
2506 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2507 "Control process exited, code=%s status=%i",
2508 sigchld_code_to_string(code
), status
);
2510 if (f
!= SOCKET_SUCCESS
)
2513 if (s
->control_command
&&
2514 s
->control_command
->command_next
&&
2515 f
== SOCKET_SUCCESS
) {
2517 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2520 s
->control_command
= NULL
;
2521 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2523 /* No further commands for this step, so let's figure
2524 * out what to do next */
2526 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2530 case SOCKET_START_PRE
:
2531 if (f
== SOCKET_SUCCESS
)
2532 socket_enter_start_chown(s
);
2534 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2537 case SOCKET_START_CHOWN
:
2538 if (f
== SOCKET_SUCCESS
)
2539 socket_enter_start_post(s
);
2541 socket_enter_stop_pre(s
, f
);
2544 case SOCKET_START_POST
:
2545 if (f
== SOCKET_SUCCESS
)
2546 socket_enter_listening(s
);
2548 socket_enter_stop_pre(s
, f
);
2551 case SOCKET_STOP_PRE
:
2552 case SOCKET_STOP_PRE_SIGTERM
:
2553 case SOCKET_STOP_PRE_SIGKILL
:
2554 socket_enter_stop_post(s
, f
);
2557 case SOCKET_STOP_POST
:
2558 case SOCKET_FINAL_SIGTERM
:
2559 case SOCKET_FINAL_SIGKILL
:
2560 socket_enter_dead(s
, f
);
2564 assert_not_reached("Uh, control process died at wrong time.");
2568 /* Notify clients about changed exit status */
2569 unit_add_to_dbus_queue(u
);
2572 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2573 Socket
*s
= SOCKET(userdata
);
2576 assert(s
->timer_event_source
== source
);
2580 case SOCKET_START_PRE
:
2581 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2582 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2585 case SOCKET_START_CHOWN
:
2586 case SOCKET_START_POST
:
2587 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2588 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2591 case SOCKET_STOP_PRE
:
2592 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2593 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2596 case SOCKET_STOP_PRE_SIGTERM
:
2597 if (s
->kill_context
.send_sigkill
) {
2598 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2599 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2601 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2602 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2606 case SOCKET_STOP_PRE_SIGKILL
:
2607 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2608 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2611 case SOCKET_STOP_POST
:
2612 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2613 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2616 case SOCKET_FINAL_SIGTERM
:
2617 if (s
->kill_context
.send_sigkill
) {
2618 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2619 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2621 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2622 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2626 case SOCKET_FINAL_SIGKILL
:
2627 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2628 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2632 assert_not_reached("Timeout at wrong time.");
2638 int socket_collect_fds(Socket
*s
, int **fds
) {
2639 int *rfds
, k
= 0, n
= 0;
2645 /* Called from the service code for requesting our fds */
2647 LIST_FOREACH(port
, p
, s
->ports
) {
2650 n
+= p
->n_auxiliary_fds
;
2662 LIST_FOREACH(port
, p
, s
->ports
) {
2667 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2668 rfds
[k
++] = p
->auxiliary_fds
[i
];
2677 static void socket_reset_failed(Unit
*u
) {
2678 Socket
*s
= SOCKET(u
);
2682 if (s
->state
== SOCKET_FAILED
)
2683 socket_set_state(s
, SOCKET_DEAD
);
2685 s
->result
= SOCKET_SUCCESS
;
2688 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2691 /* The service is dead. Dang!
2693 * This is strictly for one-instance-for-all-connections
2696 if (s
->state
== SOCKET_RUNNING
) {
2697 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2698 if (failed_permanent
)
2699 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2701 socket_enter_listening(s
);
2705 void socket_connection_unref(Socket
*s
) {
2708 /* The service is dead. Yay!
2710 * This is strictly for one-instance-per-connection
2713 assert(s
->n_connections
> 0);
2716 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2719 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2720 Socket
*s
= SOCKET(u
);
2726 /* Don't propagate state changes from the service if we are
2727 already down or accepting connections */
2728 if ((s
->state
!= SOCKET_RUNNING
&&
2729 s
->state
!= SOCKET_LISTENING
) ||
2733 if (other
->load_state
!= UNIT_LOADED
||
2734 other
->type
!= UNIT_SERVICE
)
2737 se
= SERVICE(other
);
2739 if (se
->state
== SERVICE_FAILED
)
2740 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2742 if (se
->state
== SERVICE_DEAD
||
2743 se
->state
== SERVICE_FINAL_SIGTERM
||
2744 se
->state
== SERVICE_FINAL_SIGKILL
||
2745 se
->state
== SERVICE_AUTO_RESTART
)
2746 socket_notify_service_dead(s
, false);
2748 if (se
->state
== SERVICE_RUNNING
)
2749 socket_set_state(s
, SOCKET_RUNNING
);
2752 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2753 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2756 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2757 Socket
*s
= SOCKET(u
);
2760 if (!s
->timer_event_source
)
2763 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2770 char *socket_fdname(Socket
*s
) {
2773 /* Returns the name to use for $LISTEN_NAMES. If the user
2774 * didn't specify anything specifically, use the socket unit's
2775 * name as fallback. */
2783 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2784 [SOCKET_EXEC_START_PRE
] = "StartPre",
2785 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2786 [SOCKET_EXEC_START_POST
] = "StartPost",
2787 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2788 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2791 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2793 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2794 [SOCKET_SUCCESS
] = "success",
2795 [SOCKET_FAILURE_RESOURCES
] = "resources",
2796 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2797 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2798 [SOCKET_FAILURE_SIGNAL
] = "signal",
2799 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2800 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2803 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2805 const UnitVTable socket_vtable
= {
2806 .object_size
= sizeof(Socket
),
2807 .exec_context_offset
= offsetof(Socket
, exec_context
),
2808 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2809 .kill_context_offset
= offsetof(Socket
, kill_context
),
2810 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2816 .private_section
= "Socket",
2818 .init
= socket_init
,
2819 .done
= socket_done
,
2820 .load
= socket_load
,
2822 .coldplug
= socket_coldplug
,
2824 .dump
= socket_dump
,
2826 .start
= socket_start
,
2827 .stop
= socket_stop
,
2829 .kill
= socket_kill
,
2831 .get_timeout
= socket_get_timeout
,
2833 .serialize
= socket_serialize
,
2834 .deserialize_item
= socket_deserialize_item
,
2835 .distribute_fds
= socket_distribute_fds
,
2837 .active_state
= socket_active_state
,
2838 .sub_state_to_string
= socket_sub_state_to_string
,
2840 .check_gc
= socket_check_gc
,
2842 .sigchld_event
= socket_sigchld_event
,
2844 .trigger_notify
= socket_trigger_notify
,
2846 .reset_failed
= socket_reset_failed
,
2848 .bus_vtable
= bus_socket_vtable
,
2849 .bus_set_property
= bus_socket_set_property
,
2850 .bus_commit_properties
= bus_socket_commit_properties
,
2852 .status_message_formats
= {
2853 /*.starting_stopping = {
2854 [0] = "Starting socket %s...",
2855 [1] = "Stopping socket %s...",
2857 .finished_start_job
= {
2858 [JOB_DONE
] = "Listening on %s.",
2859 [JOB_FAILED
] = "Failed to listen on %s.",
2860 [JOB_TIMEOUT
] = "Timed out starting %s.",
2862 .finished_stop_job
= {
2863 [JOB_DONE
] = "Closed %s.",
2864 [JOB_FAILED
] = "Failed stopping %s.",
2865 [JOB_TIMEOUT
] = "Timed out stopping %s.",