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/>.
26 #include <sys/epoll.h>
28 #include <arpa/inet.h>
29 #include <netinet/tcp.h>
36 #include "path-util.h"
37 #include "unit-name.h"
38 #include "unit-printf.h"
42 #include "exit-status.h"
44 #include "smack-util.h"
46 #include "bus-error.h"
47 #include "selinux-util.h"
48 #include "dbus-socket.h"
50 #include "formats-util.h"
51 #include "signal-util.h"
55 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
56 [SOCKET_DEAD
] = UNIT_INACTIVE
,
57 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
58 [SOCKET_START_CHOWN
] = UNIT_ACTIVATING
,
59 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
60 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
61 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
62 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
63 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
64 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
65 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
66 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
67 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
68 [SOCKET_FAILED
] = UNIT_FAILED
71 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
72 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
74 static void socket_init(Unit
*u
) {
75 Socket
*s
= SOCKET(u
);
78 assert(u
->load_state
== UNIT_STUB
);
80 s
->backlog
= SOMAXCONN
;
81 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
82 s
->directory_mode
= 0755;
83 s
->socket_mode
= 0666;
85 s
->max_connections
= 64;
92 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
93 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
95 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
98 static void socket_unwatch_control_pid(Socket
*s
) {
101 if (s
->control_pid
<= 0)
104 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
108 static void socket_cleanup_fd_list(SocketPort
*p
) {
109 int k
= p
->n_auxiliary_fds
;
112 safe_close(p
->auxiliary_fds
[k
]);
114 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
115 p
->n_auxiliary_fds
= 0;
118 void socket_free_ports(Socket
*s
) {
123 while ((p
= s
->ports
)) {
124 LIST_REMOVE(port
, s
->ports
, p
);
126 sd_event_source_unref(p
->event_source
);
128 socket_cleanup_fd_list(p
);
135 static void socket_done(Unit
*u
) {
136 Socket
*s
= SOCKET(u
);
140 socket_free_ports(s
);
142 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
143 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
144 s
->control_command
= NULL
;
146 socket_unwatch_control_pid(s
);
148 unit_ref_unset(&s
->service
);
150 s
->tcp_congestion
= mfree(s
->tcp_congestion
);
151 s
->bind_to_device
= mfree(s
->bind_to_device
);
154 free(s
->smack_ip_in
);
155 free(s
->smack_ip_out
);
157 strv_free(s
->symlinks
);
162 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
165 static int socket_arm_timer(Socket
*s
) {
170 if (s
->timeout_usec
<= 0) {
171 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
175 if (s
->timer_event_source
) {
176 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
180 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
183 r
= sd_event_add_time(
184 UNIT(s
)->manager
->event
,
185 &s
->timer_event_source
,
187 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
188 socket_dispatch_timer
, s
);
192 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
197 int socket_instantiate_service(Socket
*s
) {
198 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
204 /* This fills in s->service if it isn't filled in yet. For
205 * Accept=yes sockets we create the next connection service
206 * here. For Accept=no this is mostly a NOP since the service
207 * is figured out at load time anyway. */
209 if (UNIT_DEREF(s
->service
))
215 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
219 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
222 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
227 unit_ref_set(&s
->service
, u
);
229 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
232 static bool have_non_accept_socket(Socket
*s
) {
240 LIST_FOREACH(port
, p
, s
->ports
) {
242 if (p
->type
!= SOCKET_SOCKET
)
245 if (!socket_address_can_accept(&p
->address
))
252 static int socket_add_mount_links(Socket
*s
) {
258 LIST_FOREACH(port
, p
, s
->ports
) {
259 const char *path
= NULL
;
261 if (p
->type
== SOCKET_SOCKET
)
262 path
= socket_address_get_path(&p
->address
);
263 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
269 r
= unit_require_mounts_for(UNIT(s
), path
);
277 static int socket_add_device_link(Socket
*s
) {
282 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
285 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
286 return unit_add_node_link(UNIT(s
), t
, false);
289 static int socket_add_default_dependencies(Socket
*s
) {
293 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
297 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
298 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
303 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
306 _pure_
static bool socket_has_exec(Socket
*s
) {
310 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
311 if (s
->exec_command
[i
])
317 static int socket_add_extras(Socket
*s
) {
323 if (have_non_accept_socket(s
)) {
325 if (!UNIT_DEREF(s
->service
)) {
328 r
= unit_load_related_unit(u
, ".service", &x
);
332 unit_ref_set(&s
->service
, x
);
335 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
340 r
= socket_add_mount_links(s
);
344 r
= socket_add_device_link(s
);
348 r
= unit_patch_contexts(u
);
352 if (socket_has_exec(s
)) {
353 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
357 r
= unit_set_default_slice(u
);
362 if (u
->default_dependencies
) {
363 r
= socket_add_default_dependencies(s
);
371 static const char *socket_find_symlink_target(Socket
*s
) {
372 const char *found
= NULL
;
375 LIST_FOREACH(port
, p
, s
->ports
) {
376 const char *f
= NULL
;
385 if (p
->address
.sockaddr
.un
.sun_path
[0] != 0)
386 f
= p
->address
.sockaddr
.un
.sun_path
;
404 static int socket_verify(Socket
*s
) {
407 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
411 log_unit_error(UNIT(s
), "Unit lacks Listen setting. Refusing.");
415 if (s
->accept
&& have_non_accept_socket(s
)) {
416 log_unit_error(UNIT(s
), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
420 if (s
->accept
&& s
->max_connections
<= 0) {
421 log_unit_error(UNIT(s
), "MaxConnection= setting too small. Refusing.");
425 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
426 log_unit_error(UNIT(s
), "Explicit service configuration for accepting socket units not supported. Refusing.");
430 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
431 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing.");
435 if (!strv_isempty(s
->symlinks
) && !socket_find_symlink_target(s
)) {
436 log_unit_error(UNIT(s
), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
443 static int socket_load(Unit
*u
) {
444 Socket
*s
= SOCKET(u
);
448 assert(u
->load_state
== UNIT_STUB
);
450 r
= unit_load_fragment_and_dropin(u
);
454 if (u
->load_state
== UNIT_LOADED
) {
455 /* This is a new unit? Then let's add in some extras */
456 r
= socket_add_extras(s
);
461 return socket_verify(s
);
464 _const_
static const char* listen_lookup(int family
, int type
) {
466 if (family
== AF_NETLINK
)
467 return "ListenNetlink";
469 if (type
== SOCK_STREAM
)
470 return "ListenStream";
471 else if (type
== SOCK_DGRAM
)
472 return "ListenDatagram";
473 else if (type
== SOCK_SEQPACKET
)
474 return "ListenSequentialPacket";
476 assert_not_reached("Unknown socket type");
480 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
481 char time_string
[FORMAT_TIMESPAN_MAX
];
483 Socket
*s
= SOCKET(u
);
490 prefix
= strempty(prefix
);
491 prefix2
= strjoina(prefix
, "\t");
494 "%sSocket State: %s\n"
496 "%sBindIPv6Only: %s\n"
498 "%sSocketMode: %04o\n"
499 "%sDirectoryMode: %04o\n"
503 "%sTransparent: %s\n"
505 "%sPassCredentials: %s\n"
506 "%sPassSecurity: %s\n"
507 "%sTCPCongestion: %s\n"
508 "%sRemoveOnStop: %s\n"
509 "%sSELinuxContextFromNet: %s\n",
510 prefix
, socket_state_to_string(s
->state
),
511 prefix
, socket_result_to_string(s
->result
),
512 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
514 prefix
, s
->socket_mode
,
515 prefix
, s
->directory_mode
,
516 prefix
, yes_no(s
->keep_alive
),
517 prefix
, yes_no(s
->no_delay
),
518 prefix
, yes_no(s
->free_bind
),
519 prefix
, yes_no(s
->transparent
),
520 prefix
, yes_no(s
->broadcast
),
521 prefix
, yes_no(s
->pass_cred
),
522 prefix
, yes_no(s
->pass_sec
),
523 prefix
, strna(s
->tcp_congestion
),
524 prefix
, yes_no(s
->remove_on_stop
),
525 prefix
, yes_no(s
->selinux_context_from_net
));
527 if (s
->control_pid
> 0)
529 "%sControl PID: "PID_FMT
"\n",
530 prefix
, s
->control_pid
);
532 if (s
->bind_to_device
)
534 "%sBindToDevice: %s\n",
535 prefix
, s
->bind_to_device
);
540 "%sNConnections: %u\n"
541 "%sMaxConnections: %u\n",
542 prefix
, s
->n_accepted
,
543 prefix
, s
->n_connections
,
544 prefix
, s
->max_connections
);
546 if (s
->priority
>= 0)
549 prefix
, s
->priority
);
551 if (s
->receive_buffer
> 0)
553 "%sReceiveBuffer: %zu\n",
554 prefix
, s
->receive_buffer
);
556 if (s
->send_buffer
> 0)
558 "%sSendBuffer: %zu\n",
559 prefix
, s
->send_buffer
);
571 if (s
->pipe_size
> 0)
574 prefix
, s
->pipe_size
);
581 if (s
->mq_maxmsg
> 0)
583 "%sMessageQueueMaxMessages: %li\n",
584 prefix
, s
->mq_maxmsg
);
586 if (s
->mq_msgsize
> 0)
588 "%sMessageQueueMessageSize: %li\n",
589 prefix
, s
->mq_msgsize
);
594 prefix
, yes_no(s
->reuse_port
));
598 "%sSmackLabel: %s\n",
603 "%sSmackLabelIPIn: %s\n",
604 prefix
, s
->smack_ip_in
);
608 "%sSmackLabelIPOut: %s\n",
609 prefix
, s
->smack_ip_out
);
611 if (!isempty(s
->user
) || !isempty(s
->group
))
614 "%sOwnerGroup: %s\n",
615 prefix
, strna(s
->user
),
616 prefix
, strna(s
->group
));
618 if (s
->keep_alive_time
> 0)
620 "%sKeepAliveTimeSec: %s\n",
621 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_time
, USEC_PER_SEC
));
623 if (s
->keep_alive_interval
)
625 "%sKeepAliveIntervalSec: %s\n",
626 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_interval
, USEC_PER_SEC
));
628 if (s
->keep_alive_cnt
)
630 "%sKeepAliveProbes: %u\n",
631 prefix
, s
->keep_alive_cnt
);
635 "%sDeferAcceptSec: %s\n",
636 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->defer_accept
, USEC_PER_SEC
));
638 LIST_FOREACH(port
, p
, s
->ports
) {
640 if (p
->type
== SOCKET_SOCKET
) {
645 if ((r
= socket_address_print(&p
->address
, &k
)) < 0)
650 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
652 } else if (p
->type
== SOCKET_SPECIAL
)
653 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
654 else if (p
->type
== SOCKET_USB_FUNCTION
)
655 fprintf(f
, "%sListenUSBFunction: %s\n", prefix
, p
->path
);
656 else if (p
->type
== SOCKET_MQUEUE
)
657 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
659 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
662 exec_context_dump(&s
->exec_context
, f
, prefix
);
663 kill_context_dump(&s
->kill_context
, f
, prefix
);
665 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
666 if (!s
->exec_command
[c
])
669 fprintf(f
, "%s-> %s:\n",
670 prefix
, socket_exec_command_to_string(c
));
672 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
676 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
679 union sockaddr_union local
, remote
;
685 if (getsockname(fd
, &local
.sa
, &l
) < 0)
689 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
692 switch (local
.sa
.sa_family
) {
696 a
= ntohl(local
.in
.sin_addr
.s_addr
),
697 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
700 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
702 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
703 ntohs(local
.in
.sin_port
),
704 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
705 ntohs(remote
.in
.sin_port
)) < 0)
712 static const unsigned char ipv4_prefix
[] = {
713 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
716 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
717 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
719 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
720 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
723 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
725 a
[0], a
[1], a
[2], a
[3],
726 ntohs(local
.in6
.sin6_port
),
727 b
[0], b
[1], b
[2], b
[3],
728 ntohs(remote
.in6
.sin6_port
)) < 0)
731 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
736 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
737 ntohs(local
.in6
.sin6_port
),
738 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
739 ntohs(remote
.in6
.sin6_port
)) < 0)
750 k
= getpeercred(fd
, &ucred
);
753 "%u-"PID_FMT
"-"UID_FMT
,
754 nr
, ucred
.pid
, ucred
.uid
) < 0)
756 } else if (k
== -ENODATA
) {
757 /* This handles the case where somebody is
758 * connecting from another pid/uid namespace
759 * (e.g. from outside of our container). */
771 assert_not_reached("Unhandled socket type.");
778 static void socket_close_fds(Socket
*s
) {
784 LIST_FOREACH(port
, p
, s
->ports
) {
786 p
->event_source
= sd_event_source_unref(p
->event_source
);
791 p
->fd
= safe_close(p
->fd
);
792 socket_cleanup_fd_list(p
);
794 /* One little note: we should normally not delete any
795 * sockets in the file system here! After all some
796 * other process we spawned might still have a
797 * reference of this fd and wants to continue to use
798 * it. Therefore we delete sockets in the file system
799 * before we create a new one, not after we stopped
802 if (s
->remove_on_stop
) {
814 socket_address_unlink(&p
->address
);
823 if (s
->remove_on_stop
)
824 STRV_FOREACH(i
, s
->symlinks
)
828 static void socket_apply_socket_options(Socket
*s
, int fd
) {
835 int b
= s
->keep_alive
;
836 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
837 log_unit_warning_errno(UNIT(s
), errno
, "SO_KEEPALIVE failed: %m");
840 if (s
->keep_alive_time
) {
841 int value
= s
->keep_alive_time
/ USEC_PER_SEC
;
842 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPIDLE
, &value
, sizeof(value
)) < 0)
843 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPIDLE failed: %m");
846 if (s
->keep_alive_interval
) {
847 int value
= s
->keep_alive_interval
/ USEC_PER_SEC
;
848 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPINTVL
, &value
, sizeof(value
)) < 0)
849 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPINTVL failed: %m");
852 if (s
->keep_alive_cnt
) {
853 int value
= s
->keep_alive_cnt
;
854 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPCNT
, &value
, sizeof(value
)) < 0)
855 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPCNT failed: %m");
858 if (s
->defer_accept
) {
859 int value
= s
->defer_accept
/ USEC_PER_SEC
;
860 if (setsockopt(fd
, SOL_TCP
, TCP_DEFER_ACCEPT
, &value
, sizeof(value
)) < 0)
861 log_unit_warning_errno(UNIT(s
), errno
, "TCP_DEFER_ACCEPT failed: %m");
866 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
867 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
872 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
873 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
878 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
879 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
884 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
885 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
888 if (s
->priority
>= 0)
889 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
890 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
892 if (s
->receive_buffer
> 0) {
893 int value
= (int) s
->receive_buffer
;
895 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
897 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
898 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
899 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
902 if (s
->send_buffer
> 0) {
903 int value
= (int) s
->send_buffer
;
904 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
905 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
906 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
910 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
911 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
914 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
915 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
917 if (s
->ip_ttl
>= 0) {
920 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
922 if (socket_ipv6_is_supported())
923 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
926 errno
= EAFNOSUPPORT
;
930 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
933 if (s
->tcp_congestion
)
934 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
935 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
937 if (s
->smack_ip_in
) {
938 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
940 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
943 if (s
->smack_ip_out
) {
944 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
946 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
950 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
956 if (s
->pipe_size
> 0)
957 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
958 log_unit_warning_errno(UNIT(s
), errno
, "F_SETPIPE_SZ: %m");
961 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
963 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_fd: %m");
967 static int fifo_address_create(
969 mode_t directory_mode
,
980 mkdir_parents_label(path
, directory_mode
);
982 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
986 /* Enforce the right access mode for the fifo */
987 old_mask
= umask(~ socket_mode
);
989 /* Include the original umask in our mask */
990 umask(~socket_mode
| old_mask
);
992 r
= mkfifo(path
, socket_mode
);
995 if (r
< 0 && errno
!= EEXIST
) {
1001 O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1007 mac_selinux_create_file_clear();
1009 if (fstat(fd
, &st
) < 0) {
1014 if (!S_ISFIFO(st
.st_mode
) ||
1015 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1016 st
.st_uid
!= getuid() ||
1017 st
.st_gid
!= getgid()) {
1027 mac_selinux_create_file_clear();
1033 static int special_address_create(
1043 fd
= open(path
, O_RDONLY
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1049 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
)) {
1069 static int ffs_address_create(
1073 _cleanup_close_
int fd
= -1;
1079 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1083 if (fstat(fd
, &st
) < 0)
1086 /* Check whether this is a regular file (ffs endpoint)*/
1087 if (!S_ISREG(st
.st_mode
))
1096 static int mq_address_create(
1106 struct mq_attr _attr
, *attr
= NULL
;
1111 if (maxmsg
> 0 && msgsize
> 0) {
1113 _attr
.mq_flags
= O_NONBLOCK
;
1114 _attr
.mq_maxmsg
= maxmsg
;
1115 _attr
.mq_msgsize
= msgsize
;
1119 /* Enforce the right access mode for the mq */
1120 old_mask
= umask(~ mq_mode
);
1122 /* Include the original umask in our mask */
1123 umask(~mq_mode
| old_mask
);
1124 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1132 if (fstat(fd
, &st
) < 0) {
1137 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1138 st
.st_uid
!= getuid() ||
1139 st
.st_gid
!= getgid()) {
1153 static int socket_symlink(Socket
*s
) {
1159 p
= socket_find_symlink_target(s
);
1163 STRV_FOREACH(i
, s
->symlinks
)
1164 symlink_label(p
, *i
);
1169 static int ffs_write_descs(int fd
, Unit
*u
) {
1170 Service
*s
= SERVICE(u
);
1173 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1176 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1180 r
= copy_file_fd(s
->usb_function_strings
, fd
, false);
1185 static int select_ep(const struct dirent
*d
) {
1186 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1189 static int ffs_dispatch_eps(SocketPort
*p
) {
1190 _cleanup_free_
struct dirent
**ent
= NULL
;
1192 _cleanup_free_
char *path
= NULL
;
1194 r
= path_get_parent(p
->path
, &path
);
1198 r
= scandir(path
, &ent
, select_ep
, alphasort
);
1203 p
->auxiliary_fds
= new(int, n
);
1204 if (!p
->auxiliary_fds
)
1207 p
->n_auxiliary_fds
= n
;
1210 for (i
= 0; i
< n
; ++i
) {
1211 _cleanup_free_
char *ep
= NULL
;
1213 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1217 path_kill_slashes(ep
);
1219 r
= ffs_address_create(ep
, &p
->auxiliary_fds
[k
]);
1231 safe_close(p
->auxiliary_fds
[--k
]);
1233 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1234 p
->n_auxiliary_fds
= 0;
1239 static int socket_open_fds(Socket
*s
) {
1243 bool know_label
= false;
1247 LIST_FOREACH(port
, p
, s
->ports
) {
1252 if (p
->type
== SOCKET_SOCKET
) {
1255 /* Figure out label, if we don't it know
1256 * yet. We do it once, for the first
1257 * socket where we need this and
1258 * remember it for the rest. */
1260 if (s
->selinux_context_from_net
) {
1261 /* Get it from the network label */
1263 r
= mac_selinux_get_our_label(&label
);
1264 if (r
< 0 && r
!= -EOPNOTSUPP
)
1268 /* Get it from the executable we are about to start */
1270 r
= socket_instantiate_service(s
);
1274 if (UNIT_ISSET(s
->service
) &&
1275 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1276 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1277 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1285 r
= socket_address_listen(
1287 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1301 socket_apply_socket_options(s
, p
->fd
);
1304 } else if (p
->type
== SOCKET_SPECIAL
) {
1306 r
= special_address_create(
1312 } else if (p
->type
== SOCKET_FIFO
) {
1314 r
= fifo_address_create(
1322 socket_apply_fifo_options(s
, p
->fd
);
1325 } else if (p
->type
== SOCKET_MQUEUE
) {
1327 r
= mq_address_create(
1335 } else if (p
->type
== SOCKET_USB_FUNCTION
) {
1337 r
= ffs_address_create(
1343 r
= ffs_write_descs(p
->fd
, s
->service
.unit
);
1347 r
= ffs_dispatch_eps(p
);
1351 assert_not_reached("Unknown port type");
1354 mac_selinux_free(label
);
1358 socket_close_fds(s
);
1359 mac_selinux_free(label
);
1364 static void socket_unwatch_fds(Socket
*s
) {
1370 LIST_FOREACH(port
, p
, s
->ports
) {
1374 if (!p
->event_source
)
1377 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1379 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1383 static int socket_watch_fds(Socket
*s
) {
1389 LIST_FOREACH(port
, p
, s
->ports
) {
1393 if (p
->event_source
) {
1394 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1398 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1402 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1409 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1410 socket_unwatch_fds(s
);
1414 static void socket_set_state(Socket
*s
, SocketState state
) {
1415 SocketState old_state
;
1418 old_state
= s
->state
;
1426 SOCKET_STOP_PRE_SIGTERM
,
1427 SOCKET_STOP_PRE_SIGKILL
,
1429 SOCKET_FINAL_SIGTERM
,
1430 SOCKET_FINAL_SIGKILL
)) {
1432 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1433 socket_unwatch_control_pid(s
);
1434 s
->control_command
= NULL
;
1435 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1438 if (state
!= SOCKET_LISTENING
)
1439 socket_unwatch_fds(s
);
1447 SOCKET_STOP_PRE_SIGTERM
,
1448 SOCKET_STOP_PRE_SIGKILL
))
1449 socket_close_fds(s
);
1451 if (state
!= old_state
)
1452 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1454 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1457 static int socket_coldplug(Unit
*u
) {
1458 Socket
*s
= SOCKET(u
);
1462 assert(s
->state
== SOCKET_DEAD
);
1464 if (s
->deserialized_state
== s
->state
)
1467 if (IN_SET(s
->deserialized_state
,
1472 SOCKET_STOP_PRE_SIGTERM
,
1473 SOCKET_STOP_PRE_SIGKILL
,
1475 SOCKET_FINAL_SIGTERM
,
1476 SOCKET_FINAL_SIGKILL
)) {
1478 if (s
->control_pid
<= 0)
1481 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1485 r
= socket_arm_timer(s
);
1490 if (IN_SET(s
->deserialized_state
,
1496 SOCKET_STOP_PRE_SIGTERM
,
1497 SOCKET_STOP_PRE_SIGKILL
)) {
1498 r
= socket_open_fds(s
);
1503 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1504 r
= socket_watch_fds(s
);
1509 socket_set_state(s
, s
->deserialized_state
);
1513 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1514 _cleanup_free_
char **argv
= NULL
;
1517 ExecParameters exec_params
= {
1518 .apply_permissions
= true,
1519 .apply_chroot
= true,
1520 .apply_tty_stdin
= true,
1521 .bus_endpoint_fd
= -1,
1528 (void) unit_realize_cgroup(UNIT(s
));
1529 if (s
->reset_cpu_usage
) {
1530 (void) unit_reset_cpu_usage(UNIT(s
));
1531 s
->reset_cpu_usage
= false;
1534 r
= unit_setup_exec_runtime(UNIT(s
));
1538 r
= socket_arm_timer(s
);
1542 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1546 exec_params
.argv
= argv
;
1547 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1548 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1549 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1550 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1551 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1552 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1554 r
= exec_spawn(UNIT(s
),
1563 r
= unit_watch_pid(UNIT(s
), pid
);
1565 /* FIXME: we need to do something here */
1572 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1576 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1580 r
= socket_arm_timer(s
);
1584 /* We have to resolve the user names out-of-process, hence
1585 * let's fork here. It's messy, but well, what can we do? */
1593 uid_t uid
= UID_INVALID
;
1594 gid_t gid
= GID_INVALID
;
1597 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1598 (void) ignore_signals(SIGPIPE
, -1);
1601 if (!isempty(s
->user
)) {
1602 const char *user
= s
->user
;
1604 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1611 if (!isempty(s
->group
)) {
1612 const char *group
= s
->group
;
1614 r
= get_group_creds(&group
, &gid
);
1621 LIST_FOREACH(port
, p
, s
->ports
) {
1622 const char *path
= NULL
;
1624 if (p
->type
== SOCKET_SOCKET
)
1625 path
= socket_address_get_path(&p
->address
);
1626 else if (p
->type
== SOCKET_FIFO
)
1632 if (chown(path
, uid
, gid
) < 0) {
1643 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1648 r
= unit_watch_pid(UNIT(s
), pid
);
1656 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1660 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1663 if (f
!= SOCKET_SUCCESS
)
1666 exec_runtime_destroy(s
->exec_runtime
);
1667 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1669 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1671 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1674 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1676 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1680 if (f
!= SOCKET_SUCCESS
)
1683 socket_unwatch_control_pid(s
);
1684 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1685 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1687 if (s
->control_command
) {
1688 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1692 socket_set_state(s
, SOCKET_STOP_POST
);
1694 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1699 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1700 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1703 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1708 if (f
!= SOCKET_SUCCESS
)
1711 r
= unit_kill_context(
1714 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1715 KILL_KILL
: KILL_TERMINATE
,
1723 r
= socket_arm_timer(s
);
1727 socket_set_state(s
, state
);
1728 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1729 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1730 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1731 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1732 else if (state
== SOCKET_FINAL_SIGTERM
)
1733 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1735 socket_enter_dead(s
, SOCKET_SUCCESS
);
1740 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1742 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1743 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1745 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1748 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1752 if (f
!= SOCKET_SUCCESS
)
1755 socket_unwatch_control_pid(s
);
1756 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1757 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1759 if (s
->control_command
) {
1760 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1764 socket_set_state(s
, SOCKET_STOP_PRE
);
1766 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1771 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1772 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1775 static void socket_enter_listening(Socket
*s
) {
1779 r
= socket_watch_fds(s
);
1781 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1785 socket_set_state(s
, SOCKET_LISTENING
);
1789 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1792 static void socket_enter_start_post(Socket
*s
) {
1796 socket_unwatch_control_pid(s
);
1797 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1798 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1800 if (s
->control_command
) {
1801 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1803 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1807 socket_set_state(s
, SOCKET_START_POST
);
1809 socket_enter_listening(s
);
1814 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1817 static void socket_enter_start_chown(Socket
*s
) {
1822 r
= socket_open_fds(s
);
1824 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1828 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1830 socket_unwatch_control_pid(s
);
1831 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1832 s
->control_command
= NULL
;
1834 r
= socket_chown(s
, &s
->control_pid
);
1836 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1840 socket_set_state(s
, SOCKET_START_CHOWN
);
1842 socket_enter_start_post(s
);
1847 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1850 static void socket_enter_start_pre(Socket
*s
) {
1854 socket_unwatch_control_pid(s
);
1855 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1856 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1858 if (s
->control_command
) {
1859 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1861 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1865 socket_set_state(s
, SOCKET_START_PRE
);
1867 socket_enter_start_chown(s
);
1872 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1875 static void socket_enter_running(Socket
*s
, int cfd
) {
1876 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1881 /* We don't take connections anymore if we are supposed to
1882 * shut down anyway */
1883 if (unit_stop_pending(UNIT(s
))) {
1885 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1890 /* Flush all sockets by closing and reopening them */
1891 socket_close_fds(s
);
1893 r
= socket_open_fds(s
);
1895 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1896 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1900 r
= socket_watch_fds(s
);
1902 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1903 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1913 bool pending
= false;
1915 /* If there's already a start pending don't bother to
1917 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1918 if (unit_active_or_pending(other
)) {
1924 if (!UNIT_ISSET(s
->service
)) {
1925 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1930 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, true, &error
, NULL
);
1935 socket_set_state(s
, SOCKET_RUNNING
);
1937 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1940 if (s
->n_connections
>= s
->max_connections
) {
1941 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1946 r
= socket_instantiate_service(s
);
1950 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1955 /* ENOTCONN is legitimate if TCP RST was received.
1956 * This connection is over, but the socket unit lives on. */
1961 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1965 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1969 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1973 service
= SERVICE(UNIT_DEREF(s
->service
));
1974 unit_ref_unset(&s
->service
);
1977 UNIT(service
)->no_gc
= false;
1979 unit_choose_id(UNIT(service
), name
);
1981 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1986 s
->n_connections
++;
1988 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, true, &error
, NULL
);
1992 /* Notify clients about changed counters */
1993 unit_add_to_dbus_queue(UNIT(s
));
1999 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
2000 cfd
>= 0 ? "template" : "non-template",
2001 bus_error_message(&error
, r
));
2003 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2007 static void socket_run_next(Socket
*s
) {
2011 assert(s
->control_command
);
2012 assert(s
->control_command
->command_next
);
2014 socket_unwatch_control_pid(s
);
2016 s
->control_command
= s
->control_command
->command_next
;
2018 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2025 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2027 if (s
->state
== SOCKET_START_POST
)
2028 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2029 else if (s
->state
== SOCKET_STOP_POST
)
2030 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2032 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2035 static int socket_start(Unit
*u
) {
2036 Socket
*s
= SOCKET(u
);
2040 /* We cannot fulfill this request right now, try again later
2042 if (IN_SET(s
->state
,
2044 SOCKET_STOP_PRE_SIGKILL
,
2045 SOCKET_STOP_PRE_SIGTERM
,
2047 SOCKET_FINAL_SIGTERM
,
2048 SOCKET_FINAL_SIGKILL
))
2051 /* Already on it! */
2052 if (IN_SET(s
->state
,
2058 /* Cannot run this without the service being around */
2059 if (UNIT_ISSET(s
->service
)) {
2062 service
= SERVICE(UNIT_DEREF(s
->service
));
2064 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2065 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2069 /* If the service is already active we cannot start the
2071 if (service
->state
!= SERVICE_DEAD
&&
2072 service
->state
!= SERVICE_FAILED
&&
2073 service
->state
!= SERVICE_AUTO_RESTART
) {
2074 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2079 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2081 s
->result
= SOCKET_SUCCESS
;
2082 s
->reset_cpu_usage
= true;
2084 socket_enter_start_pre(s
);
2089 static int socket_stop(Unit
*u
) {
2090 Socket
*s
= SOCKET(u
);
2095 if (IN_SET(s
->state
,
2097 SOCKET_STOP_PRE_SIGTERM
,
2098 SOCKET_STOP_PRE_SIGKILL
,
2100 SOCKET_FINAL_SIGTERM
,
2101 SOCKET_FINAL_SIGKILL
))
2104 /* If there's already something running we go directly into
2106 if (IN_SET(s
->state
,
2109 SOCKET_START_POST
)) {
2110 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2114 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2116 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2120 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2121 Socket
*s
= SOCKET(u
);
2129 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2130 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2131 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2133 if (s
->control_pid
> 0)
2134 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2136 if (s
->control_command_id
>= 0)
2137 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2139 LIST_FOREACH(port
, p
, s
->ports
) {
2145 copy
= fdset_put_dup(fds
, p
->fd
);
2149 if (p
->type
== SOCKET_SOCKET
) {
2150 _cleanup_free_
char *t
= NULL
;
2152 r
= socket_address_print(&p
->address
, &t
);
2156 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2157 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2159 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2161 } else if (p
->type
== SOCKET_SPECIAL
)
2162 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2163 else if (p
->type
== SOCKET_MQUEUE
)
2164 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2165 else if (p
->type
== SOCKET_USB_FUNCTION
)
2166 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2168 assert(p
->type
== SOCKET_FIFO
);
2169 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2176 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2177 Socket
*s
= SOCKET(u
);
2183 if (streq(key
, "state")) {
2186 state
= socket_state_from_string(value
);
2188 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2190 s
->deserialized_state
= state
;
2191 } else if (streq(key
, "result")) {
2194 f
= socket_result_from_string(value
);
2196 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2197 else if (f
!= SOCKET_SUCCESS
)
2200 } else if (streq(key
, "n-accepted")) {
2203 if (safe_atou(value
, &k
) < 0)
2204 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2207 } else if (streq(key
, "control-pid")) {
2210 if (parse_pid(value
, &pid
) < 0)
2211 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2213 s
->control_pid
= pid
;
2214 } else if (streq(key
, "control-command")) {
2215 SocketExecCommand id
;
2217 id
= socket_exec_command_from_string(value
);
2219 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2221 s
->control_command_id
= id
;
2222 s
->control_command
= s
->exec_command
[id
];
2224 } else if (streq(key
, "fifo")) {
2228 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2229 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2232 LIST_FOREACH(port
, p
, s
->ports
)
2233 if (p
->type
== SOCKET_FIFO
&&
2234 path_equal_or_files_same(p
->path
, value
+skip
))
2239 p
->fd
= fdset_remove(fds
, fd
);
2243 } else if (streq(key
, "special")) {
2247 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2248 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2251 LIST_FOREACH(port
, p
, s
->ports
)
2252 if (p
->type
== SOCKET_SPECIAL
&&
2253 path_equal_or_files_same(p
->path
, value
+skip
))
2258 p
->fd
= fdset_remove(fds
, fd
);
2262 } else if (streq(key
, "mqueue")) {
2266 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2267 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2270 LIST_FOREACH(port
, p
, s
->ports
)
2271 if (p
->type
== SOCKET_MQUEUE
&&
2272 streq(p
->path
, value
+skip
))
2277 p
->fd
= fdset_remove(fds
, fd
);
2281 } else if (streq(key
, "socket")) {
2282 int fd
, type
, skip
= 0;
2285 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2286 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2289 LIST_FOREACH(port
, p
, s
->ports
)
2290 if (socket_address_is(&p
->address
, value
+skip
, type
))
2295 p
->fd
= fdset_remove(fds
, fd
);
2299 } else if (streq(key
, "netlink")) {
2303 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2304 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2307 LIST_FOREACH(port
, p
, s
->ports
)
2308 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2313 p
->fd
= fdset_remove(fds
, fd
);
2317 } else if (streq(key
, "ffs")) {
2321 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2322 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2325 LIST_FOREACH(port
, p
, s
->ports
)
2326 if (p
->type
== SOCKET_USB_FUNCTION
&&
2327 path_equal_or_files_same(p
->path
, value
+skip
))
2332 p
->fd
= fdset_remove(fds
, fd
);
2337 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2342 static int socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2343 Socket
*s
= SOCKET(u
);
2348 LIST_FOREACH(port
, p
, s
->ports
) {
2352 if (p
->type
!= SOCKET_SOCKET
)
2358 FDSET_FOREACH(fd
, fds
, i
) {
2359 if (socket_address_matches_fd(&p
->address
, fd
)) {
2360 p
->fd
= fdset_remove(fds
, fd
);
2361 s
->deserialized_state
= SOCKET_LISTENING
;
2370 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2373 return state_translation_table
[SOCKET(u
)->state
];
2376 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2379 return socket_state_to_string(SOCKET(u
)->state
);
2382 const char* socket_port_type_to_string(SocketPort
*p
) {
2390 switch (p
->address
.type
) {
2398 case SOCK_SEQPACKET
:
2399 return "SequentialPacket";
2402 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2409 case SOCKET_SPECIAL
:
2413 return "MessageQueue";
2418 case SOCKET_USB_FUNCTION
:
2419 return "USBFunction";
2426 _pure_
static bool socket_check_gc(Unit
*u
) {
2427 Socket
*s
= SOCKET(u
);
2431 return s
->n_connections
> 0;
2434 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2435 SocketPort
*p
= userdata
;
2441 if (p
->socket
->state
!= SOCKET_LISTENING
)
2444 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2446 if (revents
!= EPOLLIN
) {
2448 if (revents
& EPOLLHUP
)
2449 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.");
2451 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2455 if (p
->socket
->accept
&&
2456 p
->type
== SOCKET_SOCKET
&&
2457 socket_address_can_accept(&p
->address
)) {
2461 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2467 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2474 socket_apply_socket_options(p
->socket
, cfd
);
2477 socket_enter_running(p
->socket
, cfd
);
2481 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2485 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2486 Socket
*s
= SOCKET(u
);
2492 if (pid
!= s
->control_pid
)
2497 if (is_clean_exit(code
, status
, NULL
))
2499 else if (code
== CLD_EXITED
)
2500 f
= SOCKET_FAILURE_EXIT_CODE
;
2501 else if (code
== CLD_KILLED
)
2502 f
= SOCKET_FAILURE_SIGNAL
;
2503 else if (code
== CLD_DUMPED
)
2504 f
= SOCKET_FAILURE_CORE_DUMP
;
2506 assert_not_reached("Unknown sigchld code");
2508 if (s
->control_command
) {
2509 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2511 if (s
->control_command
->ignore
)
2515 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2516 "Control process exited, code=%s status=%i",
2517 sigchld_code_to_string(code
), status
);
2519 if (f
!= SOCKET_SUCCESS
)
2522 if (s
->control_command
&&
2523 s
->control_command
->command_next
&&
2524 f
== SOCKET_SUCCESS
) {
2526 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2529 s
->control_command
= NULL
;
2530 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2532 /* No further commands for this step, so let's figure
2533 * out what to do next */
2535 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2539 case SOCKET_START_PRE
:
2540 if (f
== SOCKET_SUCCESS
)
2541 socket_enter_start_chown(s
);
2543 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2546 case SOCKET_START_CHOWN
:
2547 if (f
== SOCKET_SUCCESS
)
2548 socket_enter_start_post(s
);
2550 socket_enter_stop_pre(s
, f
);
2553 case SOCKET_START_POST
:
2554 if (f
== SOCKET_SUCCESS
)
2555 socket_enter_listening(s
);
2557 socket_enter_stop_pre(s
, f
);
2560 case SOCKET_STOP_PRE
:
2561 case SOCKET_STOP_PRE_SIGTERM
:
2562 case SOCKET_STOP_PRE_SIGKILL
:
2563 socket_enter_stop_post(s
, f
);
2566 case SOCKET_STOP_POST
:
2567 case SOCKET_FINAL_SIGTERM
:
2568 case SOCKET_FINAL_SIGKILL
:
2569 socket_enter_dead(s
, f
);
2573 assert_not_reached("Uh, control process died at wrong time.");
2577 /* Notify clients about changed exit status */
2578 unit_add_to_dbus_queue(u
);
2581 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2582 Socket
*s
= SOCKET(userdata
);
2585 assert(s
->timer_event_source
== source
);
2589 case SOCKET_START_PRE
:
2590 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2591 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2594 case SOCKET_START_CHOWN
:
2595 case SOCKET_START_POST
:
2596 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2597 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2600 case SOCKET_STOP_PRE
:
2601 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2602 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2605 case SOCKET_STOP_PRE_SIGTERM
:
2606 if (s
->kill_context
.send_sigkill
) {
2607 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2608 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2610 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2611 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2615 case SOCKET_STOP_PRE_SIGKILL
:
2616 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2617 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2620 case SOCKET_STOP_POST
:
2621 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2622 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2625 case SOCKET_FINAL_SIGTERM
:
2626 if (s
->kill_context
.send_sigkill
) {
2627 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2628 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2630 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2631 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2635 case SOCKET_FINAL_SIGKILL
:
2636 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2637 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2641 assert_not_reached("Timeout at wrong time.");
2647 int socket_collect_fds(Socket
*s
, int **fds
, unsigned *n_fds
) {
2657 /* Called from the service code for requesting our fds */
2660 LIST_FOREACH(port
, p
, s
->ports
) {
2663 rn_fds
+= p
->n_auxiliary_fds
;
2672 rfds
= new(int, rn_fds
);
2677 LIST_FOREACH(port
, p
, s
->ports
) {
2680 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2681 rfds
[k
++] = p
->auxiliary_fds
[i
];
2684 assert(k
== rn_fds
);
2692 static void socket_reset_failed(Unit
*u
) {
2693 Socket
*s
= SOCKET(u
);
2697 if (s
->state
== SOCKET_FAILED
)
2698 socket_set_state(s
, SOCKET_DEAD
);
2700 s
->result
= SOCKET_SUCCESS
;
2703 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2706 /* The service is dead. Dang!
2708 * This is strictly for one-instance-for-all-connections
2711 if (s
->state
== SOCKET_RUNNING
) {
2712 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2713 if (failed_permanent
)
2714 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2716 socket_enter_listening(s
);
2720 void socket_connection_unref(Socket
*s
) {
2723 /* The service is dead. Yay!
2725 * This is strictly for one-instance-per-connection
2728 assert(s
->n_connections
> 0);
2731 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2734 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2735 Socket
*s
= SOCKET(u
);
2741 /* Don't propagate state changes from the service if we are
2742 already down or accepting connections */
2743 if ((s
->state
!= SOCKET_RUNNING
&&
2744 s
->state
!= SOCKET_LISTENING
) ||
2748 if (other
->load_state
!= UNIT_LOADED
||
2749 other
->type
!= UNIT_SERVICE
)
2752 se
= SERVICE(other
);
2754 if (se
->state
== SERVICE_FAILED
)
2755 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2757 if (se
->state
== SERVICE_DEAD
||
2758 se
->state
== SERVICE_FINAL_SIGTERM
||
2759 se
->state
== SERVICE_FINAL_SIGKILL
||
2760 se
->state
== SERVICE_AUTO_RESTART
)
2761 socket_notify_service_dead(s
, false);
2763 if (se
->state
== SERVICE_RUNNING
)
2764 socket_set_state(s
, SOCKET_RUNNING
);
2767 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2768 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2771 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2772 Socket
*s
= SOCKET(u
);
2775 if (!s
->timer_event_source
)
2778 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2785 static const char* const socket_state_table
[_SOCKET_STATE_MAX
] = {
2786 [SOCKET_DEAD
] = "dead",
2787 [SOCKET_START_PRE
] = "start-pre",
2788 [SOCKET_START_CHOWN
] = "start-chown",
2789 [SOCKET_START_POST
] = "start-post",
2790 [SOCKET_LISTENING
] = "listening",
2791 [SOCKET_RUNNING
] = "running",
2792 [SOCKET_STOP_PRE
] = "stop-pre",
2793 [SOCKET_STOP_PRE_SIGTERM
] = "stop-pre-sigterm",
2794 [SOCKET_STOP_PRE_SIGKILL
] = "stop-pre-sigkill",
2795 [SOCKET_STOP_POST
] = "stop-post",
2796 [SOCKET_FINAL_SIGTERM
] = "final-sigterm",
2797 [SOCKET_FINAL_SIGKILL
] = "final-sigkill",
2798 [SOCKET_FAILED
] = "failed"
2801 DEFINE_STRING_TABLE_LOOKUP(socket_state
, SocketState
);
2803 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2804 [SOCKET_EXEC_START_PRE
] = "StartPre",
2805 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2806 [SOCKET_EXEC_START_POST
] = "StartPost",
2807 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2808 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2811 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2813 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2814 [SOCKET_SUCCESS
] = "success",
2815 [SOCKET_FAILURE_RESOURCES
] = "resources",
2816 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2817 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2818 [SOCKET_FAILURE_SIGNAL
] = "signal",
2819 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2820 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2823 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2825 const UnitVTable socket_vtable
= {
2826 .object_size
= sizeof(Socket
),
2827 .exec_context_offset
= offsetof(Socket
, exec_context
),
2828 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2829 .kill_context_offset
= offsetof(Socket
, kill_context
),
2830 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2836 .private_section
= "Socket",
2838 .init
= socket_init
,
2839 .done
= socket_done
,
2840 .load
= socket_load
,
2842 .coldplug
= socket_coldplug
,
2844 .dump
= socket_dump
,
2846 .start
= socket_start
,
2847 .stop
= socket_stop
,
2849 .kill
= socket_kill
,
2851 .get_timeout
= socket_get_timeout
,
2853 .serialize
= socket_serialize
,
2854 .deserialize_item
= socket_deserialize_item
,
2855 .distribute_fds
= socket_distribute_fds
,
2857 .active_state
= socket_active_state
,
2858 .sub_state_to_string
= socket_sub_state_to_string
,
2860 .check_gc
= socket_check_gc
,
2862 .sigchld_event
= socket_sigchld_event
,
2864 .trigger_notify
= socket_trigger_notify
,
2866 .reset_failed
= socket_reset_failed
,
2868 .bus_vtable
= bus_socket_vtable
,
2869 .bus_set_property
= bus_socket_set_property
,
2870 .bus_commit_properties
= bus_socket_commit_properties
,
2872 .status_message_formats
= {
2873 /*.starting_stopping = {
2874 [0] = "Starting socket %s...",
2875 [1] = "Stopping socket %s...",
2877 .finished_start_job
= {
2878 [JOB_DONE
] = "Listening on %s.",
2879 [JOB_FAILED
] = "Failed to listen on %s.",
2880 [JOB_TIMEOUT
] = "Timed out starting %s.",
2882 .finished_stop_job
= {
2883 [JOB_DONE
] = "Closed %s.",
2884 [JOB_FAILED
] = "Failed stopping %s.",
2885 [JOB_TIMEOUT
] = "Timed out stopping %s.",