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 "alloc-util.h"
35 #include "bus-error.h"
38 #include "dbus-socket.h"
40 #include "exit-status.h"
42 #include "formats-util.h"
47 #include "parse-util.h"
48 #include "path-util.h"
49 #include "selinux-util.h"
50 #include "signal-util.h"
51 #include "smack-util.h"
54 #include "string-table.h"
55 #include "string-util.h"
57 #include "unit-name.h"
58 #include "unit-printf.h"
60 #include "user-util.h"
62 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
63 [SOCKET_DEAD
] = UNIT_INACTIVE
,
64 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
65 [SOCKET_START_CHOWN
] = UNIT_ACTIVATING
,
66 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
67 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
68 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
69 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
70 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
71 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
72 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
73 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
74 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
75 [SOCKET_FAILED
] = UNIT_FAILED
78 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
79 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
81 static void socket_init(Unit
*u
) {
82 Socket
*s
= SOCKET(u
);
85 assert(u
->load_state
== UNIT_STUB
);
87 s
->backlog
= SOMAXCONN
;
88 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
89 s
->directory_mode
= 0755;
90 s
->socket_mode
= 0666;
92 s
->max_connections
= 64;
99 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
100 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
102 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
105 static void socket_unwatch_control_pid(Socket
*s
) {
108 if (s
->control_pid
<= 0)
111 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
115 static void socket_cleanup_fd_list(SocketPort
*p
) {
118 close_many(p
->auxiliary_fds
, p
->n_auxiliary_fds
);
119 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
120 p
->n_auxiliary_fds
= 0;
123 void socket_free_ports(Socket
*s
) {
128 while ((p
= s
->ports
)) {
129 LIST_REMOVE(port
, s
->ports
, p
);
131 sd_event_source_unref(p
->event_source
);
133 socket_cleanup_fd_list(p
);
140 static void socket_done(Unit
*u
) {
141 Socket
*s
= SOCKET(u
);
145 socket_free_ports(s
);
147 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
148 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
149 s
->control_command
= NULL
;
151 socket_unwatch_control_pid(s
);
153 unit_ref_unset(&s
->service
);
155 s
->tcp_congestion
= mfree(s
->tcp_congestion
);
156 s
->bind_to_device
= mfree(s
->bind_to_device
);
159 free(s
->smack_ip_in
);
160 free(s
->smack_ip_out
);
162 strv_free(s
->symlinks
);
167 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
170 static int socket_arm_timer(Socket
*s
) {
175 if (s
->timeout_usec
<= 0) {
176 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
180 if (s
->timer_event_source
) {
181 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
185 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
188 r
= sd_event_add_time(
189 UNIT(s
)->manager
->event
,
190 &s
->timer_event_source
,
192 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
193 socket_dispatch_timer
, s
);
197 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
202 int socket_instantiate_service(Socket
*s
) {
203 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
209 /* This fills in s->service if it isn't filled in yet. For
210 * Accept=yes sockets we create the next connection service
211 * here. For Accept=no this is mostly a NOP since the service
212 * is figured out at load time anyway. */
214 if (UNIT_DEREF(s
->service
))
220 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
224 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
227 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
232 unit_ref_set(&s
->service
, u
);
234 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
237 static bool have_non_accept_socket(Socket
*s
) {
245 LIST_FOREACH(port
, p
, s
->ports
) {
247 if (p
->type
!= SOCKET_SOCKET
)
250 if (!socket_address_can_accept(&p
->address
))
257 static int socket_add_mount_links(Socket
*s
) {
263 LIST_FOREACH(port
, p
, s
->ports
) {
264 const char *path
= NULL
;
266 if (p
->type
== SOCKET_SOCKET
)
267 path
= socket_address_get_path(&p
->address
);
268 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
274 r
= unit_require_mounts_for(UNIT(s
), path
);
282 static int socket_add_device_link(Socket
*s
) {
287 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
290 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
291 return unit_add_node_link(UNIT(s
), t
, false);
294 static int socket_add_default_dependencies(Socket
*s
) {
298 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
302 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
303 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
308 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
311 _pure_
static bool socket_has_exec(Socket
*s
) {
315 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
316 if (s
->exec_command
[i
])
322 static int socket_add_extras(Socket
*s
) {
328 if (have_non_accept_socket(s
)) {
330 if (!UNIT_DEREF(s
->service
)) {
333 r
= unit_load_related_unit(u
, ".service", &x
);
337 unit_ref_set(&s
->service
, x
);
340 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
345 r
= socket_add_mount_links(s
);
349 r
= socket_add_device_link(s
);
353 r
= unit_patch_contexts(u
);
357 if (socket_has_exec(s
)) {
358 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
362 r
= unit_set_default_slice(u
);
367 if (u
->default_dependencies
) {
368 r
= socket_add_default_dependencies(s
);
376 static const char *socket_find_symlink_target(Socket
*s
) {
377 const char *found
= NULL
;
380 LIST_FOREACH(port
, p
, s
->ports
) {
381 const char *f
= NULL
;
390 if (p
->address
.sockaddr
.un
.sun_path
[0] != 0)
391 f
= p
->address
.sockaddr
.un
.sun_path
;
409 static int socket_verify(Socket
*s
) {
412 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
416 log_unit_error(UNIT(s
), "Unit lacks Listen setting. Refusing.");
420 if (s
->accept
&& have_non_accept_socket(s
)) {
421 log_unit_error(UNIT(s
), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
425 if (s
->accept
&& s
->max_connections
<= 0) {
426 log_unit_error(UNIT(s
), "MaxConnection= setting too small. Refusing.");
430 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
431 log_unit_error(UNIT(s
), "Explicit service configuration for accepting socket units not supported. Refusing.");
435 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
436 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing.");
440 if (!strv_isempty(s
->symlinks
) && !socket_find_symlink_target(s
)) {
441 log_unit_error(UNIT(s
), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
448 static int socket_load(Unit
*u
) {
449 Socket
*s
= SOCKET(u
);
453 assert(u
->load_state
== UNIT_STUB
);
455 r
= unit_load_fragment_and_dropin(u
);
459 if (u
->load_state
== UNIT_LOADED
) {
460 /* This is a new unit? Then let's add in some extras */
461 r
= socket_add_extras(s
);
466 return socket_verify(s
);
469 _const_
static const char* listen_lookup(int family
, int type
) {
471 if (family
== AF_NETLINK
)
472 return "ListenNetlink";
474 if (type
== SOCK_STREAM
)
475 return "ListenStream";
476 else if (type
== SOCK_DGRAM
)
477 return "ListenDatagram";
478 else if (type
== SOCK_SEQPACKET
)
479 return "ListenSequentialPacket";
481 assert_not_reached("Unknown socket type");
485 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
486 char time_string
[FORMAT_TIMESPAN_MAX
];
488 Socket
*s
= SOCKET(u
);
495 prefix
= strempty(prefix
);
496 prefix2
= strjoina(prefix
, "\t");
499 "%sSocket State: %s\n"
501 "%sBindIPv6Only: %s\n"
503 "%sSocketMode: %04o\n"
504 "%sDirectoryMode: %04o\n"
508 "%sTransparent: %s\n"
510 "%sPassCredentials: %s\n"
511 "%sPassSecurity: %s\n"
512 "%sTCPCongestion: %s\n"
513 "%sRemoveOnStop: %s\n"
516 "%sSELinuxContextFromNet: %s\n",
517 prefix
, socket_state_to_string(s
->state
),
518 prefix
, socket_result_to_string(s
->result
),
519 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
521 prefix
, s
->socket_mode
,
522 prefix
, s
->directory_mode
,
523 prefix
, yes_no(s
->keep_alive
),
524 prefix
, yes_no(s
->no_delay
),
525 prefix
, yes_no(s
->free_bind
),
526 prefix
, yes_no(s
->transparent
),
527 prefix
, yes_no(s
->broadcast
),
528 prefix
, yes_no(s
->pass_cred
),
529 prefix
, yes_no(s
->pass_sec
),
530 prefix
, strna(s
->tcp_congestion
),
531 prefix
, yes_no(s
->remove_on_stop
),
532 prefix
, yes_no(s
->writable
),
533 prefix
, socket_fdname(s
),
534 prefix
, yes_no(s
->selinux_context_from_net
));
536 if (s
->control_pid
> 0)
538 "%sControl PID: "PID_FMT
"\n",
539 prefix
, s
->control_pid
);
541 if (s
->bind_to_device
)
543 "%sBindToDevice: %s\n",
544 prefix
, s
->bind_to_device
);
549 "%sNConnections: %u\n"
550 "%sMaxConnections: %u\n",
551 prefix
, s
->n_accepted
,
552 prefix
, s
->n_connections
,
553 prefix
, s
->max_connections
);
555 if (s
->priority
>= 0)
558 prefix
, s
->priority
);
560 if (s
->receive_buffer
> 0)
562 "%sReceiveBuffer: %zu\n",
563 prefix
, s
->receive_buffer
);
565 if (s
->send_buffer
> 0)
567 "%sSendBuffer: %zu\n",
568 prefix
, s
->send_buffer
);
580 if (s
->pipe_size
> 0)
583 prefix
, s
->pipe_size
);
590 if (s
->mq_maxmsg
> 0)
592 "%sMessageQueueMaxMessages: %li\n",
593 prefix
, s
->mq_maxmsg
);
595 if (s
->mq_msgsize
> 0)
597 "%sMessageQueueMessageSize: %li\n",
598 prefix
, s
->mq_msgsize
);
603 prefix
, yes_no(s
->reuse_port
));
607 "%sSmackLabel: %s\n",
612 "%sSmackLabelIPIn: %s\n",
613 prefix
, s
->smack_ip_in
);
617 "%sSmackLabelIPOut: %s\n",
618 prefix
, s
->smack_ip_out
);
620 if (!isempty(s
->user
) || !isempty(s
->group
))
623 "%sOwnerGroup: %s\n",
624 prefix
, strna(s
->user
),
625 prefix
, strna(s
->group
));
627 if (s
->keep_alive_time
> 0)
629 "%sKeepAliveTimeSec: %s\n",
630 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_time
, USEC_PER_SEC
));
632 if (s
->keep_alive_interval
)
634 "%sKeepAliveIntervalSec: %s\n",
635 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_interval
, USEC_PER_SEC
));
637 if (s
->keep_alive_cnt
)
639 "%sKeepAliveProbes: %u\n",
640 prefix
, s
->keep_alive_cnt
);
644 "%sDeferAcceptSec: %s\n",
645 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->defer_accept
, USEC_PER_SEC
));
647 LIST_FOREACH(port
, p
, s
->ports
) {
649 if (p
->type
== SOCKET_SOCKET
) {
654 r
= socket_address_print(&p
->address
, &k
);
660 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
662 } else if (p
->type
== SOCKET_SPECIAL
)
663 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
664 else if (p
->type
== SOCKET_USB_FUNCTION
)
665 fprintf(f
, "%sListenUSBFunction: %s\n", prefix
, p
->path
);
666 else if (p
->type
== SOCKET_MQUEUE
)
667 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
669 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
672 exec_context_dump(&s
->exec_context
, f
, prefix
);
673 kill_context_dump(&s
->kill_context
, f
, prefix
);
675 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
676 if (!s
->exec_command
[c
])
679 fprintf(f
, "%s-> %s:\n",
680 prefix
, socket_exec_command_to_string(c
));
682 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
686 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
689 union sockaddr_union local
, remote
;
695 if (getsockname(fd
, &local
.sa
, &l
) < 0)
699 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
702 switch (local
.sa
.sa_family
) {
706 a
= ntohl(local
.in
.sin_addr
.s_addr
),
707 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
710 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
712 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
713 ntohs(local
.in
.sin_port
),
714 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
715 ntohs(remote
.in
.sin_port
)) < 0)
722 static const unsigned char ipv4_prefix
[] = {
723 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
726 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
727 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
729 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
730 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
733 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
735 a
[0], a
[1], a
[2], a
[3],
736 ntohs(local
.in6
.sin6_port
),
737 b
[0], b
[1], b
[2], b
[3],
738 ntohs(remote
.in6
.sin6_port
)) < 0)
741 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
746 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
747 ntohs(local
.in6
.sin6_port
),
748 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
749 ntohs(remote
.in6
.sin6_port
)) < 0)
760 k
= getpeercred(fd
, &ucred
);
763 "%u-"PID_FMT
"-"UID_FMT
,
764 nr
, ucred
.pid
, ucred
.uid
) < 0)
766 } else if (k
== -ENODATA
) {
767 /* This handles the case where somebody is
768 * connecting from another pid/uid namespace
769 * (e.g. from outside of our container). */
781 assert_not_reached("Unhandled socket type.");
788 static void socket_close_fds(Socket
*s
) {
794 LIST_FOREACH(port
, p
, s
->ports
) {
796 p
->event_source
= sd_event_source_unref(p
->event_source
);
801 p
->fd
= safe_close(p
->fd
);
802 socket_cleanup_fd_list(p
);
804 /* One little note: we should normally not delete any
805 * sockets in the file system here! After all some
806 * other process we spawned might still have a
807 * reference of this fd and wants to continue to use
808 * it. Therefore we delete sockets in the file system
809 * before we create a new one, not after we stopped
812 if (s
->remove_on_stop
) {
824 socket_address_unlink(&p
->address
);
833 if (s
->remove_on_stop
)
834 STRV_FOREACH(i
, s
->symlinks
)
838 static void socket_apply_socket_options(Socket
*s
, int fd
) {
845 int b
= s
->keep_alive
;
846 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
847 log_unit_warning_errno(UNIT(s
), errno
, "SO_KEEPALIVE failed: %m");
850 if (s
->keep_alive_time
) {
851 int value
= s
->keep_alive_time
/ USEC_PER_SEC
;
852 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPIDLE
, &value
, sizeof(value
)) < 0)
853 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPIDLE failed: %m");
856 if (s
->keep_alive_interval
) {
857 int value
= s
->keep_alive_interval
/ USEC_PER_SEC
;
858 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPINTVL
, &value
, sizeof(value
)) < 0)
859 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPINTVL failed: %m");
862 if (s
->keep_alive_cnt
) {
863 int value
= s
->keep_alive_cnt
;
864 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPCNT
, &value
, sizeof(value
)) < 0)
865 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPCNT failed: %m");
868 if (s
->defer_accept
) {
869 int value
= s
->defer_accept
/ USEC_PER_SEC
;
870 if (setsockopt(fd
, SOL_TCP
, TCP_DEFER_ACCEPT
, &value
, sizeof(value
)) < 0)
871 log_unit_warning_errno(UNIT(s
), errno
, "TCP_DEFER_ACCEPT failed: %m");
876 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
877 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
882 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
883 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
888 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
889 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
894 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
895 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
898 if (s
->priority
>= 0)
899 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
900 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
902 if (s
->receive_buffer
> 0) {
903 int value
= (int) s
->receive_buffer
;
905 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
907 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
908 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
909 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
912 if (s
->send_buffer
> 0) {
913 int value
= (int) s
->send_buffer
;
914 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
915 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
916 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
920 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
921 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
924 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
925 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
927 if (s
->ip_ttl
>= 0) {
930 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
932 if (socket_ipv6_is_supported())
933 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
936 errno
= EAFNOSUPPORT
;
940 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
943 if (s
->tcp_congestion
)
944 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
945 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
947 if (s
->smack_ip_in
) {
948 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
950 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
953 if (s
->smack_ip_out
) {
954 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
956 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
960 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
966 if (s
->pipe_size
> 0)
967 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
968 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
971 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
973 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
977 static int fifo_address_create(
979 mode_t directory_mode
,
980 mode_t socket_mode
) {
982 _cleanup_close_
int fd
= -1;
989 mkdir_parents_label(path
, directory_mode
);
991 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
995 /* Enforce the right access mode for the fifo */
996 old_mask
= umask(~ socket_mode
);
998 /* Include the original umask in our mask */
999 (void) umask(~socket_mode
| old_mask
);
1001 r
= mkfifo(path
, socket_mode
);
1002 (void) umask(old_mask
);
1004 if (r
< 0 && errno
!= EEXIST
) {
1009 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1015 mac_selinux_create_file_clear();
1017 if (fstat(fd
, &st
) < 0) {
1022 if (!S_ISFIFO(st
.st_mode
) ||
1023 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1024 st
.st_uid
!= getuid() ||
1025 st
.st_gid
!= getgid()) {
1036 mac_selinux_create_file_clear();
1040 static int special_address_create(const char *path
, bool writable
) {
1041 _cleanup_close_
int fd
= -1;
1047 fd
= open(path
, (writable
? O_RDWR
: O_RDONLY
)|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1051 if (fstat(fd
, &st
) < 0)
1054 /* Check whether this is a /proc, /sys or /dev file or char device */
1055 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1064 static int usbffs_address_create(const char *path
) {
1065 _cleanup_close_
int fd
= -1;
1071 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1075 if (fstat(fd
, &st
) < 0)
1078 /* Check whether this is a regular file (ffs endpoint)*/
1079 if (!S_ISREG(st
.st_mode
))
1088 static int mq_address_create(
1094 _cleanup_close_
int fd
= -1;
1097 struct mq_attr _attr
, *attr
= NULL
;
1102 if (maxmsg
> 0 && msgsize
> 0) {
1103 _attr
= (struct mq_attr
) {
1104 .mq_flags
= O_NONBLOCK
,
1105 .mq_maxmsg
= maxmsg
,
1106 .mq_msgsize
= msgsize
,
1111 /* Enforce the right access mode for the mq */
1112 old_mask
= umask(~ mq_mode
);
1114 /* Include the original umask in our mask */
1115 (void) umask(~mq_mode
| old_mask
);
1116 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1117 (void) umask(old_mask
);
1122 if (fstat(fd
, &st
) < 0)
1125 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1126 st
.st_uid
!= getuid() ||
1127 st
.st_gid
!= getgid())
1136 static int socket_symlink(Socket
*s
) {
1142 p
= socket_find_symlink_target(s
);
1146 STRV_FOREACH(i
, s
->symlinks
)
1147 symlink_label(p
, *i
);
1152 static int usbffs_write_descs(int fd
, Service
*s
) {
1155 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1158 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1162 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1165 static int usbffs_select_ep(const struct dirent
*d
) {
1166 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1169 static int usbffs_dispatch_eps(SocketPort
*p
) {
1170 _cleanup_free_
struct dirent
**ent
= NULL
;
1171 _cleanup_free_
char *path
= NULL
;
1174 path
= dirname_malloc(p
->path
);
1178 r
= scandir(path
, &ent
, usbffs_select_ep
, alphasort
);
1183 p
->auxiliary_fds
= new(int, n
);
1184 if (!p
->auxiliary_fds
)
1187 p
->n_auxiliary_fds
= n
;
1190 for (i
= 0; i
< n
; ++i
) {
1191 _cleanup_free_
char *ep
= NULL
;
1193 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1197 path_kill_slashes(ep
);
1199 r
= usbffs_address_create(ep
);
1203 p
->auxiliary_fds
[k
] = r
;
1212 close_many(p
->auxiliary_fds
, k
);
1213 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1214 p
->n_auxiliary_fds
= 0;
1219 static int socket_open_fds(Socket
*s
) {
1220 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1221 bool know_label
= false;
1227 LIST_FOREACH(port
, p
, s
->ports
) {
1237 /* Figure out label, if we don't it know
1238 * yet. We do it once, for the first
1239 * socket where we need this and
1240 * remember it for the rest. */
1242 if (s
->selinux_context_from_net
) {
1243 /* Get it from the network label */
1245 r
= mac_selinux_get_our_label(&label
);
1246 if (r
< 0 && r
!= -EOPNOTSUPP
)
1250 /* Get it from the executable we are about to start */
1252 r
= socket_instantiate_service(s
);
1256 if (UNIT_ISSET(s
->service
) &&
1257 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1258 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1259 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1267 r
= socket_address_listen(
1269 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1283 socket_apply_socket_options(s
, p
->fd
);
1287 case SOCKET_SPECIAL
:
1289 p
->fd
= special_address_create(p
->path
, s
->writable
);
1298 p
->fd
= fifo_address_create(
1307 socket_apply_fifo_options(s
, p
->fd
);
1313 p
->fd
= mq_address_create(
1324 case SOCKET_USB_FUNCTION
:
1326 p
->fd
= usbffs_address_create(p
->path
);
1332 r
= usbffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1336 r
= usbffs_dispatch_eps(p
);
1343 assert_not_reached("Unknown port type");
1350 socket_close_fds(s
);
1354 static void socket_unwatch_fds(Socket
*s
) {
1360 LIST_FOREACH(port
, p
, s
->ports
) {
1364 if (!p
->event_source
)
1367 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1369 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1373 static int socket_watch_fds(Socket
*s
) {
1379 LIST_FOREACH(port
, p
, s
->ports
) {
1383 if (p
->event_source
) {
1384 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1388 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1392 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1399 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1400 socket_unwatch_fds(s
);
1404 static void socket_set_state(Socket
*s
, SocketState state
) {
1405 SocketState old_state
;
1408 old_state
= s
->state
;
1416 SOCKET_STOP_PRE_SIGTERM
,
1417 SOCKET_STOP_PRE_SIGKILL
,
1419 SOCKET_FINAL_SIGTERM
,
1420 SOCKET_FINAL_SIGKILL
)) {
1422 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1423 socket_unwatch_control_pid(s
);
1424 s
->control_command
= NULL
;
1425 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1428 if (state
!= SOCKET_LISTENING
)
1429 socket_unwatch_fds(s
);
1437 SOCKET_STOP_PRE_SIGTERM
,
1438 SOCKET_STOP_PRE_SIGKILL
))
1439 socket_close_fds(s
);
1441 if (state
!= old_state
)
1442 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1444 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1447 static int socket_coldplug(Unit
*u
) {
1448 Socket
*s
= SOCKET(u
);
1452 assert(s
->state
== SOCKET_DEAD
);
1454 if (s
->deserialized_state
== s
->state
)
1457 if (IN_SET(s
->deserialized_state
,
1462 SOCKET_STOP_PRE_SIGTERM
,
1463 SOCKET_STOP_PRE_SIGKILL
,
1465 SOCKET_FINAL_SIGTERM
,
1466 SOCKET_FINAL_SIGKILL
)) {
1468 if (s
->control_pid
<= 0)
1471 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1475 r
= socket_arm_timer(s
);
1480 if (IN_SET(s
->deserialized_state
,
1486 SOCKET_STOP_PRE_SIGTERM
,
1487 SOCKET_STOP_PRE_SIGKILL
)) {
1488 r
= socket_open_fds(s
);
1493 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1494 r
= socket_watch_fds(s
);
1499 socket_set_state(s
, s
->deserialized_state
);
1503 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1504 _cleanup_free_
char **argv
= NULL
;
1507 ExecParameters exec_params
= {
1508 .apply_permissions
= true,
1509 .apply_chroot
= true,
1510 .apply_tty_stdin
= true,
1511 .bus_endpoint_fd
= -1,
1521 (void) unit_realize_cgroup(UNIT(s
));
1522 if (s
->reset_cpu_usage
) {
1523 (void) unit_reset_cpu_usage(UNIT(s
));
1524 s
->reset_cpu_usage
= false;
1527 r
= unit_setup_exec_runtime(UNIT(s
));
1531 r
= socket_arm_timer(s
);
1535 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1539 exec_params
.argv
= argv
;
1540 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1541 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1542 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1543 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1544 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1545 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1547 r
= exec_spawn(UNIT(s
),
1556 r
= unit_watch_pid(UNIT(s
), pid
);
1558 /* FIXME: we need to do something here */
1565 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1569 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1573 r
= socket_arm_timer(s
);
1577 /* We have to resolve the user names out-of-process, hence
1578 * let's fork here. It's messy, but well, what can we do? */
1586 uid_t uid
= UID_INVALID
;
1587 gid_t gid
= GID_INVALID
;
1590 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1591 (void) ignore_signals(SIGPIPE
, -1);
1594 if (!isempty(s
->user
)) {
1595 const char *user
= s
->user
;
1597 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1604 if (!isempty(s
->group
)) {
1605 const char *group
= s
->group
;
1607 r
= get_group_creds(&group
, &gid
);
1614 LIST_FOREACH(port
, p
, s
->ports
) {
1615 const char *path
= NULL
;
1617 if (p
->type
== SOCKET_SOCKET
)
1618 path
= socket_address_get_path(&p
->address
);
1619 else if (p
->type
== SOCKET_FIFO
)
1625 if (chown(path
, uid
, gid
) < 0) {
1636 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1641 r
= unit_watch_pid(UNIT(s
), pid
);
1649 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1653 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1656 if (f
!= SOCKET_SUCCESS
)
1659 exec_runtime_destroy(s
->exec_runtime
);
1660 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1662 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1664 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1667 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1669 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1673 if (f
!= SOCKET_SUCCESS
)
1676 socket_unwatch_control_pid(s
);
1677 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1678 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1680 if (s
->control_command
) {
1681 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1685 socket_set_state(s
, SOCKET_STOP_POST
);
1687 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1692 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1693 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1696 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1701 if (f
!= SOCKET_SUCCESS
)
1704 r
= unit_kill_context(
1707 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1708 KILL_KILL
: KILL_TERMINATE
,
1716 r
= socket_arm_timer(s
);
1720 socket_set_state(s
, state
);
1721 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1722 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1723 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1724 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1725 else if (state
== SOCKET_FINAL_SIGTERM
)
1726 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1728 socket_enter_dead(s
, SOCKET_SUCCESS
);
1733 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1735 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1736 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1738 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1741 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1745 if (f
!= SOCKET_SUCCESS
)
1748 socket_unwatch_control_pid(s
);
1749 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1750 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1752 if (s
->control_command
) {
1753 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1757 socket_set_state(s
, SOCKET_STOP_PRE
);
1759 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1764 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1765 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1768 static void socket_enter_listening(Socket
*s
) {
1772 r
= socket_watch_fds(s
);
1774 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1778 socket_set_state(s
, SOCKET_LISTENING
);
1782 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1785 static void socket_enter_start_post(Socket
*s
) {
1789 socket_unwatch_control_pid(s
);
1790 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1791 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1793 if (s
->control_command
) {
1794 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1796 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1800 socket_set_state(s
, SOCKET_START_POST
);
1802 socket_enter_listening(s
);
1807 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1810 static void socket_enter_start_chown(Socket
*s
) {
1815 r
= socket_open_fds(s
);
1817 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1821 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1823 socket_unwatch_control_pid(s
);
1824 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1825 s
->control_command
= NULL
;
1827 r
= socket_chown(s
, &s
->control_pid
);
1829 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1833 socket_set_state(s
, SOCKET_START_CHOWN
);
1835 socket_enter_start_post(s
);
1840 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1843 static void socket_enter_start_pre(Socket
*s
) {
1847 socket_unwatch_control_pid(s
);
1848 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1849 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1851 if (s
->control_command
) {
1852 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1854 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1858 socket_set_state(s
, SOCKET_START_PRE
);
1860 socket_enter_start_chown(s
);
1865 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1868 static void socket_enter_running(Socket
*s
, int cfd
) {
1869 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1874 /* We don't take connections anymore if we are supposed to
1875 * shut down anyway */
1876 if (unit_stop_pending(UNIT(s
))) {
1878 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1883 /* Flush all sockets by closing and reopening them */
1884 socket_close_fds(s
);
1886 r
= socket_open_fds(s
);
1888 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1889 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1893 r
= socket_watch_fds(s
);
1895 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1896 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1906 bool pending
= false;
1908 /* If there's already a start pending don't bother to
1910 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1911 if (unit_active_or_pending(other
)) {
1917 if (!UNIT_ISSET(s
->service
)) {
1918 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1923 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, true, &error
, NULL
);
1928 socket_set_state(s
, SOCKET_RUNNING
);
1930 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1933 if (s
->n_connections
>= s
->max_connections
) {
1934 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1939 r
= socket_instantiate_service(s
);
1943 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1948 /* ENOTCONN is legitimate if TCP RST was received.
1949 * This connection is over, but the socket unit lives on. */
1954 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1958 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1962 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1966 service
= SERVICE(UNIT_DEREF(s
->service
));
1967 unit_ref_unset(&s
->service
);
1970 UNIT(service
)->no_gc
= false;
1972 unit_choose_id(UNIT(service
), name
);
1974 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1979 s
->n_connections
++;
1981 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, true, &error
, NULL
);
1985 /* Notify clients about changed counters */
1986 unit_add_to_dbus_queue(UNIT(s
));
1992 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
1993 cfd
>= 0 ? "template" : "non-template",
1994 bus_error_message(&error
, r
));
1996 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2000 static void socket_run_next(Socket
*s
) {
2004 assert(s
->control_command
);
2005 assert(s
->control_command
->command_next
);
2007 socket_unwatch_control_pid(s
);
2009 s
->control_command
= s
->control_command
->command_next
;
2011 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2018 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2020 if (s
->state
== SOCKET_START_POST
)
2021 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2022 else if (s
->state
== SOCKET_STOP_POST
)
2023 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2025 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2028 static int socket_start(Unit
*u
) {
2029 Socket
*s
= SOCKET(u
);
2033 /* We cannot fulfill this request right now, try again later
2035 if (IN_SET(s
->state
,
2037 SOCKET_STOP_PRE_SIGKILL
,
2038 SOCKET_STOP_PRE_SIGTERM
,
2040 SOCKET_FINAL_SIGTERM
,
2041 SOCKET_FINAL_SIGKILL
))
2044 /* Already on it! */
2045 if (IN_SET(s
->state
,
2051 /* Cannot run this without the service being around */
2052 if (UNIT_ISSET(s
->service
)) {
2055 service
= SERVICE(UNIT_DEREF(s
->service
));
2057 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2058 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2062 /* If the service is already active we cannot start the
2064 if (service
->state
!= SERVICE_DEAD
&&
2065 service
->state
!= SERVICE_FAILED
&&
2066 service
->state
!= SERVICE_AUTO_RESTART
) {
2067 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2072 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2074 s
->result
= SOCKET_SUCCESS
;
2075 s
->reset_cpu_usage
= true;
2077 socket_enter_start_pre(s
);
2082 static int socket_stop(Unit
*u
) {
2083 Socket
*s
= SOCKET(u
);
2088 if (IN_SET(s
->state
,
2090 SOCKET_STOP_PRE_SIGTERM
,
2091 SOCKET_STOP_PRE_SIGKILL
,
2093 SOCKET_FINAL_SIGTERM
,
2094 SOCKET_FINAL_SIGKILL
))
2097 /* If there's already something running we go directly into
2099 if (IN_SET(s
->state
,
2102 SOCKET_START_POST
)) {
2103 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2107 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2109 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2113 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2114 Socket
*s
= SOCKET(u
);
2122 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2123 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2124 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2126 if (s
->control_pid
> 0)
2127 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2129 if (s
->control_command_id
>= 0)
2130 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2132 LIST_FOREACH(port
, p
, s
->ports
) {
2138 copy
= fdset_put_dup(fds
, p
->fd
);
2142 if (p
->type
== SOCKET_SOCKET
) {
2143 _cleanup_free_
char *t
= NULL
;
2145 r
= socket_address_print(&p
->address
, &t
);
2149 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2150 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2152 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2154 } else if (p
->type
== SOCKET_SPECIAL
)
2155 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2156 else if (p
->type
== SOCKET_MQUEUE
)
2157 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2158 else if (p
->type
== SOCKET_USB_FUNCTION
)
2159 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2161 assert(p
->type
== SOCKET_FIFO
);
2162 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2169 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2170 Socket
*s
= SOCKET(u
);
2176 if (streq(key
, "state")) {
2179 state
= socket_state_from_string(value
);
2181 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2183 s
->deserialized_state
= state
;
2184 } else if (streq(key
, "result")) {
2187 f
= socket_result_from_string(value
);
2189 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2190 else if (f
!= SOCKET_SUCCESS
)
2193 } else if (streq(key
, "n-accepted")) {
2196 if (safe_atou(value
, &k
) < 0)
2197 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2200 } else if (streq(key
, "control-pid")) {
2203 if (parse_pid(value
, &pid
) < 0)
2204 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2206 s
->control_pid
= pid
;
2207 } else if (streq(key
, "control-command")) {
2208 SocketExecCommand id
;
2210 id
= socket_exec_command_from_string(value
);
2212 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2214 s
->control_command_id
= id
;
2215 s
->control_command
= s
->exec_command
[id
];
2217 } else if (streq(key
, "fifo")) {
2221 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2222 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2225 LIST_FOREACH(port
, p
, s
->ports
)
2226 if (p
->type
== SOCKET_FIFO
&&
2227 path_equal_or_files_same(p
->path
, value
+skip
))
2232 p
->fd
= fdset_remove(fds
, fd
);
2236 } else if (streq(key
, "special")) {
2240 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2241 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2244 LIST_FOREACH(port
, p
, s
->ports
)
2245 if (p
->type
== SOCKET_SPECIAL
&&
2246 path_equal_or_files_same(p
->path
, value
+skip
))
2251 p
->fd
= fdset_remove(fds
, fd
);
2255 } else if (streq(key
, "mqueue")) {
2259 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2260 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2263 LIST_FOREACH(port
, p
, s
->ports
)
2264 if (p
->type
== SOCKET_MQUEUE
&&
2265 streq(p
->path
, value
+skip
))
2270 p
->fd
= fdset_remove(fds
, fd
);
2274 } else if (streq(key
, "socket")) {
2275 int fd
, type
, skip
= 0;
2278 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2279 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2282 LIST_FOREACH(port
, p
, s
->ports
)
2283 if (socket_address_is(&p
->address
, value
+skip
, type
))
2288 p
->fd
= fdset_remove(fds
, fd
);
2292 } else if (streq(key
, "netlink")) {
2296 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2297 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2300 LIST_FOREACH(port
, p
, s
->ports
)
2301 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2306 p
->fd
= fdset_remove(fds
, fd
);
2310 } else if (streq(key
, "ffs")) {
2314 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2315 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2318 LIST_FOREACH(port
, p
, s
->ports
)
2319 if (p
->type
== SOCKET_USB_FUNCTION
&&
2320 path_equal_or_files_same(p
->path
, value
+skip
))
2325 p
->fd
= fdset_remove(fds
, fd
);
2330 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2335 static int socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2336 Socket
*s
= SOCKET(u
);
2341 LIST_FOREACH(port
, p
, s
->ports
) {
2345 if (p
->type
!= SOCKET_SOCKET
)
2351 FDSET_FOREACH(fd
, fds
, i
) {
2352 if (socket_address_matches_fd(&p
->address
, fd
)) {
2353 p
->fd
= fdset_remove(fds
, fd
);
2354 s
->deserialized_state
= SOCKET_LISTENING
;
2363 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2366 return state_translation_table
[SOCKET(u
)->state
];
2369 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2372 return socket_state_to_string(SOCKET(u
)->state
);
2375 const char* socket_port_type_to_string(SocketPort
*p
) {
2383 switch (p
->address
.type
) {
2391 case SOCK_SEQPACKET
:
2392 return "SequentialPacket";
2395 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2402 case SOCKET_SPECIAL
:
2406 return "MessageQueue";
2411 case SOCKET_USB_FUNCTION
:
2412 return "USBFunction";
2419 _pure_
static bool socket_check_gc(Unit
*u
) {
2420 Socket
*s
= SOCKET(u
);
2424 return s
->n_connections
> 0;
2427 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2428 SocketPort
*p
= userdata
;
2434 if (p
->socket
->state
!= SOCKET_LISTENING
)
2437 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2439 if (revents
!= EPOLLIN
) {
2441 if (revents
& EPOLLHUP
)
2442 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.");
2444 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2448 if (p
->socket
->accept
&&
2449 p
->type
== SOCKET_SOCKET
&&
2450 socket_address_can_accept(&p
->address
)) {
2454 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2460 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2467 socket_apply_socket_options(p
->socket
, cfd
);
2470 socket_enter_running(p
->socket
, cfd
);
2474 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2478 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2479 Socket
*s
= SOCKET(u
);
2485 if (pid
!= s
->control_pid
)
2490 if (is_clean_exit(code
, status
, NULL
))
2492 else if (code
== CLD_EXITED
)
2493 f
= SOCKET_FAILURE_EXIT_CODE
;
2494 else if (code
== CLD_KILLED
)
2495 f
= SOCKET_FAILURE_SIGNAL
;
2496 else if (code
== CLD_DUMPED
)
2497 f
= SOCKET_FAILURE_CORE_DUMP
;
2499 assert_not_reached("Unknown sigchld code");
2501 if (s
->control_command
) {
2502 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2504 if (s
->control_command
->ignore
)
2508 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2509 "Control process exited, code=%s status=%i",
2510 sigchld_code_to_string(code
), status
);
2512 if (f
!= SOCKET_SUCCESS
)
2515 if (s
->control_command
&&
2516 s
->control_command
->command_next
&&
2517 f
== SOCKET_SUCCESS
) {
2519 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2522 s
->control_command
= NULL
;
2523 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2525 /* No further commands for this step, so let's figure
2526 * out what to do next */
2528 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2532 case SOCKET_START_PRE
:
2533 if (f
== SOCKET_SUCCESS
)
2534 socket_enter_start_chown(s
);
2536 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2539 case SOCKET_START_CHOWN
:
2540 if (f
== SOCKET_SUCCESS
)
2541 socket_enter_start_post(s
);
2543 socket_enter_stop_pre(s
, f
);
2546 case SOCKET_START_POST
:
2547 if (f
== SOCKET_SUCCESS
)
2548 socket_enter_listening(s
);
2550 socket_enter_stop_pre(s
, f
);
2553 case SOCKET_STOP_PRE
:
2554 case SOCKET_STOP_PRE_SIGTERM
:
2555 case SOCKET_STOP_PRE_SIGKILL
:
2556 socket_enter_stop_post(s
, f
);
2559 case SOCKET_STOP_POST
:
2560 case SOCKET_FINAL_SIGTERM
:
2561 case SOCKET_FINAL_SIGKILL
:
2562 socket_enter_dead(s
, f
);
2566 assert_not_reached("Uh, control process died at wrong time.");
2570 /* Notify clients about changed exit status */
2571 unit_add_to_dbus_queue(u
);
2574 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2575 Socket
*s
= SOCKET(userdata
);
2578 assert(s
->timer_event_source
== source
);
2582 case SOCKET_START_PRE
:
2583 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2584 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2587 case SOCKET_START_CHOWN
:
2588 case SOCKET_START_POST
:
2589 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2590 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2593 case SOCKET_STOP_PRE
:
2594 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2595 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2598 case SOCKET_STOP_PRE_SIGTERM
:
2599 if (s
->kill_context
.send_sigkill
) {
2600 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2601 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2603 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2604 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2608 case SOCKET_STOP_PRE_SIGKILL
:
2609 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2610 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2613 case SOCKET_STOP_POST
:
2614 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2615 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2618 case SOCKET_FINAL_SIGTERM
:
2619 if (s
->kill_context
.send_sigkill
) {
2620 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2621 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2623 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2624 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2628 case SOCKET_FINAL_SIGKILL
:
2629 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2630 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2634 assert_not_reached("Timeout at wrong time.");
2640 int socket_collect_fds(Socket
*s
, int **fds
) {
2641 int *rfds
, k
= 0, n
= 0;
2647 /* Called from the service code for requesting our fds */
2649 LIST_FOREACH(port
, p
, s
->ports
) {
2652 n
+= p
->n_auxiliary_fds
;
2664 LIST_FOREACH(port
, p
, s
->ports
) {
2669 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2670 rfds
[k
++] = p
->auxiliary_fds
[i
];
2679 static void socket_reset_failed(Unit
*u
) {
2680 Socket
*s
= SOCKET(u
);
2684 if (s
->state
== SOCKET_FAILED
)
2685 socket_set_state(s
, SOCKET_DEAD
);
2687 s
->result
= SOCKET_SUCCESS
;
2690 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2693 /* The service is dead. Dang!
2695 * This is strictly for one-instance-for-all-connections
2698 if (s
->state
== SOCKET_RUNNING
) {
2699 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2700 if (failed_permanent
)
2701 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2703 socket_enter_listening(s
);
2707 void socket_connection_unref(Socket
*s
) {
2710 /* The service is dead. Yay!
2712 * This is strictly for one-instance-per-connection
2715 assert(s
->n_connections
> 0);
2718 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2721 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2722 Socket
*s
= SOCKET(u
);
2728 /* Don't propagate state changes from the service if we are
2729 already down or accepting connections */
2730 if ((s
->state
!= SOCKET_RUNNING
&&
2731 s
->state
!= SOCKET_LISTENING
) ||
2735 if (other
->load_state
!= UNIT_LOADED
||
2736 other
->type
!= UNIT_SERVICE
)
2739 se
= SERVICE(other
);
2741 if (se
->state
== SERVICE_FAILED
)
2742 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2744 if (se
->state
== SERVICE_DEAD
||
2745 se
->state
== SERVICE_FINAL_SIGTERM
||
2746 se
->state
== SERVICE_FINAL_SIGKILL
||
2747 se
->state
== SERVICE_AUTO_RESTART
)
2748 socket_notify_service_dead(s
, false);
2750 if (se
->state
== SERVICE_RUNNING
)
2751 socket_set_state(s
, SOCKET_RUNNING
);
2754 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2755 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2758 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2759 Socket
*s
= SOCKET(u
);
2762 if (!s
->timer_event_source
)
2765 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2772 char *socket_fdname(Socket
*s
) {
2775 /* Returns the name to use for $LISTEN_NAMES. If the user
2776 * didn't specify anything specifically, use the socket unit's
2777 * name as fallback. */
2785 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2786 [SOCKET_EXEC_START_PRE
] = "StartPre",
2787 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2788 [SOCKET_EXEC_START_POST
] = "StartPost",
2789 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2790 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2793 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2795 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2796 [SOCKET_SUCCESS
] = "success",
2797 [SOCKET_FAILURE_RESOURCES
] = "resources",
2798 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2799 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2800 [SOCKET_FAILURE_SIGNAL
] = "signal",
2801 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2802 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2805 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2807 const UnitVTable socket_vtable
= {
2808 .object_size
= sizeof(Socket
),
2809 .exec_context_offset
= offsetof(Socket
, exec_context
),
2810 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2811 .kill_context_offset
= offsetof(Socket
, kill_context
),
2812 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2818 .private_section
= "Socket",
2820 .init
= socket_init
,
2821 .done
= socket_done
,
2822 .load
= socket_load
,
2824 .coldplug
= socket_coldplug
,
2826 .dump
= socket_dump
,
2828 .start
= socket_start
,
2829 .stop
= socket_stop
,
2831 .kill
= socket_kill
,
2833 .get_timeout
= socket_get_timeout
,
2835 .serialize
= socket_serialize
,
2836 .deserialize_item
= socket_deserialize_item
,
2837 .distribute_fds
= socket_distribute_fds
,
2839 .active_state
= socket_active_state
,
2840 .sub_state_to_string
= socket_sub_state_to_string
,
2842 .check_gc
= socket_check_gc
,
2844 .sigchld_event
= socket_sigchld_event
,
2846 .trigger_notify
= socket_trigger_notify
,
2848 .reset_failed
= socket_reset_failed
,
2850 .bus_vtable
= bus_socket_vtable
,
2851 .bus_set_property
= bus_socket_set_property
,
2852 .bus_commit_properties
= bus_socket_commit_properties
,
2854 .status_message_formats
= {
2855 /*.starting_stopping = {
2856 [0] = "Starting socket %s...",
2857 [1] = "Stopping socket %s...",
2859 .finished_start_job
= {
2860 [JOB_DONE
] = "Listening on %s.",
2861 [JOB_FAILED
] = "Failed to listen on %s.",
2862 [JOB_TIMEOUT
] = "Timed out starting %s.",
2864 .finished_stop_job
= {
2865 [JOB_DONE
] = "Closed %s.",
2866 [JOB_FAILED
] = "Failed stopping %s.",
2867 [JOB_TIMEOUT
] = "Timed out stopping %s.",