2 This file is part of systemd.
4 Copyright 2010 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 #include <arpa/inet.h>
24 #include <netinet/tcp.h>
26 #include <sys/epoll.h>
29 #include <linux/sctp.h>
32 #include "alloc-util.h"
33 #include "bus-error.h"
36 #include "dbus-socket.h"
38 #include "exit-status.h"
40 #include "formats-util.h"
45 #include "parse-util.h"
46 #include "path-util.h"
47 #include "process-util.h"
48 #include "selinux-util.h"
49 #include "signal-util.h"
50 #include "smack-util.h"
53 #include "string-table.h"
54 #include "string-util.h"
56 #include "unit-name.h"
57 #include "unit-printf.h"
59 #include "user-util.h"
61 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
62 [SOCKET_DEAD
] = UNIT_INACTIVE
,
63 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
64 [SOCKET_START_CHOWN
] = UNIT_ACTIVATING
,
65 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
66 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
67 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
68 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
69 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
70 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
71 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
72 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
73 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
74 [SOCKET_FAILED
] = UNIT_FAILED
77 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
78 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
80 static void socket_init(Unit
*u
) {
81 Socket
*s
= SOCKET(u
);
84 assert(u
->load_state
== UNIT_STUB
);
86 s
->backlog
= SOMAXCONN
;
87 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
88 s
->directory_mode
= 0755;
89 s
->socket_mode
= 0666;
91 s
->max_connections
= 64;
98 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
99 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
101 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
104 static void socket_unwatch_control_pid(Socket
*s
) {
107 if (s
->control_pid
<= 0)
110 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
114 static void socket_cleanup_fd_list(SocketPort
*p
) {
117 close_many(p
->auxiliary_fds
, p
->n_auxiliary_fds
);
118 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
119 p
->n_auxiliary_fds
= 0;
122 void socket_free_ports(Socket
*s
) {
127 while ((p
= s
->ports
)) {
128 LIST_REMOVE(port
, s
->ports
, p
);
130 sd_event_source_unref(p
->event_source
);
132 socket_cleanup_fd_list(p
);
139 static void socket_done(Unit
*u
) {
140 Socket
*s
= SOCKET(u
);
144 socket_free_ports(s
);
146 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
147 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
148 s
->control_command
= NULL
;
150 socket_unwatch_control_pid(s
);
152 unit_ref_unset(&s
->service
);
154 s
->tcp_congestion
= mfree(s
->tcp_congestion
);
155 s
->bind_to_device
= mfree(s
->bind_to_device
);
157 s
->smack
= mfree(s
->smack
);
158 s
->smack_ip_in
= mfree(s
->smack_ip_in
);
159 s
->smack_ip_out
= mfree(s
->smack_ip_out
);
161 strv_free(s
->symlinks
);
163 s
->user
= mfree(s
->user
);
164 s
->group
= mfree(s
->group
);
166 s
->fdname
= mfree(s
->fdname
);
168 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
171 static int socket_arm_timer(Socket
*s
, usec_t usec
) {
176 if (s
->timer_event_source
) {
177 r
= sd_event_source_set_time(s
->timer_event_source
, usec
);
181 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
184 if (usec
== USEC_INFINITY
)
187 r
= sd_event_add_time(
188 UNIT(s
)->manager
->event
,
189 &s
->timer_event_source
,
192 socket_dispatch_timer
, s
);
196 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
201 int socket_instantiate_service(Socket
*s
) {
202 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
208 /* This fills in s->service if it isn't filled in yet. For
209 * Accept=yes sockets we create the next connection service
210 * here. For Accept=no this is mostly a NOP since the service
211 * is figured out at load time anyway. */
213 if (UNIT_DEREF(s
->service
))
219 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
223 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
226 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
231 unit_ref_set(&s
->service
, u
);
233 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
236 static bool have_non_accept_socket(Socket
*s
) {
244 LIST_FOREACH(port
, p
, s
->ports
) {
246 if (p
->type
!= SOCKET_SOCKET
)
249 if (!socket_address_can_accept(&p
->address
))
256 static int socket_add_mount_links(Socket
*s
) {
262 LIST_FOREACH(port
, p
, s
->ports
) {
263 const char *path
= NULL
;
265 if (p
->type
== SOCKET_SOCKET
)
266 path
= socket_address_get_path(&p
->address
);
267 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
273 r
= unit_require_mounts_for(UNIT(s
), path
);
281 static int socket_add_device_link(Socket
*s
) {
286 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
289 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
290 return unit_add_node_link(UNIT(s
), t
, false, UNIT_BINDS_TO
);
293 static int socket_add_default_dependencies(Socket
*s
) {
297 if (!UNIT(s
)->default_dependencies
)
300 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
304 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
305 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
310 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
313 _pure_
static bool socket_has_exec(Socket
*s
) {
317 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
318 if (s
->exec_command
[i
])
324 static int socket_add_extras(Socket
*s
) {
330 if (have_non_accept_socket(s
)) {
332 if (!UNIT_DEREF(s
->service
)) {
335 r
= unit_load_related_unit(u
, ".service", &x
);
339 unit_ref_set(&s
->service
, x
);
342 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
347 r
= socket_add_mount_links(s
);
351 r
= socket_add_device_link(s
);
355 r
= unit_patch_contexts(u
);
359 if (socket_has_exec(s
)) {
360 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
364 r
= unit_set_default_slice(u
);
369 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");
877 if (s
->socket_protocol
== IPPROTO_SCTP
) {
878 if (setsockopt(fd
, SOL_SCTP
, SCTP_NODELAY
, &b
, sizeof(b
)) < 0)
879 log_unit_warning_errno(UNIT(s
), errno
, "SCTP_NODELAY failed: %m");
881 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
882 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
888 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
889 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
894 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
895 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
900 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
901 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
904 if (s
->priority
>= 0)
905 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
906 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
908 if (s
->receive_buffer
> 0) {
909 int value
= (int) s
->receive_buffer
;
911 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
913 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
914 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
915 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
918 if (s
->send_buffer
> 0) {
919 int value
= (int) s
->send_buffer
;
920 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
921 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
922 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
926 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
927 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
930 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
931 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
933 if (s
->ip_ttl
>= 0) {
936 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
938 if (socket_ipv6_is_supported())
939 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
942 errno
= EAFNOSUPPORT
;
946 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
949 if (s
->tcp_congestion
)
950 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
951 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
953 if (s
->smack_ip_in
) {
954 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
956 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
959 if (s
->smack_ip_out
) {
960 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
962 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
966 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
972 if (s
->pipe_size
> 0)
973 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
974 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
977 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
979 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
983 static int fifo_address_create(
985 mode_t directory_mode
,
986 mode_t socket_mode
) {
988 _cleanup_close_
int fd
= -1;
995 mkdir_parents_label(path
, directory_mode
);
997 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
1001 /* Enforce the right access mode for the fifo */
1002 old_mask
= umask(~ socket_mode
);
1004 /* Include the original umask in our mask */
1005 (void) umask(~socket_mode
| old_mask
);
1007 r
= mkfifo(path
, socket_mode
);
1008 (void) umask(old_mask
);
1010 if (r
< 0 && errno
!= EEXIST
) {
1015 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1021 mac_selinux_create_file_clear();
1023 if (fstat(fd
, &st
) < 0) {
1028 if (!S_ISFIFO(st
.st_mode
) ||
1029 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1030 st
.st_uid
!= getuid() ||
1031 st
.st_gid
!= getgid()) {
1042 mac_selinux_create_file_clear();
1046 static int special_address_create(const char *path
, bool writable
) {
1047 _cleanup_close_
int fd
= -1;
1053 fd
= open(path
, (writable
? O_RDWR
: O_RDONLY
)|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1057 if (fstat(fd
, &st
) < 0)
1060 /* Check whether this is a /proc, /sys or /dev file or char device */
1061 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1070 static int usbffs_address_create(const char *path
) {
1071 _cleanup_close_
int fd
= -1;
1077 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1081 if (fstat(fd
, &st
) < 0)
1084 /* Check whether this is a regular file (ffs endpoint)*/
1085 if (!S_ISREG(st
.st_mode
))
1094 static int mq_address_create(
1100 _cleanup_close_
int fd
= -1;
1103 struct mq_attr _attr
, *attr
= NULL
;
1108 if (maxmsg
> 0 && msgsize
> 0) {
1109 _attr
= (struct mq_attr
) {
1110 .mq_flags
= O_NONBLOCK
,
1111 .mq_maxmsg
= maxmsg
,
1112 .mq_msgsize
= msgsize
,
1117 /* Enforce the right access mode for the mq */
1118 old_mask
= umask(~ mq_mode
);
1120 /* Include the original umask in our mask */
1121 (void) umask(~mq_mode
| old_mask
);
1122 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1123 (void) umask(old_mask
);
1128 if (fstat(fd
, &st
) < 0)
1131 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1132 st
.st_uid
!= getuid() ||
1133 st
.st_gid
!= getgid())
1142 static int socket_symlink(Socket
*s
) {
1148 p
= socket_find_symlink_target(s
);
1152 STRV_FOREACH(i
, s
->symlinks
)
1153 symlink_label(p
, *i
);
1158 static int usbffs_write_descs(int fd
, Service
*s
) {
1161 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1164 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1168 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1171 static int usbffs_select_ep(const struct dirent
*d
) {
1172 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1175 static int usbffs_dispatch_eps(SocketPort
*p
) {
1176 _cleanup_free_
struct dirent
**ent
= NULL
;
1177 _cleanup_free_
char *path
= NULL
;
1180 path
= dirname_malloc(p
->path
);
1184 r
= scandir(path
, &ent
, usbffs_select_ep
, alphasort
);
1189 p
->auxiliary_fds
= new(int, n
);
1190 if (!p
->auxiliary_fds
)
1193 p
->n_auxiliary_fds
= n
;
1196 for (i
= 0; i
< n
; ++i
) {
1197 _cleanup_free_
char *ep
= NULL
;
1199 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1203 path_kill_slashes(ep
);
1205 r
= usbffs_address_create(ep
);
1209 p
->auxiliary_fds
[k
] = r
;
1218 close_many(p
->auxiliary_fds
, k
);
1219 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1220 p
->n_auxiliary_fds
= 0;
1225 static int socket_open_fds(Socket
*s
) {
1226 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1227 bool know_label
= false;
1233 LIST_FOREACH(port
, p
, s
->ports
) {
1243 /* Figure out label, if we don't it know
1244 * yet. We do it once, for the first
1245 * socket where we need this and
1246 * remember it for the rest. */
1248 if (s
->selinux_context_from_net
) {
1249 /* Get it from the network label */
1251 r
= mac_selinux_get_our_label(&label
);
1252 if (r
< 0 && r
!= -EOPNOTSUPP
)
1256 /* Get it from the executable we are about to start */
1258 r
= socket_instantiate_service(s
);
1262 if (UNIT_ISSET(s
->service
) &&
1263 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1264 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1265 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1273 /* Apply the socket protocol */
1274 switch(p
->address
.type
) {
1276 case SOCK_SEQPACKET
:
1277 if (p
->socket
->socket_protocol
== IPPROTO_SCTP
)
1278 p
->address
.protocol
= p
->socket
->socket_protocol
;
1281 if (p
->socket
->socket_protocol
== IPPROTO_UDPLITE
)
1282 p
->address
.protocol
= p
->socket
->socket_protocol
;
1286 r
= socket_address_listen(
1288 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1302 socket_apply_socket_options(s
, p
->fd
);
1306 case SOCKET_SPECIAL
:
1308 p
->fd
= special_address_create(p
->path
, s
->writable
);
1317 p
->fd
= fifo_address_create(
1326 socket_apply_fifo_options(s
, p
->fd
);
1332 p
->fd
= mq_address_create(
1343 case SOCKET_USB_FUNCTION
:
1345 p
->fd
= usbffs_address_create(p
->path
);
1351 r
= usbffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1355 r
= usbffs_dispatch_eps(p
);
1362 assert_not_reached("Unknown port type");
1369 socket_close_fds(s
);
1373 static void socket_unwatch_fds(Socket
*s
) {
1379 LIST_FOREACH(port
, p
, s
->ports
) {
1383 if (!p
->event_source
)
1386 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1388 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1392 static int socket_watch_fds(Socket
*s
) {
1398 LIST_FOREACH(port
, p
, s
->ports
) {
1402 if (p
->event_source
) {
1403 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1407 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1411 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1418 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1419 socket_unwatch_fds(s
);
1423 static void socket_set_state(Socket
*s
, SocketState state
) {
1424 SocketState old_state
;
1427 old_state
= s
->state
;
1435 SOCKET_STOP_PRE_SIGTERM
,
1436 SOCKET_STOP_PRE_SIGKILL
,
1438 SOCKET_FINAL_SIGTERM
,
1439 SOCKET_FINAL_SIGKILL
)) {
1441 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1442 socket_unwatch_control_pid(s
);
1443 s
->control_command
= NULL
;
1444 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1447 if (state
!= SOCKET_LISTENING
)
1448 socket_unwatch_fds(s
);
1456 SOCKET_STOP_PRE_SIGTERM
,
1457 SOCKET_STOP_PRE_SIGKILL
))
1458 socket_close_fds(s
);
1460 if (state
!= old_state
)
1461 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1463 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1466 static int socket_coldplug(Unit
*u
) {
1467 Socket
*s
= SOCKET(u
);
1471 assert(s
->state
== SOCKET_DEAD
);
1473 if (s
->deserialized_state
== s
->state
)
1476 if (s
->control_pid
> 0 &&
1477 pid_is_unwaited(s
->control_pid
) &&
1478 IN_SET(s
->deserialized_state
,
1483 SOCKET_STOP_PRE_SIGTERM
,
1484 SOCKET_STOP_PRE_SIGKILL
,
1486 SOCKET_FINAL_SIGTERM
,
1487 SOCKET_FINAL_SIGKILL
)) {
1489 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1493 r
= socket_arm_timer(s
, usec_add(u
->state_change_timestamp
.monotonic
, s
->timeout_usec
));
1498 if (IN_SET(s
->deserialized_state
,
1504 SOCKET_STOP_PRE_SIGTERM
,
1505 SOCKET_STOP_PRE_SIGKILL
)) {
1507 r
= socket_open_fds(s
);
1512 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1513 r
= socket_watch_fds(s
);
1518 socket_set_state(s
, s
->deserialized_state
);
1522 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1523 _cleanup_free_
char **argv
= NULL
;
1526 ExecParameters exec_params
= {
1527 .apply_permissions
= true,
1528 .apply_chroot
= true,
1529 .apply_tty_stdin
= true,
1539 (void) unit_realize_cgroup(UNIT(s
));
1540 if (s
->reset_cpu_usage
) {
1541 (void) unit_reset_cpu_usage(UNIT(s
));
1542 s
->reset_cpu_usage
= false;
1545 r
= unit_setup_exec_runtime(UNIT(s
));
1549 r
= socket_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
1553 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1557 exec_params
.argv
= argv
;
1558 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1559 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1560 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1561 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1562 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1563 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1565 r
= exec_spawn(UNIT(s
),
1574 r
= unit_watch_pid(UNIT(s
), pid
);
1576 /* FIXME: we need to do something here */
1583 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1587 r
= socket_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
1591 /* We have to resolve the user names out-of-process, hence
1592 * let's fork here. It's messy, but well, what can we do? */
1600 uid_t uid
= UID_INVALID
;
1601 gid_t gid
= GID_INVALID
;
1604 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1605 (void) ignore_signals(SIGPIPE
, -1);
1608 if (!isempty(s
->user
)) {
1609 const char *user
= s
->user
;
1611 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1618 if (!isempty(s
->group
)) {
1619 const char *group
= s
->group
;
1621 r
= get_group_creds(&group
, &gid
);
1628 LIST_FOREACH(port
, p
, s
->ports
) {
1629 const char *path
= NULL
;
1631 if (p
->type
== SOCKET_SOCKET
)
1632 path
= socket_address_get_path(&p
->address
);
1633 else if (p
->type
== SOCKET_FIFO
)
1639 if (chown(path
, uid
, gid
) < 0) {
1650 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1655 r
= unit_watch_pid(UNIT(s
), pid
);
1663 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1667 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1670 if (f
!= SOCKET_SUCCESS
)
1673 exec_runtime_destroy(s
->exec_runtime
);
1674 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1676 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1678 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1681 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1683 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1687 if (f
!= SOCKET_SUCCESS
)
1690 socket_unwatch_control_pid(s
);
1691 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1692 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1694 if (s
->control_command
) {
1695 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1699 socket_set_state(s
, SOCKET_STOP_POST
);
1701 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1706 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1707 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1710 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1715 if (f
!= SOCKET_SUCCESS
)
1718 r
= unit_kill_context(
1721 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1722 KILL_KILL
: KILL_TERMINATE
,
1730 r
= socket_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
1734 socket_set_state(s
, state
);
1735 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1736 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1737 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1738 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1739 else if (state
== SOCKET_FINAL_SIGTERM
)
1740 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1742 socket_enter_dead(s
, SOCKET_SUCCESS
);
1747 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1749 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1750 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1752 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1755 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1759 if (f
!= SOCKET_SUCCESS
)
1762 socket_unwatch_control_pid(s
);
1763 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1764 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1766 if (s
->control_command
) {
1767 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1771 socket_set_state(s
, SOCKET_STOP_PRE
);
1773 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1778 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1779 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1782 static void socket_enter_listening(Socket
*s
) {
1786 r
= socket_watch_fds(s
);
1788 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1792 socket_set_state(s
, SOCKET_LISTENING
);
1796 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1799 static void socket_enter_start_post(Socket
*s
) {
1803 socket_unwatch_control_pid(s
);
1804 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1805 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1807 if (s
->control_command
) {
1808 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1810 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1814 socket_set_state(s
, SOCKET_START_POST
);
1816 socket_enter_listening(s
);
1821 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1824 static void socket_enter_start_chown(Socket
*s
) {
1829 r
= socket_open_fds(s
);
1831 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1835 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1837 socket_unwatch_control_pid(s
);
1838 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1839 s
->control_command
= NULL
;
1841 r
= socket_chown(s
, &s
->control_pid
);
1843 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1847 socket_set_state(s
, SOCKET_START_CHOWN
);
1849 socket_enter_start_post(s
);
1854 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1857 static void socket_enter_start_pre(Socket
*s
) {
1861 socket_unwatch_control_pid(s
);
1862 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1863 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1865 if (s
->control_command
) {
1866 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1868 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1872 socket_set_state(s
, SOCKET_START_PRE
);
1874 socket_enter_start_chown(s
);
1879 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1882 static void socket_enter_running(Socket
*s
, int cfd
) {
1883 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
1888 /* We don't take connections anymore if we are supposed to
1889 * shut down anyway */
1890 if (unit_stop_pending(UNIT(s
))) {
1892 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1897 /* Flush all sockets by closing and reopening them */
1898 socket_close_fds(s
);
1900 r
= socket_open_fds(s
);
1902 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1903 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1907 r
= socket_watch_fds(s
);
1909 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1910 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1920 bool pending
= false;
1922 /* If there's already a start pending don't bother to
1924 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1925 if (unit_active_or_pending(other
)) {
1931 if (!UNIT_ISSET(s
->service
)) {
1932 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1937 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, &error
, NULL
);
1942 socket_set_state(s
, SOCKET_RUNNING
);
1944 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1947 if (s
->n_connections
>= s
->max_connections
) {
1948 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1953 r
= socket_instantiate_service(s
);
1957 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1962 /* ENOTCONN is legitimate if TCP RST was received.
1963 * This connection is over, but the socket unit lives on. */
1968 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1972 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1976 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1980 service
= SERVICE(UNIT_DEREF(s
->service
));
1981 unit_ref_unset(&s
->service
);
1984 UNIT(service
)->no_gc
= false;
1986 unit_choose_id(UNIT(service
), name
);
1988 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1993 s
->n_connections
++;
1995 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, &error
, NULL
);
1999 /* Notify clients about changed counters */
2000 unit_add_to_dbus_queue(UNIT(s
));
2006 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
2007 cfd
>= 0 ? "template" : "non-template",
2008 bus_error_message(&error
, r
));
2010 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2014 static void socket_run_next(Socket
*s
) {
2018 assert(s
->control_command
);
2019 assert(s
->control_command
->command_next
);
2021 socket_unwatch_control_pid(s
);
2023 s
->control_command
= s
->control_command
->command_next
;
2025 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2032 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2034 if (s
->state
== SOCKET_START_POST
)
2035 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2036 else if (s
->state
== SOCKET_STOP_POST
)
2037 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2039 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2042 static int socket_start(Unit
*u
) {
2043 Socket
*s
= SOCKET(u
);
2047 /* We cannot fulfill this request right now, try again later
2049 if (IN_SET(s
->state
,
2051 SOCKET_STOP_PRE_SIGKILL
,
2052 SOCKET_STOP_PRE_SIGTERM
,
2054 SOCKET_FINAL_SIGTERM
,
2055 SOCKET_FINAL_SIGKILL
))
2058 /* Already on it! */
2059 if (IN_SET(s
->state
,
2065 /* Cannot run this without the service being around */
2066 if (UNIT_ISSET(s
->service
)) {
2069 service
= SERVICE(UNIT_DEREF(s
->service
));
2071 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2072 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2076 /* If the service is already active we cannot start the
2078 if (service
->state
!= SERVICE_DEAD
&&
2079 service
->state
!= SERVICE_FAILED
&&
2080 service
->state
!= SERVICE_AUTO_RESTART
) {
2081 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2086 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2088 s
->result
= SOCKET_SUCCESS
;
2089 s
->reset_cpu_usage
= true;
2091 socket_enter_start_pre(s
);
2096 static int socket_stop(Unit
*u
) {
2097 Socket
*s
= SOCKET(u
);
2102 if (IN_SET(s
->state
,
2104 SOCKET_STOP_PRE_SIGTERM
,
2105 SOCKET_STOP_PRE_SIGKILL
,
2107 SOCKET_FINAL_SIGTERM
,
2108 SOCKET_FINAL_SIGKILL
))
2111 /* If there's already something running we go directly into
2113 if (IN_SET(s
->state
,
2116 SOCKET_START_POST
)) {
2117 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2121 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2123 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2127 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2128 Socket
*s
= SOCKET(u
);
2136 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2137 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2138 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2140 if (s
->control_pid
> 0)
2141 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2143 if (s
->control_command_id
>= 0)
2144 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2146 LIST_FOREACH(port
, p
, s
->ports
) {
2152 copy
= fdset_put_dup(fds
, p
->fd
);
2156 if (p
->type
== SOCKET_SOCKET
) {
2157 _cleanup_free_
char *t
= NULL
;
2159 r
= socket_address_print(&p
->address
, &t
);
2163 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2164 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2166 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2168 } else if (p
->type
== SOCKET_SPECIAL
)
2169 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2170 else if (p
->type
== SOCKET_MQUEUE
)
2171 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2172 else if (p
->type
== SOCKET_USB_FUNCTION
)
2173 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2175 assert(p
->type
== SOCKET_FIFO
);
2176 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2183 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2184 Socket
*s
= SOCKET(u
);
2190 if (streq(key
, "state")) {
2193 state
= socket_state_from_string(value
);
2195 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2197 s
->deserialized_state
= state
;
2198 } else if (streq(key
, "result")) {
2201 f
= socket_result_from_string(value
);
2203 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2204 else if (f
!= SOCKET_SUCCESS
)
2207 } else if (streq(key
, "n-accepted")) {
2210 if (safe_atou(value
, &k
) < 0)
2211 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2214 } else if (streq(key
, "control-pid")) {
2217 if (parse_pid(value
, &pid
) < 0)
2218 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2220 s
->control_pid
= pid
;
2221 } else if (streq(key
, "control-command")) {
2222 SocketExecCommand id
;
2224 id
= socket_exec_command_from_string(value
);
2226 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2228 s
->control_command_id
= id
;
2229 s
->control_command
= s
->exec_command
[id
];
2231 } else if (streq(key
, "fifo")) {
2235 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2236 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2239 LIST_FOREACH(port
, p
, s
->ports
)
2240 if (p
->type
== SOCKET_FIFO
&&
2241 path_equal_or_files_same(p
->path
, value
+skip
))
2246 p
->fd
= fdset_remove(fds
, fd
);
2250 } else if (streq(key
, "special")) {
2254 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2255 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2258 LIST_FOREACH(port
, p
, s
->ports
)
2259 if (p
->type
== SOCKET_SPECIAL
&&
2260 path_equal_or_files_same(p
->path
, value
+skip
))
2265 p
->fd
= fdset_remove(fds
, fd
);
2269 } else if (streq(key
, "mqueue")) {
2273 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2274 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2277 LIST_FOREACH(port
, p
, s
->ports
)
2278 if (p
->type
== SOCKET_MQUEUE
&&
2279 streq(p
->path
, value
+skip
))
2284 p
->fd
= fdset_remove(fds
, fd
);
2288 } else if (streq(key
, "socket")) {
2289 int fd
, type
, skip
= 0;
2292 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2293 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2296 LIST_FOREACH(port
, p
, s
->ports
)
2297 if (socket_address_is(&p
->address
, value
+skip
, type
))
2302 p
->fd
= fdset_remove(fds
, fd
);
2306 } else if (streq(key
, "netlink")) {
2310 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2311 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2314 LIST_FOREACH(port
, p
, s
->ports
)
2315 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2320 p
->fd
= fdset_remove(fds
, fd
);
2324 } else if (streq(key
, "ffs")) {
2328 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2329 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2332 LIST_FOREACH(port
, p
, s
->ports
)
2333 if (p
->type
== SOCKET_USB_FUNCTION
&&
2334 path_equal_or_files_same(p
->path
, value
+skip
))
2339 p
->fd
= fdset_remove(fds
, fd
);
2344 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2349 static void socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2350 Socket
*s
= SOCKET(u
);
2355 LIST_FOREACH(port
, p
, s
->ports
) {
2359 if (p
->type
!= SOCKET_SOCKET
)
2365 FDSET_FOREACH(fd
, fds
, i
) {
2366 if (socket_address_matches_fd(&p
->address
, fd
)) {
2367 p
->fd
= fdset_remove(fds
, fd
);
2368 s
->deserialized_state
= SOCKET_LISTENING
;
2375 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2378 return state_translation_table
[SOCKET(u
)->state
];
2381 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2384 return socket_state_to_string(SOCKET(u
)->state
);
2387 const char* socket_port_type_to_string(SocketPort
*p
) {
2395 switch (p
->address
.type
) {
2403 case SOCK_SEQPACKET
:
2404 return "SequentialPacket";
2407 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2414 case SOCKET_SPECIAL
:
2418 return "MessageQueue";
2423 case SOCKET_USB_FUNCTION
:
2424 return "USBFunction";
2431 _pure_
static bool socket_check_gc(Unit
*u
) {
2432 Socket
*s
= SOCKET(u
);
2436 return s
->n_connections
> 0;
2439 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2440 SocketPort
*p
= userdata
;
2446 if (p
->socket
->state
!= SOCKET_LISTENING
)
2449 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2451 if (revents
!= EPOLLIN
) {
2453 if (revents
& EPOLLHUP
)
2454 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.");
2456 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2460 if (p
->socket
->accept
&&
2461 p
->type
== SOCKET_SOCKET
&&
2462 socket_address_can_accept(&p
->address
)) {
2466 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2472 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2479 socket_apply_socket_options(p
->socket
, cfd
);
2482 socket_enter_running(p
->socket
, cfd
);
2486 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2490 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2491 Socket
*s
= SOCKET(u
);
2497 if (pid
!= s
->control_pid
)
2502 if (is_clean_exit(code
, status
, NULL
))
2504 else if (code
== CLD_EXITED
)
2505 f
= SOCKET_FAILURE_EXIT_CODE
;
2506 else if (code
== CLD_KILLED
)
2507 f
= SOCKET_FAILURE_SIGNAL
;
2508 else if (code
== CLD_DUMPED
)
2509 f
= SOCKET_FAILURE_CORE_DUMP
;
2511 assert_not_reached("Unknown sigchld code");
2513 if (s
->control_command
) {
2514 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2516 if (s
->control_command
->ignore
)
2520 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2521 "Control process exited, code=%s status=%i",
2522 sigchld_code_to_string(code
), status
);
2524 if (f
!= SOCKET_SUCCESS
)
2527 if (s
->control_command
&&
2528 s
->control_command
->command_next
&&
2529 f
== SOCKET_SUCCESS
) {
2531 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2534 s
->control_command
= NULL
;
2535 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2537 /* No further commands for this step, so let's figure
2538 * out what to do next */
2540 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2544 case SOCKET_START_PRE
:
2545 if (f
== SOCKET_SUCCESS
)
2546 socket_enter_start_chown(s
);
2548 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2551 case SOCKET_START_CHOWN
:
2552 if (f
== SOCKET_SUCCESS
)
2553 socket_enter_start_post(s
);
2555 socket_enter_stop_pre(s
, f
);
2558 case SOCKET_START_POST
:
2559 if (f
== SOCKET_SUCCESS
)
2560 socket_enter_listening(s
);
2562 socket_enter_stop_pre(s
, f
);
2565 case SOCKET_STOP_PRE
:
2566 case SOCKET_STOP_PRE_SIGTERM
:
2567 case SOCKET_STOP_PRE_SIGKILL
:
2568 socket_enter_stop_post(s
, f
);
2571 case SOCKET_STOP_POST
:
2572 case SOCKET_FINAL_SIGTERM
:
2573 case SOCKET_FINAL_SIGKILL
:
2574 socket_enter_dead(s
, f
);
2578 assert_not_reached("Uh, control process died at wrong time.");
2582 /* Notify clients about changed exit status */
2583 unit_add_to_dbus_queue(u
);
2586 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2587 Socket
*s
= SOCKET(userdata
);
2590 assert(s
->timer_event_source
== source
);
2594 case SOCKET_START_PRE
:
2595 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2596 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2599 case SOCKET_START_CHOWN
:
2600 case SOCKET_START_POST
:
2601 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2602 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2605 case SOCKET_STOP_PRE
:
2606 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2607 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2610 case SOCKET_STOP_PRE_SIGTERM
:
2611 if (s
->kill_context
.send_sigkill
) {
2612 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2613 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2615 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2616 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2620 case SOCKET_STOP_PRE_SIGKILL
:
2621 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2622 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2625 case SOCKET_STOP_POST
:
2626 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2627 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2630 case SOCKET_FINAL_SIGTERM
:
2631 if (s
->kill_context
.send_sigkill
) {
2632 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2633 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2635 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2636 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2640 case SOCKET_FINAL_SIGKILL
:
2641 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2642 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2646 assert_not_reached("Timeout at wrong time.");
2652 int socket_collect_fds(Socket
*s
, int **fds
) {
2653 int *rfds
, k
= 0, n
= 0;
2659 /* Called from the service code for requesting our fds */
2661 LIST_FOREACH(port
, p
, s
->ports
) {
2664 n
+= p
->n_auxiliary_fds
;
2676 LIST_FOREACH(port
, p
, s
->ports
) {
2681 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2682 rfds
[k
++] = p
->auxiliary_fds
[i
];
2691 static void socket_reset_failed(Unit
*u
) {
2692 Socket
*s
= SOCKET(u
);
2696 if (s
->state
== SOCKET_FAILED
)
2697 socket_set_state(s
, SOCKET_DEAD
);
2699 s
->result
= SOCKET_SUCCESS
;
2702 void socket_connection_unref(Socket
*s
) {
2705 /* The service is dead. Yay!
2707 * This is strictly for one-instance-per-connection
2710 assert(s
->n_connections
> 0);
2713 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2716 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2717 Socket
*s
= SOCKET(u
);
2722 /* Don't propagate state changes from the service if we are
2723 already down or accepting connections */
2724 if (!IN_SET(s
->state
, SOCKET_RUNNING
, SOCKET_LISTENING
) || s
->accept
)
2727 if (other
->start_limit_hit
) {
2728 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_START_LIMIT_HIT
);
2732 if (other
->load_state
!= UNIT_LOADED
|| other
->type
!= UNIT_SERVICE
)
2735 if (IN_SET(SERVICE(other
)->state
,
2736 SERVICE_DEAD
, SERVICE_FAILED
,
2737 SERVICE_FINAL_SIGTERM
, SERVICE_FINAL_SIGKILL
,
2738 SERVICE_AUTO_RESTART
))
2739 socket_enter_listening(s
);
2741 if (SERVICE(other
)->state
== SERVICE_RUNNING
)
2742 socket_set_state(s
, SOCKET_RUNNING
);
2745 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2746 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2749 static int socket_get_timeout(Unit
*u
, usec_t
*timeout
) {
2750 Socket
*s
= SOCKET(u
);
2754 if (!s
->timer_event_source
)
2757 r
= sd_event_source_get_time(s
->timer_event_source
, &t
);
2760 if (t
== USEC_INFINITY
)
2767 char *socket_fdname(Socket
*s
) {
2770 /* Returns the name to use for $LISTEN_NAMES. If the user
2771 * didn't specify anything specifically, use the socket unit's
2772 * name as fallback. */
2780 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2781 [SOCKET_EXEC_START_PRE
] = "StartPre",
2782 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2783 [SOCKET_EXEC_START_POST
] = "StartPost",
2784 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2785 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2788 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2790 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2791 [SOCKET_SUCCESS
] = "success",
2792 [SOCKET_FAILURE_RESOURCES
] = "resources",
2793 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2794 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2795 [SOCKET_FAILURE_SIGNAL
] = "signal",
2796 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2797 [SOCKET_FAILURE_SERVICE_START_LIMIT_HIT
] = "service-start-limit-hit"
2800 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2802 const UnitVTable socket_vtable
= {
2803 .object_size
= sizeof(Socket
),
2804 .exec_context_offset
= offsetof(Socket
, exec_context
),
2805 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2806 .kill_context_offset
= offsetof(Socket
, kill_context
),
2807 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2813 .private_section
= "Socket",
2815 .init
= socket_init
,
2816 .done
= socket_done
,
2817 .load
= socket_load
,
2819 .coldplug
= socket_coldplug
,
2821 .dump
= socket_dump
,
2823 .start
= socket_start
,
2824 .stop
= socket_stop
,
2826 .kill
= socket_kill
,
2828 .get_timeout
= socket_get_timeout
,
2830 .serialize
= socket_serialize
,
2831 .deserialize_item
= socket_deserialize_item
,
2832 .distribute_fds
= socket_distribute_fds
,
2834 .active_state
= socket_active_state
,
2835 .sub_state_to_string
= socket_sub_state_to_string
,
2837 .check_gc
= socket_check_gc
,
2839 .sigchld_event
= socket_sigchld_event
,
2841 .trigger_notify
= socket_trigger_notify
,
2843 .reset_failed
= socket_reset_failed
,
2845 .bus_vtable
= bus_socket_vtable
,
2846 .bus_set_property
= bus_socket_set_property
,
2847 .bus_commit_properties
= bus_socket_commit_properties
,
2849 .status_message_formats
= {
2850 /*.starting_stopping = {
2851 [0] = "Starting socket %s...",
2852 [1] = "Stopping socket %s...",
2854 .finished_start_job
= {
2855 [JOB_DONE
] = "Listening on %s.",
2856 [JOB_FAILED
] = "Failed to listen on %s.",
2857 [JOB_TIMEOUT
] = "Timed out starting %s.",
2859 .finished_stop_job
= {
2860 [JOB_DONE
] = "Closed %s.",
2861 [JOB_FAILED
] = "Failed stopping %s.",
2862 [JOB_TIMEOUT
] = "Timed out stopping %s.",