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"
40 #include "formats-util.h"
45 #include "path-util.h"
46 #include "selinux-util.h"
47 #include "signal-util.h"
48 #include "smack-util.h"
51 #include "string-util.h"
53 #include "unit-name.h"
54 #include "unit-printf.h"
57 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
58 [SOCKET_DEAD
] = UNIT_INACTIVE
,
59 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
60 [SOCKET_START_CHOWN
] = UNIT_ACTIVATING
,
61 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
62 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
63 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
64 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
65 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
66 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
67 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
68 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
69 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
70 [SOCKET_FAILED
] = UNIT_FAILED
73 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
74 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
76 static void socket_init(Unit
*u
) {
77 Socket
*s
= SOCKET(u
);
80 assert(u
->load_state
== UNIT_STUB
);
82 s
->backlog
= SOMAXCONN
;
83 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
84 s
->directory_mode
= 0755;
85 s
->socket_mode
= 0666;
87 s
->max_connections
= 64;
94 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
95 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
97 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
100 static void socket_unwatch_control_pid(Socket
*s
) {
103 if (s
->control_pid
<= 0)
106 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
110 static void socket_cleanup_fd_list(SocketPort
*p
) {
111 int k
= p
->n_auxiliary_fds
;
114 safe_close(p
->auxiliary_fds
[k
]);
116 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
117 p
->n_auxiliary_fds
= 0;
120 void socket_free_ports(Socket
*s
) {
125 while ((p
= s
->ports
)) {
126 LIST_REMOVE(port
, s
->ports
, p
);
128 sd_event_source_unref(p
->event_source
);
130 socket_cleanup_fd_list(p
);
137 static void socket_done(Unit
*u
) {
138 Socket
*s
= SOCKET(u
);
142 socket_free_ports(s
);
144 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
145 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
146 s
->control_command
= NULL
;
148 socket_unwatch_control_pid(s
);
150 unit_ref_unset(&s
->service
);
152 s
->tcp_congestion
= mfree(s
->tcp_congestion
);
153 s
->bind_to_device
= mfree(s
->bind_to_device
);
156 free(s
->smack_ip_in
);
157 free(s
->smack_ip_out
);
159 strv_free(s
->symlinks
);
164 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
167 static int socket_arm_timer(Socket
*s
) {
172 if (s
->timeout_usec
<= 0) {
173 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
177 if (s
->timer_event_source
) {
178 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
182 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
185 r
= sd_event_add_time(
186 UNIT(s
)->manager
->event
,
187 &s
->timer_event_source
,
189 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
190 socket_dispatch_timer
, s
);
194 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
199 int socket_instantiate_service(Socket
*s
) {
200 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
206 /* This fills in s->service if it isn't filled in yet. For
207 * Accept=yes sockets we create the next connection service
208 * here. For Accept=no this is mostly a NOP since the service
209 * is figured out at load time anyway. */
211 if (UNIT_DEREF(s
->service
))
217 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
221 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
224 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
229 unit_ref_set(&s
->service
, u
);
231 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
234 static bool have_non_accept_socket(Socket
*s
) {
242 LIST_FOREACH(port
, p
, s
->ports
) {
244 if (p
->type
!= SOCKET_SOCKET
)
247 if (!socket_address_can_accept(&p
->address
))
254 static int socket_add_mount_links(Socket
*s
) {
260 LIST_FOREACH(port
, p
, s
->ports
) {
261 const char *path
= NULL
;
263 if (p
->type
== SOCKET_SOCKET
)
264 path
= socket_address_get_path(&p
->address
);
265 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
271 r
= unit_require_mounts_for(UNIT(s
), path
);
279 static int socket_add_device_link(Socket
*s
) {
284 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
287 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
288 return unit_add_node_link(UNIT(s
), t
, false);
291 static int socket_add_default_dependencies(Socket
*s
) {
295 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
299 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
300 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
305 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
308 _pure_
static bool socket_has_exec(Socket
*s
) {
312 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
313 if (s
->exec_command
[i
])
319 static int socket_add_extras(Socket
*s
) {
325 if (have_non_accept_socket(s
)) {
327 if (!UNIT_DEREF(s
->service
)) {
330 r
= unit_load_related_unit(u
, ".service", &x
);
334 unit_ref_set(&s
->service
, x
);
337 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
342 r
= socket_add_mount_links(s
);
346 r
= socket_add_device_link(s
);
350 r
= unit_patch_contexts(u
);
354 if (socket_has_exec(s
)) {
355 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
359 r
= unit_set_default_slice(u
);
364 if (u
->default_dependencies
) {
365 r
= socket_add_default_dependencies(s
);
373 static const char *socket_find_symlink_target(Socket
*s
) {
374 const char *found
= NULL
;
377 LIST_FOREACH(port
, p
, s
->ports
) {
378 const char *f
= NULL
;
387 if (p
->address
.sockaddr
.un
.sun_path
[0] != 0)
388 f
= p
->address
.sockaddr
.un
.sun_path
;
406 static int socket_verify(Socket
*s
) {
409 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
413 log_unit_error(UNIT(s
), "Unit lacks Listen setting. Refusing.");
417 if (s
->accept
&& have_non_accept_socket(s
)) {
418 log_unit_error(UNIT(s
), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
422 if (s
->accept
&& s
->max_connections
<= 0) {
423 log_unit_error(UNIT(s
), "MaxConnection= setting too small. Refusing.");
427 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
428 log_unit_error(UNIT(s
), "Explicit service configuration for accepting socket units not supported. Refusing.");
432 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
433 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing.");
437 if (!strv_isempty(s
->symlinks
) && !socket_find_symlink_target(s
)) {
438 log_unit_error(UNIT(s
), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
445 static int socket_load(Unit
*u
) {
446 Socket
*s
= SOCKET(u
);
450 assert(u
->load_state
== UNIT_STUB
);
452 r
= unit_load_fragment_and_dropin(u
);
456 if (u
->load_state
== UNIT_LOADED
) {
457 /* This is a new unit? Then let's add in some extras */
458 r
= socket_add_extras(s
);
463 return socket_verify(s
);
466 _const_
static const char* listen_lookup(int family
, int type
) {
468 if (family
== AF_NETLINK
)
469 return "ListenNetlink";
471 if (type
== SOCK_STREAM
)
472 return "ListenStream";
473 else if (type
== SOCK_DGRAM
)
474 return "ListenDatagram";
475 else if (type
== SOCK_SEQPACKET
)
476 return "ListenSequentialPacket";
478 assert_not_reached("Unknown socket type");
482 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
483 char time_string
[FORMAT_TIMESPAN_MAX
];
485 Socket
*s
= SOCKET(u
);
492 prefix
= strempty(prefix
);
493 prefix2
= strjoina(prefix
, "\t");
496 "%sSocket State: %s\n"
498 "%sBindIPv6Only: %s\n"
500 "%sSocketMode: %04o\n"
501 "%sDirectoryMode: %04o\n"
505 "%sTransparent: %s\n"
507 "%sPassCredentials: %s\n"
508 "%sPassSecurity: %s\n"
509 "%sTCPCongestion: %s\n"
510 "%sRemoveOnStop: %s\n"
513 "%sSELinuxContextFromNet: %s\n",
514 prefix
, socket_state_to_string(s
->state
),
515 prefix
, socket_result_to_string(s
->result
),
516 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
518 prefix
, s
->socket_mode
,
519 prefix
, s
->directory_mode
,
520 prefix
, yes_no(s
->keep_alive
),
521 prefix
, yes_no(s
->no_delay
),
522 prefix
, yes_no(s
->free_bind
),
523 prefix
, yes_no(s
->transparent
),
524 prefix
, yes_no(s
->broadcast
),
525 prefix
, yes_no(s
->pass_cred
),
526 prefix
, yes_no(s
->pass_sec
),
527 prefix
, strna(s
->tcp_congestion
),
528 prefix
, yes_no(s
->remove_on_stop
),
529 prefix
, yes_no(s
->writable
),
530 prefix
, socket_fdname(s
),
531 prefix
, yes_no(s
->selinux_context_from_net
));
533 if (s
->control_pid
> 0)
535 "%sControl PID: "PID_FMT
"\n",
536 prefix
, s
->control_pid
);
538 if (s
->bind_to_device
)
540 "%sBindToDevice: %s\n",
541 prefix
, s
->bind_to_device
);
546 "%sNConnections: %u\n"
547 "%sMaxConnections: %u\n",
548 prefix
, s
->n_accepted
,
549 prefix
, s
->n_connections
,
550 prefix
, s
->max_connections
);
552 if (s
->priority
>= 0)
555 prefix
, s
->priority
);
557 if (s
->receive_buffer
> 0)
559 "%sReceiveBuffer: %zu\n",
560 prefix
, s
->receive_buffer
);
562 if (s
->send_buffer
> 0)
564 "%sSendBuffer: %zu\n",
565 prefix
, s
->send_buffer
);
577 if (s
->pipe_size
> 0)
580 prefix
, s
->pipe_size
);
587 if (s
->mq_maxmsg
> 0)
589 "%sMessageQueueMaxMessages: %li\n",
590 prefix
, s
->mq_maxmsg
);
592 if (s
->mq_msgsize
> 0)
594 "%sMessageQueueMessageSize: %li\n",
595 prefix
, s
->mq_msgsize
);
600 prefix
, yes_no(s
->reuse_port
));
604 "%sSmackLabel: %s\n",
609 "%sSmackLabelIPIn: %s\n",
610 prefix
, s
->smack_ip_in
);
614 "%sSmackLabelIPOut: %s\n",
615 prefix
, s
->smack_ip_out
);
617 if (!isempty(s
->user
) || !isempty(s
->group
))
620 "%sOwnerGroup: %s\n",
621 prefix
, strna(s
->user
),
622 prefix
, strna(s
->group
));
624 if (s
->keep_alive_time
> 0)
626 "%sKeepAliveTimeSec: %s\n",
627 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_time
, USEC_PER_SEC
));
629 if (s
->keep_alive_interval
)
631 "%sKeepAliveIntervalSec: %s\n",
632 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_interval
, USEC_PER_SEC
));
634 if (s
->keep_alive_cnt
)
636 "%sKeepAliveProbes: %u\n",
637 prefix
, s
->keep_alive_cnt
);
641 "%sDeferAcceptSec: %s\n",
642 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->defer_accept
, USEC_PER_SEC
));
644 LIST_FOREACH(port
, p
, s
->ports
) {
646 if (p
->type
== SOCKET_SOCKET
) {
651 r
= socket_address_print(&p
->address
, &k
);
657 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
659 } else if (p
->type
== SOCKET_SPECIAL
)
660 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
661 else if (p
->type
== SOCKET_USB_FUNCTION
)
662 fprintf(f
, "%sListenUSBFunction: %s\n", prefix
, p
->path
);
663 else if (p
->type
== SOCKET_MQUEUE
)
664 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
666 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
669 exec_context_dump(&s
->exec_context
, f
, prefix
);
670 kill_context_dump(&s
->kill_context
, f
, prefix
);
672 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
673 if (!s
->exec_command
[c
])
676 fprintf(f
, "%s-> %s:\n",
677 prefix
, socket_exec_command_to_string(c
));
679 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
683 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
686 union sockaddr_union local
, remote
;
692 if (getsockname(fd
, &local
.sa
, &l
) < 0)
696 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
699 switch (local
.sa
.sa_family
) {
703 a
= ntohl(local
.in
.sin_addr
.s_addr
),
704 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
707 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
709 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
710 ntohs(local
.in
.sin_port
),
711 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
712 ntohs(remote
.in
.sin_port
)) < 0)
719 static const unsigned char ipv4_prefix
[] = {
720 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
723 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
724 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
726 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
727 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
730 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
732 a
[0], a
[1], a
[2], a
[3],
733 ntohs(local
.in6
.sin6_port
),
734 b
[0], b
[1], b
[2], b
[3],
735 ntohs(remote
.in6
.sin6_port
)) < 0)
738 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
743 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
744 ntohs(local
.in6
.sin6_port
),
745 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
746 ntohs(remote
.in6
.sin6_port
)) < 0)
757 k
= getpeercred(fd
, &ucred
);
760 "%u-"PID_FMT
"-"UID_FMT
,
761 nr
, ucred
.pid
, ucred
.uid
) < 0)
763 } else if (k
== -ENODATA
) {
764 /* This handles the case where somebody is
765 * connecting from another pid/uid namespace
766 * (e.g. from outside of our container). */
778 assert_not_reached("Unhandled socket type.");
785 static void socket_close_fds(Socket
*s
) {
791 LIST_FOREACH(port
, p
, s
->ports
) {
793 p
->event_source
= sd_event_source_unref(p
->event_source
);
798 p
->fd
= safe_close(p
->fd
);
799 socket_cleanup_fd_list(p
);
801 /* One little note: we should normally not delete any
802 * sockets in the file system here! After all some
803 * other process we spawned might still have a
804 * reference of this fd and wants to continue to use
805 * it. Therefore we delete sockets in the file system
806 * before we create a new one, not after we stopped
809 if (s
->remove_on_stop
) {
821 socket_address_unlink(&p
->address
);
830 if (s
->remove_on_stop
)
831 STRV_FOREACH(i
, s
->symlinks
)
835 static void socket_apply_socket_options(Socket
*s
, int fd
) {
842 int b
= s
->keep_alive
;
843 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
844 log_unit_warning_errno(UNIT(s
), errno
, "SO_KEEPALIVE failed: %m");
847 if (s
->keep_alive_time
) {
848 int value
= s
->keep_alive_time
/ USEC_PER_SEC
;
849 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPIDLE
, &value
, sizeof(value
)) < 0)
850 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPIDLE failed: %m");
853 if (s
->keep_alive_interval
) {
854 int value
= s
->keep_alive_interval
/ USEC_PER_SEC
;
855 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPINTVL
, &value
, sizeof(value
)) < 0)
856 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPINTVL failed: %m");
859 if (s
->keep_alive_cnt
) {
860 int value
= s
->keep_alive_cnt
;
861 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPCNT
, &value
, sizeof(value
)) < 0)
862 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPCNT failed: %m");
865 if (s
->defer_accept
) {
866 int value
= s
->defer_accept
/ USEC_PER_SEC
;
867 if (setsockopt(fd
, SOL_TCP
, TCP_DEFER_ACCEPT
, &value
, sizeof(value
)) < 0)
868 log_unit_warning_errno(UNIT(s
), errno
, "TCP_DEFER_ACCEPT failed: %m");
873 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
874 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
879 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
880 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
885 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
886 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
891 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
892 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
895 if (s
->priority
>= 0)
896 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
897 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
899 if (s
->receive_buffer
> 0) {
900 int value
= (int) s
->receive_buffer
;
902 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
904 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
905 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
906 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
909 if (s
->send_buffer
> 0) {
910 int value
= (int) s
->send_buffer
;
911 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
912 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
913 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
917 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
918 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
921 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
922 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
924 if (s
->ip_ttl
>= 0) {
927 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
929 if (socket_ipv6_is_supported())
930 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
933 errno
= EAFNOSUPPORT
;
937 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
940 if (s
->tcp_congestion
)
941 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
942 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
944 if (s
->smack_ip_in
) {
945 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
947 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
950 if (s
->smack_ip_out
) {
951 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
953 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
957 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
963 if (s
->pipe_size
> 0)
964 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
965 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
968 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
970 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
974 static int fifo_address_create(
976 mode_t directory_mode
,
977 mode_t socket_mode
) {
979 _cleanup_close_
int fd
= -1;
986 mkdir_parents_label(path
, directory_mode
);
988 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
992 /* Enforce the right access mode for the fifo */
993 old_mask
= umask(~ socket_mode
);
995 /* Include the original umask in our mask */
996 (void) umask(~socket_mode
| old_mask
);
998 r
= mkfifo(path
, socket_mode
);
999 (void) umask(old_mask
);
1001 if (r
< 0 && errno
!= EEXIST
) {
1006 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1012 mac_selinux_create_file_clear();
1014 if (fstat(fd
, &st
) < 0) {
1019 if (!S_ISFIFO(st
.st_mode
) ||
1020 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1021 st
.st_uid
!= getuid() ||
1022 st
.st_gid
!= getgid()) {
1033 mac_selinux_create_file_clear();
1037 static int special_address_create(const char *path
, bool writable
) {
1038 _cleanup_close_
int fd
= -1;
1044 fd
= open(path
, (writable
? O_RDWR
: O_RDONLY
)|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1048 if (fstat(fd
, &st
) < 0)
1051 /* Check whether this is a /proc, /sys or /dev file or char device */
1052 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1061 static int usbffs_address_create(const char *path
) {
1062 _cleanup_close_
int fd
= -1;
1068 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1072 if (fstat(fd
, &st
) < 0)
1075 /* Check whether this is a regular file (ffs endpoint)*/
1076 if (!S_ISREG(st
.st_mode
))
1085 static int mq_address_create(
1091 _cleanup_close_
int fd
= -1;
1094 struct mq_attr _attr
, *attr
= NULL
;
1099 if (maxmsg
> 0 && msgsize
> 0) {
1100 _attr
= (struct mq_attr
) {
1101 .mq_flags
= O_NONBLOCK
,
1102 .mq_maxmsg
= maxmsg
,
1103 .mq_msgsize
= msgsize
,
1108 /* Enforce the right access mode for the mq */
1109 old_mask
= umask(~ mq_mode
);
1111 /* Include the original umask in our mask */
1112 (void) umask(~mq_mode
| old_mask
);
1113 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1114 (void) umask(old_mask
);
1119 if (fstat(fd
, &st
) < 0)
1122 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1123 st
.st_uid
!= getuid() ||
1124 st
.st_gid
!= getgid())
1133 static int socket_symlink(Socket
*s
) {
1139 p
= socket_find_symlink_target(s
);
1143 STRV_FOREACH(i
, s
->symlinks
)
1144 symlink_label(p
, *i
);
1149 static int usbffs_write_descs(int fd
, Service
*s
) {
1152 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1155 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1159 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1162 static int usbffs_select_ep(const struct dirent
*d
) {
1163 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1166 static int usbffs_dispatch_eps(SocketPort
*p
) {
1167 _cleanup_free_
struct dirent
**ent
= NULL
;
1168 _cleanup_free_
char *path
= NULL
;
1171 r
= path_get_parent(p
->path
, &path
);
1175 r
= scandir(path
, &ent
, usbffs_select_ep
, alphasort
);
1180 p
->auxiliary_fds
= new(int, n
);
1181 if (!p
->auxiliary_fds
)
1184 p
->n_auxiliary_fds
= n
;
1187 for (i
= 0; i
< n
; ++i
) {
1188 _cleanup_free_
char *ep
= NULL
;
1190 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1194 path_kill_slashes(ep
);
1196 r
= usbffs_address_create(ep
);
1200 p
->auxiliary_fds
[k
] = r
;
1209 close_many(p
->auxiliary_fds
, k
);
1210 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1211 p
->n_auxiliary_fds
= 0;
1216 static int socket_open_fds(Socket
*s
) {
1217 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1218 bool know_label
= false;
1224 LIST_FOREACH(port
, p
, s
->ports
) {
1234 /* Figure out label, if we don't it know
1235 * yet. We do it once, for the first
1236 * socket where we need this and
1237 * remember it for the rest. */
1239 if (s
->selinux_context_from_net
) {
1240 /* Get it from the network label */
1242 r
= mac_selinux_get_our_label(&label
);
1243 if (r
< 0 && r
!= -EOPNOTSUPP
)
1247 /* Get it from the executable we are about to start */
1249 r
= socket_instantiate_service(s
);
1253 if (UNIT_ISSET(s
->service
) &&
1254 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1255 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1256 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1264 r
= socket_address_listen(
1266 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1280 socket_apply_socket_options(s
, p
->fd
);
1284 case SOCKET_SPECIAL
:
1286 p
->fd
= special_address_create(p
->path
, s
->writable
);
1295 p
->fd
= fifo_address_create(
1304 socket_apply_fifo_options(s
, p
->fd
);
1310 p
->fd
= mq_address_create(
1321 case SOCKET_USB_FUNCTION
:
1323 p
->fd
= usbffs_address_create(p
->path
);
1329 r
= usbffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1333 r
= usbffs_dispatch_eps(p
);
1340 assert_not_reached("Unknown port type");
1347 socket_close_fds(s
);
1351 static void socket_unwatch_fds(Socket
*s
) {
1357 LIST_FOREACH(port
, p
, s
->ports
) {
1361 if (!p
->event_source
)
1364 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1366 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1370 static int socket_watch_fds(Socket
*s
) {
1376 LIST_FOREACH(port
, p
, s
->ports
) {
1380 if (p
->event_source
) {
1381 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1385 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1389 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1396 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1397 socket_unwatch_fds(s
);
1401 static void socket_set_state(Socket
*s
, SocketState state
) {
1402 SocketState old_state
;
1405 old_state
= s
->state
;
1413 SOCKET_STOP_PRE_SIGTERM
,
1414 SOCKET_STOP_PRE_SIGKILL
,
1416 SOCKET_FINAL_SIGTERM
,
1417 SOCKET_FINAL_SIGKILL
)) {
1419 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1420 socket_unwatch_control_pid(s
);
1421 s
->control_command
= NULL
;
1422 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1425 if (state
!= SOCKET_LISTENING
)
1426 socket_unwatch_fds(s
);
1434 SOCKET_STOP_PRE_SIGTERM
,
1435 SOCKET_STOP_PRE_SIGKILL
))
1436 socket_close_fds(s
);
1438 if (state
!= old_state
)
1439 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1441 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1444 static int socket_coldplug(Unit
*u
) {
1445 Socket
*s
= SOCKET(u
);
1449 assert(s
->state
== SOCKET_DEAD
);
1451 if (s
->deserialized_state
== s
->state
)
1454 if (IN_SET(s
->deserialized_state
,
1459 SOCKET_STOP_PRE_SIGTERM
,
1460 SOCKET_STOP_PRE_SIGKILL
,
1462 SOCKET_FINAL_SIGTERM
,
1463 SOCKET_FINAL_SIGKILL
)) {
1465 if (s
->control_pid
<= 0)
1468 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1472 r
= socket_arm_timer(s
);
1477 if (IN_SET(s
->deserialized_state
,
1483 SOCKET_STOP_PRE_SIGTERM
,
1484 SOCKET_STOP_PRE_SIGKILL
)) {
1485 r
= socket_open_fds(s
);
1490 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1491 r
= socket_watch_fds(s
);
1496 socket_set_state(s
, s
->deserialized_state
);
1500 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1501 _cleanup_free_
char **argv
= NULL
;
1504 ExecParameters exec_params
= {
1505 .apply_permissions
= true,
1506 .apply_chroot
= true,
1507 .apply_tty_stdin
= true,
1508 .bus_endpoint_fd
= -1,
1518 (void) unit_realize_cgroup(UNIT(s
));
1519 if (s
->reset_cpu_usage
) {
1520 (void) unit_reset_cpu_usage(UNIT(s
));
1521 s
->reset_cpu_usage
= false;
1524 r
= unit_setup_exec_runtime(UNIT(s
));
1528 r
= socket_arm_timer(s
);
1532 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1536 exec_params
.argv
= argv
;
1537 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1538 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1539 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1540 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1541 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1542 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1544 r
= exec_spawn(UNIT(s
),
1553 r
= unit_watch_pid(UNIT(s
), pid
);
1555 /* FIXME: we need to do something here */
1562 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1566 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1570 r
= socket_arm_timer(s
);
1574 /* We have to resolve the user names out-of-process, hence
1575 * let's fork here. It's messy, but well, what can we do? */
1583 uid_t uid
= UID_INVALID
;
1584 gid_t gid
= GID_INVALID
;
1587 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1588 (void) ignore_signals(SIGPIPE
, -1);
1591 if (!isempty(s
->user
)) {
1592 const char *user
= s
->user
;
1594 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1601 if (!isempty(s
->group
)) {
1602 const char *group
= s
->group
;
1604 r
= get_group_creds(&group
, &gid
);
1611 LIST_FOREACH(port
, p
, s
->ports
) {
1612 const char *path
= NULL
;
1614 if (p
->type
== SOCKET_SOCKET
)
1615 path
= socket_address_get_path(&p
->address
);
1616 else if (p
->type
== SOCKET_FIFO
)
1622 if (chown(path
, uid
, gid
) < 0) {
1633 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1638 r
= unit_watch_pid(UNIT(s
), pid
);
1646 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1650 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1653 if (f
!= SOCKET_SUCCESS
)
1656 exec_runtime_destroy(s
->exec_runtime
);
1657 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1659 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1661 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1664 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1666 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1670 if (f
!= SOCKET_SUCCESS
)
1673 socket_unwatch_control_pid(s
);
1674 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1675 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1677 if (s
->control_command
) {
1678 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1682 socket_set_state(s
, SOCKET_STOP_POST
);
1684 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1689 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1690 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1693 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1698 if (f
!= SOCKET_SUCCESS
)
1701 r
= unit_kill_context(
1704 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1705 KILL_KILL
: KILL_TERMINATE
,
1713 r
= socket_arm_timer(s
);
1717 socket_set_state(s
, state
);
1718 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1719 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1720 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1721 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1722 else if (state
== SOCKET_FINAL_SIGTERM
)
1723 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1725 socket_enter_dead(s
, SOCKET_SUCCESS
);
1730 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1732 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1733 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1735 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1738 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1742 if (f
!= SOCKET_SUCCESS
)
1745 socket_unwatch_control_pid(s
);
1746 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1747 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1749 if (s
->control_command
) {
1750 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1754 socket_set_state(s
, SOCKET_STOP_PRE
);
1756 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1761 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1762 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1765 static void socket_enter_listening(Socket
*s
) {
1769 r
= socket_watch_fds(s
);
1771 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1775 socket_set_state(s
, SOCKET_LISTENING
);
1779 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1782 static void socket_enter_start_post(Socket
*s
) {
1786 socket_unwatch_control_pid(s
);
1787 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1788 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1790 if (s
->control_command
) {
1791 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1793 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1797 socket_set_state(s
, SOCKET_START_POST
);
1799 socket_enter_listening(s
);
1804 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1807 static void socket_enter_start_chown(Socket
*s
) {
1812 r
= socket_open_fds(s
);
1814 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1818 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1820 socket_unwatch_control_pid(s
);
1821 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1822 s
->control_command
= NULL
;
1824 r
= socket_chown(s
, &s
->control_pid
);
1826 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1830 socket_set_state(s
, SOCKET_START_CHOWN
);
1832 socket_enter_start_post(s
);
1837 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1840 static void socket_enter_start_pre(Socket
*s
) {
1844 socket_unwatch_control_pid(s
);
1845 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1846 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1848 if (s
->control_command
) {
1849 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1851 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1855 socket_set_state(s
, SOCKET_START_PRE
);
1857 socket_enter_start_chown(s
);
1862 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1865 static void socket_enter_running(Socket
*s
, int cfd
) {
1866 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1871 /* We don't take connections anymore if we are supposed to
1872 * shut down anyway */
1873 if (unit_stop_pending(UNIT(s
))) {
1875 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1880 /* Flush all sockets by closing and reopening them */
1881 socket_close_fds(s
);
1883 r
= socket_open_fds(s
);
1885 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1886 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1890 r
= socket_watch_fds(s
);
1892 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1893 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1903 bool pending
= false;
1905 /* If there's already a start pending don't bother to
1907 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1908 if (unit_active_or_pending(other
)) {
1914 if (!UNIT_ISSET(s
->service
)) {
1915 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1920 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, true, &error
, NULL
);
1925 socket_set_state(s
, SOCKET_RUNNING
);
1927 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1930 if (s
->n_connections
>= s
->max_connections
) {
1931 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1936 r
= socket_instantiate_service(s
);
1940 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1945 /* ENOTCONN is legitimate if TCP RST was received.
1946 * This connection is over, but the socket unit lives on. */
1951 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1955 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1959 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1963 service
= SERVICE(UNIT_DEREF(s
->service
));
1964 unit_ref_unset(&s
->service
);
1967 UNIT(service
)->no_gc
= false;
1969 unit_choose_id(UNIT(service
), name
);
1971 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1976 s
->n_connections
++;
1978 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, true, &error
, NULL
);
1982 /* Notify clients about changed counters */
1983 unit_add_to_dbus_queue(UNIT(s
));
1989 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
1990 cfd
>= 0 ? "template" : "non-template",
1991 bus_error_message(&error
, r
));
1993 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1997 static void socket_run_next(Socket
*s
) {
2001 assert(s
->control_command
);
2002 assert(s
->control_command
->command_next
);
2004 socket_unwatch_control_pid(s
);
2006 s
->control_command
= s
->control_command
->command_next
;
2008 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2015 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2017 if (s
->state
== SOCKET_START_POST
)
2018 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2019 else if (s
->state
== SOCKET_STOP_POST
)
2020 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2022 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2025 static int socket_start(Unit
*u
) {
2026 Socket
*s
= SOCKET(u
);
2030 /* We cannot fulfill this request right now, try again later
2032 if (IN_SET(s
->state
,
2034 SOCKET_STOP_PRE_SIGKILL
,
2035 SOCKET_STOP_PRE_SIGTERM
,
2037 SOCKET_FINAL_SIGTERM
,
2038 SOCKET_FINAL_SIGKILL
))
2041 /* Already on it! */
2042 if (IN_SET(s
->state
,
2048 /* Cannot run this without the service being around */
2049 if (UNIT_ISSET(s
->service
)) {
2052 service
= SERVICE(UNIT_DEREF(s
->service
));
2054 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2055 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2059 /* If the service is already active we cannot start the
2061 if (service
->state
!= SERVICE_DEAD
&&
2062 service
->state
!= SERVICE_FAILED
&&
2063 service
->state
!= SERVICE_AUTO_RESTART
) {
2064 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2069 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2071 s
->result
= SOCKET_SUCCESS
;
2072 s
->reset_cpu_usage
= true;
2074 socket_enter_start_pre(s
);
2079 static int socket_stop(Unit
*u
) {
2080 Socket
*s
= SOCKET(u
);
2085 if (IN_SET(s
->state
,
2087 SOCKET_STOP_PRE_SIGTERM
,
2088 SOCKET_STOP_PRE_SIGKILL
,
2090 SOCKET_FINAL_SIGTERM
,
2091 SOCKET_FINAL_SIGKILL
))
2094 /* If there's already something running we go directly into
2096 if (IN_SET(s
->state
,
2099 SOCKET_START_POST
)) {
2100 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2104 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2106 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2110 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2111 Socket
*s
= SOCKET(u
);
2119 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2120 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2121 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2123 if (s
->control_pid
> 0)
2124 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2126 if (s
->control_command_id
>= 0)
2127 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2129 LIST_FOREACH(port
, p
, s
->ports
) {
2135 copy
= fdset_put_dup(fds
, p
->fd
);
2139 if (p
->type
== SOCKET_SOCKET
) {
2140 _cleanup_free_
char *t
= NULL
;
2142 r
= socket_address_print(&p
->address
, &t
);
2146 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2147 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2149 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2151 } else if (p
->type
== SOCKET_SPECIAL
)
2152 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2153 else if (p
->type
== SOCKET_MQUEUE
)
2154 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2155 else if (p
->type
== SOCKET_USB_FUNCTION
)
2156 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2158 assert(p
->type
== SOCKET_FIFO
);
2159 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2166 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2167 Socket
*s
= SOCKET(u
);
2173 if (streq(key
, "state")) {
2176 state
= socket_state_from_string(value
);
2178 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2180 s
->deserialized_state
= state
;
2181 } else if (streq(key
, "result")) {
2184 f
= socket_result_from_string(value
);
2186 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2187 else if (f
!= SOCKET_SUCCESS
)
2190 } else if (streq(key
, "n-accepted")) {
2193 if (safe_atou(value
, &k
) < 0)
2194 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2197 } else if (streq(key
, "control-pid")) {
2200 if (parse_pid(value
, &pid
) < 0)
2201 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2203 s
->control_pid
= pid
;
2204 } else if (streq(key
, "control-command")) {
2205 SocketExecCommand id
;
2207 id
= socket_exec_command_from_string(value
);
2209 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2211 s
->control_command_id
= id
;
2212 s
->control_command
= s
->exec_command
[id
];
2214 } else if (streq(key
, "fifo")) {
2218 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2219 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2222 LIST_FOREACH(port
, p
, s
->ports
)
2223 if (p
->type
== SOCKET_FIFO
&&
2224 path_equal_or_files_same(p
->path
, value
+skip
))
2229 p
->fd
= fdset_remove(fds
, fd
);
2233 } else if (streq(key
, "special")) {
2237 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2238 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2241 LIST_FOREACH(port
, p
, s
->ports
)
2242 if (p
->type
== SOCKET_SPECIAL
&&
2243 path_equal_or_files_same(p
->path
, value
+skip
))
2248 p
->fd
= fdset_remove(fds
, fd
);
2252 } else if (streq(key
, "mqueue")) {
2256 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2257 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2260 LIST_FOREACH(port
, p
, s
->ports
)
2261 if (p
->type
== SOCKET_MQUEUE
&&
2262 streq(p
->path
, value
+skip
))
2267 p
->fd
= fdset_remove(fds
, fd
);
2271 } else if (streq(key
, "socket")) {
2272 int fd
, type
, skip
= 0;
2275 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2276 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2279 LIST_FOREACH(port
, p
, s
->ports
)
2280 if (socket_address_is(&p
->address
, value
+skip
, type
))
2285 p
->fd
= fdset_remove(fds
, fd
);
2289 } else if (streq(key
, "netlink")) {
2293 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2294 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2297 LIST_FOREACH(port
, p
, s
->ports
)
2298 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2303 p
->fd
= fdset_remove(fds
, fd
);
2307 } else if (streq(key
, "ffs")) {
2311 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2312 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2315 LIST_FOREACH(port
, p
, s
->ports
)
2316 if (p
->type
== SOCKET_USB_FUNCTION
&&
2317 path_equal_or_files_same(p
->path
, value
+skip
))
2322 p
->fd
= fdset_remove(fds
, fd
);
2327 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2332 static int socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2333 Socket
*s
= SOCKET(u
);
2338 LIST_FOREACH(port
, p
, s
->ports
) {
2342 if (p
->type
!= SOCKET_SOCKET
)
2348 FDSET_FOREACH(fd
, fds
, i
) {
2349 if (socket_address_matches_fd(&p
->address
, fd
)) {
2350 p
->fd
= fdset_remove(fds
, fd
);
2351 s
->deserialized_state
= SOCKET_LISTENING
;
2360 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2363 return state_translation_table
[SOCKET(u
)->state
];
2366 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2369 return socket_state_to_string(SOCKET(u
)->state
);
2372 const char* socket_port_type_to_string(SocketPort
*p
) {
2380 switch (p
->address
.type
) {
2388 case SOCK_SEQPACKET
:
2389 return "SequentialPacket";
2392 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2399 case SOCKET_SPECIAL
:
2403 return "MessageQueue";
2408 case SOCKET_USB_FUNCTION
:
2409 return "USBFunction";
2416 _pure_
static bool socket_check_gc(Unit
*u
) {
2417 Socket
*s
= SOCKET(u
);
2421 return s
->n_connections
> 0;
2424 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2425 SocketPort
*p
= userdata
;
2431 if (p
->socket
->state
!= SOCKET_LISTENING
)
2434 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2436 if (revents
!= EPOLLIN
) {
2438 if (revents
& EPOLLHUP
)
2439 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.");
2441 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2445 if (p
->socket
->accept
&&
2446 p
->type
== SOCKET_SOCKET
&&
2447 socket_address_can_accept(&p
->address
)) {
2451 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2457 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2464 socket_apply_socket_options(p
->socket
, cfd
);
2467 socket_enter_running(p
->socket
, cfd
);
2471 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2475 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2476 Socket
*s
= SOCKET(u
);
2482 if (pid
!= s
->control_pid
)
2487 if (is_clean_exit(code
, status
, NULL
))
2489 else if (code
== CLD_EXITED
)
2490 f
= SOCKET_FAILURE_EXIT_CODE
;
2491 else if (code
== CLD_KILLED
)
2492 f
= SOCKET_FAILURE_SIGNAL
;
2493 else if (code
== CLD_DUMPED
)
2494 f
= SOCKET_FAILURE_CORE_DUMP
;
2496 assert_not_reached("Unknown sigchld code");
2498 if (s
->control_command
) {
2499 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2501 if (s
->control_command
->ignore
)
2505 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2506 "Control process exited, code=%s status=%i",
2507 sigchld_code_to_string(code
), status
);
2509 if (f
!= SOCKET_SUCCESS
)
2512 if (s
->control_command
&&
2513 s
->control_command
->command_next
&&
2514 f
== SOCKET_SUCCESS
) {
2516 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2519 s
->control_command
= NULL
;
2520 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2522 /* No further commands for this step, so let's figure
2523 * out what to do next */
2525 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2529 case SOCKET_START_PRE
:
2530 if (f
== SOCKET_SUCCESS
)
2531 socket_enter_start_chown(s
);
2533 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2536 case SOCKET_START_CHOWN
:
2537 if (f
== SOCKET_SUCCESS
)
2538 socket_enter_start_post(s
);
2540 socket_enter_stop_pre(s
, f
);
2543 case SOCKET_START_POST
:
2544 if (f
== SOCKET_SUCCESS
)
2545 socket_enter_listening(s
);
2547 socket_enter_stop_pre(s
, f
);
2550 case SOCKET_STOP_PRE
:
2551 case SOCKET_STOP_PRE_SIGTERM
:
2552 case SOCKET_STOP_PRE_SIGKILL
:
2553 socket_enter_stop_post(s
, f
);
2556 case SOCKET_STOP_POST
:
2557 case SOCKET_FINAL_SIGTERM
:
2558 case SOCKET_FINAL_SIGKILL
:
2559 socket_enter_dead(s
, f
);
2563 assert_not_reached("Uh, control process died at wrong time.");
2567 /* Notify clients about changed exit status */
2568 unit_add_to_dbus_queue(u
);
2571 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2572 Socket
*s
= SOCKET(userdata
);
2575 assert(s
->timer_event_source
== source
);
2579 case SOCKET_START_PRE
:
2580 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2581 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2584 case SOCKET_START_CHOWN
:
2585 case SOCKET_START_POST
:
2586 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2587 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2590 case SOCKET_STOP_PRE
:
2591 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2592 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2595 case SOCKET_STOP_PRE_SIGTERM
:
2596 if (s
->kill_context
.send_sigkill
) {
2597 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2598 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2600 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2601 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2605 case SOCKET_STOP_PRE_SIGKILL
:
2606 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2607 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2610 case SOCKET_STOP_POST
:
2611 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2612 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2615 case SOCKET_FINAL_SIGTERM
:
2616 if (s
->kill_context
.send_sigkill
) {
2617 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2618 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2620 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2621 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2625 case SOCKET_FINAL_SIGKILL
:
2626 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2627 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2631 assert_not_reached("Timeout at wrong time.");
2637 int socket_collect_fds(Socket
*s
, int **fds
) {
2638 int *rfds
, k
= 0, n
= 0;
2644 /* Called from the service code for requesting our fds */
2646 LIST_FOREACH(port
, p
, s
->ports
) {
2649 n
+= p
->n_auxiliary_fds
;
2661 LIST_FOREACH(port
, p
, s
->ports
) {
2666 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2667 rfds
[k
++] = p
->auxiliary_fds
[i
];
2676 static void socket_reset_failed(Unit
*u
) {
2677 Socket
*s
= SOCKET(u
);
2681 if (s
->state
== SOCKET_FAILED
)
2682 socket_set_state(s
, SOCKET_DEAD
);
2684 s
->result
= SOCKET_SUCCESS
;
2687 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2690 /* The service is dead. Dang!
2692 * This is strictly for one-instance-for-all-connections
2695 if (s
->state
== SOCKET_RUNNING
) {
2696 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2697 if (failed_permanent
)
2698 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2700 socket_enter_listening(s
);
2704 void socket_connection_unref(Socket
*s
) {
2707 /* The service is dead. Yay!
2709 * This is strictly for one-instance-per-connection
2712 assert(s
->n_connections
> 0);
2715 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2718 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2719 Socket
*s
= SOCKET(u
);
2725 /* Don't propagate state changes from the service if we are
2726 already down or accepting connections */
2727 if ((s
->state
!= SOCKET_RUNNING
&&
2728 s
->state
!= SOCKET_LISTENING
) ||
2732 if (other
->load_state
!= UNIT_LOADED
||
2733 other
->type
!= UNIT_SERVICE
)
2736 se
= SERVICE(other
);
2738 if (se
->state
== SERVICE_FAILED
)
2739 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2741 if (se
->state
== SERVICE_DEAD
||
2742 se
->state
== SERVICE_FINAL_SIGTERM
||
2743 se
->state
== SERVICE_FINAL_SIGKILL
||
2744 se
->state
== SERVICE_AUTO_RESTART
)
2745 socket_notify_service_dead(s
, false);
2747 if (se
->state
== SERVICE_RUNNING
)
2748 socket_set_state(s
, SOCKET_RUNNING
);
2751 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2752 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2755 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2756 Socket
*s
= SOCKET(u
);
2759 if (!s
->timer_event_source
)
2762 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2769 char *socket_fdname(Socket
*s
) {
2772 /* Returns the name to use for $LISTEN_NAMES. If the user
2773 * didn't specify anything specifically, use the socket unit's
2774 * name as fallback. */
2782 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2783 [SOCKET_EXEC_START_PRE
] = "StartPre",
2784 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2785 [SOCKET_EXEC_START_POST
] = "StartPost",
2786 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2787 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2790 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2792 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2793 [SOCKET_SUCCESS
] = "success",
2794 [SOCKET_FAILURE_RESOURCES
] = "resources",
2795 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2796 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2797 [SOCKET_FAILURE_SIGNAL
] = "signal",
2798 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2799 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2802 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2804 const UnitVTable socket_vtable
= {
2805 .object_size
= sizeof(Socket
),
2806 .exec_context_offset
= offsetof(Socket
, exec_context
),
2807 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2808 .kill_context_offset
= offsetof(Socket
, kill_context
),
2809 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2815 .private_section
= "Socket",
2817 .init
= socket_init
,
2818 .done
= socket_done
,
2819 .load
= socket_load
,
2821 .coldplug
= socket_coldplug
,
2823 .dump
= socket_dump
,
2825 .start
= socket_start
,
2826 .stop
= socket_stop
,
2828 .kill
= socket_kill
,
2830 .get_timeout
= socket_get_timeout
,
2832 .serialize
= socket_serialize
,
2833 .deserialize_item
= socket_deserialize_item
,
2834 .distribute_fds
= socket_distribute_fds
,
2836 .active_state
= socket_active_state
,
2837 .sub_state_to_string
= socket_sub_state_to_string
,
2839 .check_gc
= socket_check_gc
,
2841 .sigchld_event
= socket_sigchld_event
,
2843 .trigger_notify
= socket_trigger_notify
,
2845 .reset_failed
= socket_reset_failed
,
2847 .bus_vtable
= bus_socket_vtable
,
2848 .bus_set_property
= bus_socket_set_property
,
2849 .bus_commit_properties
= bus_socket_commit_properties
,
2851 .status_message_formats
= {
2852 /*.starting_stopping = {
2853 [0] = "Starting socket %s...",
2854 [1] = "Stopping socket %s...",
2856 .finished_start_job
= {
2857 [JOB_DONE
] = "Listening on %s.",
2858 [JOB_FAILED
] = "Failed to listen on %s.",
2859 [JOB_TIMEOUT
] = "Timed out starting %s.",
2861 .finished_stop_job
= {
2862 [JOB_DONE
] = "Closed %s.",
2863 [JOB_FAILED
] = "Failed stopping %s.",
2864 [JOB_TIMEOUT
] = "Timed out stopping %s.",