1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <arpa/inet.h>
26 #include <netinet/tcp.h>
28 #include <sys/epoll.h>
31 #include <linux/sctp.h>
34 #include "alloc-util.h"
35 #include "bus-error.h"
38 #include "dbus-socket.h"
40 #include "exit-status.h"
42 #include "formats-util.h"
47 #include "parse-util.h"
48 #include "path-util.h"
49 #include "process-util.h"
50 #include "selinux-util.h"
51 #include "signal-util.h"
52 #include "smack-util.h"
55 #include "string-table.h"
56 #include "string-util.h"
58 #include "unit-name.h"
59 #include "unit-printf.h"
61 #include "user-util.h"
63 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
64 [SOCKET_DEAD
] = UNIT_INACTIVE
,
65 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
66 [SOCKET_START_CHOWN
] = UNIT_ACTIVATING
,
67 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
68 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
69 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
70 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
71 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
72 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
73 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
74 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
75 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
76 [SOCKET_FAILED
] = UNIT_FAILED
79 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
80 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
82 static void socket_init(Unit
*u
) {
83 Socket
*s
= SOCKET(u
);
86 assert(u
->load_state
== UNIT_STUB
);
88 s
->backlog
= SOMAXCONN
;
89 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
90 s
->directory_mode
= 0755;
91 s
->socket_mode
= 0666;
93 s
->max_connections
= 64;
100 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
101 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
103 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
106 static void socket_unwatch_control_pid(Socket
*s
) {
109 if (s
->control_pid
<= 0)
112 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
116 static void socket_cleanup_fd_list(SocketPort
*p
) {
119 close_many(p
->auxiliary_fds
, p
->n_auxiliary_fds
);
120 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
121 p
->n_auxiliary_fds
= 0;
124 void socket_free_ports(Socket
*s
) {
129 while ((p
= s
->ports
)) {
130 LIST_REMOVE(port
, s
->ports
, p
);
132 sd_event_source_unref(p
->event_source
);
134 socket_cleanup_fd_list(p
);
141 static void socket_done(Unit
*u
) {
142 Socket
*s
= SOCKET(u
);
146 socket_free_ports(s
);
148 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
149 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
150 s
->control_command
= NULL
;
152 socket_unwatch_control_pid(s
);
154 unit_ref_unset(&s
->service
);
156 s
->tcp_congestion
= mfree(s
->tcp_congestion
);
157 s
->bind_to_device
= mfree(s
->bind_to_device
);
159 s
->smack
= mfree(s
->smack
);
160 s
->smack_ip_in
= mfree(s
->smack_ip_in
);
161 s
->smack_ip_out
= mfree(s
->smack_ip_out
);
163 strv_free(s
->symlinks
);
165 s
->user
= mfree(s
->user
);
166 s
->group
= mfree(s
->group
);
168 s
->fdname
= mfree(s
->fdname
);
170 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
173 static int socket_arm_timer(Socket
*s
, usec_t usec
) {
178 if (s
->timer_event_source
) {
179 r
= sd_event_source_set_time(s
->timer_event_source
, usec
);
183 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
186 if (usec
== USEC_INFINITY
)
189 r
= sd_event_add_time(
190 UNIT(s
)->manager
->event
,
191 &s
->timer_event_source
,
194 socket_dispatch_timer
, s
);
198 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
203 int socket_instantiate_service(Socket
*s
) {
204 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
210 /* This fills in s->service if it isn't filled in yet. For
211 * Accept=yes sockets we create the next connection service
212 * here. For Accept=no this is mostly a NOP since the service
213 * is figured out at load time anyway. */
215 if (UNIT_DEREF(s
->service
))
221 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
225 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
228 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
233 unit_ref_set(&s
->service
, u
);
235 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
238 static bool have_non_accept_socket(Socket
*s
) {
246 LIST_FOREACH(port
, p
, s
->ports
) {
248 if (p
->type
!= SOCKET_SOCKET
)
251 if (!socket_address_can_accept(&p
->address
))
258 static int socket_add_mount_links(Socket
*s
) {
264 LIST_FOREACH(port
, p
, s
->ports
) {
265 const char *path
= NULL
;
267 if (p
->type
== SOCKET_SOCKET
)
268 path
= socket_address_get_path(&p
->address
);
269 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
275 r
= unit_require_mounts_for(UNIT(s
), path
);
283 static int socket_add_device_link(Socket
*s
) {
288 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
291 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
292 return unit_add_node_link(UNIT(s
), t
, false, UNIT_BINDS_TO
);
295 static int socket_add_default_dependencies(Socket
*s
) {
299 if (!UNIT(s
)->default_dependencies
)
302 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
306 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
307 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
312 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
315 _pure_
static bool socket_has_exec(Socket
*s
) {
319 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
320 if (s
->exec_command
[i
])
326 static int socket_add_extras(Socket
*s
) {
332 if (have_non_accept_socket(s
)) {
334 if (!UNIT_DEREF(s
->service
)) {
337 r
= unit_load_related_unit(u
, ".service", &x
);
341 unit_ref_set(&s
->service
, x
);
344 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
349 r
= socket_add_mount_links(s
);
353 r
= socket_add_device_link(s
);
357 r
= unit_patch_contexts(u
);
361 if (socket_has_exec(s
)) {
362 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
366 r
= unit_set_default_slice(u
);
371 r
= socket_add_default_dependencies(s
);
378 static const char *socket_find_symlink_target(Socket
*s
) {
379 const char *found
= NULL
;
382 LIST_FOREACH(port
, p
, s
->ports
) {
383 const char *f
= NULL
;
392 if (p
->address
.sockaddr
.un
.sun_path
[0] != 0)
393 f
= p
->address
.sockaddr
.un
.sun_path
;
411 static int socket_verify(Socket
*s
) {
414 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
418 log_unit_error(UNIT(s
), "Unit lacks Listen setting. Refusing.");
422 if (s
->accept
&& have_non_accept_socket(s
)) {
423 log_unit_error(UNIT(s
), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
427 if (s
->accept
&& s
->max_connections
<= 0) {
428 log_unit_error(UNIT(s
), "MaxConnection= setting too small. Refusing.");
432 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
433 log_unit_error(UNIT(s
), "Explicit service configuration for accepting socket units not supported. Refusing.");
437 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
438 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing.");
442 if (!strv_isempty(s
->symlinks
) && !socket_find_symlink_target(s
)) {
443 log_unit_error(UNIT(s
), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
450 static int socket_load(Unit
*u
) {
451 Socket
*s
= SOCKET(u
);
455 assert(u
->load_state
== UNIT_STUB
);
457 r
= unit_load_fragment_and_dropin(u
);
461 if (u
->load_state
== UNIT_LOADED
) {
462 /* This is a new unit? Then let's add in some extras */
463 r
= socket_add_extras(s
);
468 return socket_verify(s
);
471 _const_
static const char* listen_lookup(int family
, int type
) {
473 if (family
== AF_NETLINK
)
474 return "ListenNetlink";
476 if (type
== SOCK_STREAM
)
477 return "ListenStream";
478 else if (type
== SOCK_DGRAM
)
479 return "ListenDatagram";
480 else if (type
== SOCK_SEQPACKET
)
481 return "ListenSequentialPacket";
483 assert_not_reached("Unknown socket type");
487 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
488 char time_string
[FORMAT_TIMESPAN_MAX
];
490 Socket
*s
= SOCKET(u
);
497 prefix
= strempty(prefix
);
498 prefix2
= strjoina(prefix
, "\t");
501 "%sSocket State: %s\n"
503 "%sBindIPv6Only: %s\n"
505 "%sSocketMode: %04o\n"
506 "%sDirectoryMode: %04o\n"
510 "%sTransparent: %s\n"
512 "%sPassCredentials: %s\n"
513 "%sPassSecurity: %s\n"
514 "%sTCPCongestion: %s\n"
515 "%sRemoveOnStop: %s\n"
518 "%sSELinuxContextFromNet: %s\n",
519 prefix
, socket_state_to_string(s
->state
),
520 prefix
, socket_result_to_string(s
->result
),
521 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
523 prefix
, s
->socket_mode
,
524 prefix
, s
->directory_mode
,
525 prefix
, yes_no(s
->keep_alive
),
526 prefix
, yes_no(s
->no_delay
),
527 prefix
, yes_no(s
->free_bind
),
528 prefix
, yes_no(s
->transparent
),
529 prefix
, yes_no(s
->broadcast
),
530 prefix
, yes_no(s
->pass_cred
),
531 prefix
, yes_no(s
->pass_sec
),
532 prefix
, strna(s
->tcp_congestion
),
533 prefix
, yes_no(s
->remove_on_stop
),
534 prefix
, yes_no(s
->writable
),
535 prefix
, socket_fdname(s
),
536 prefix
, yes_no(s
->selinux_context_from_net
));
538 if (s
->control_pid
> 0)
540 "%sControl PID: "PID_FMT
"\n",
541 prefix
, s
->control_pid
);
543 if (s
->bind_to_device
)
545 "%sBindToDevice: %s\n",
546 prefix
, s
->bind_to_device
);
551 "%sNConnections: %u\n"
552 "%sMaxConnections: %u\n",
553 prefix
, s
->n_accepted
,
554 prefix
, s
->n_connections
,
555 prefix
, s
->max_connections
);
557 if (s
->priority
>= 0)
560 prefix
, s
->priority
);
562 if (s
->receive_buffer
> 0)
564 "%sReceiveBuffer: %zu\n",
565 prefix
, s
->receive_buffer
);
567 if (s
->send_buffer
> 0)
569 "%sSendBuffer: %zu\n",
570 prefix
, s
->send_buffer
);
582 if (s
->pipe_size
> 0)
585 prefix
, s
->pipe_size
);
592 if (s
->mq_maxmsg
> 0)
594 "%sMessageQueueMaxMessages: %li\n",
595 prefix
, s
->mq_maxmsg
);
597 if (s
->mq_msgsize
> 0)
599 "%sMessageQueueMessageSize: %li\n",
600 prefix
, s
->mq_msgsize
);
605 prefix
, yes_no(s
->reuse_port
));
609 "%sSmackLabel: %s\n",
614 "%sSmackLabelIPIn: %s\n",
615 prefix
, s
->smack_ip_in
);
619 "%sSmackLabelIPOut: %s\n",
620 prefix
, s
->smack_ip_out
);
622 if (!isempty(s
->user
) || !isempty(s
->group
))
625 "%sOwnerGroup: %s\n",
626 prefix
, strna(s
->user
),
627 prefix
, strna(s
->group
));
629 if (s
->keep_alive_time
> 0)
631 "%sKeepAliveTimeSec: %s\n",
632 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_time
, USEC_PER_SEC
));
634 if (s
->keep_alive_interval
)
636 "%sKeepAliveIntervalSec: %s\n",
637 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_interval
, USEC_PER_SEC
));
639 if (s
->keep_alive_cnt
)
641 "%sKeepAliveProbes: %u\n",
642 prefix
, s
->keep_alive_cnt
);
646 "%sDeferAcceptSec: %s\n",
647 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->defer_accept
, USEC_PER_SEC
));
649 LIST_FOREACH(port
, p
, s
->ports
) {
651 if (p
->type
== SOCKET_SOCKET
) {
656 r
= socket_address_print(&p
->address
, &k
);
662 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
664 } else if (p
->type
== SOCKET_SPECIAL
)
665 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
666 else if (p
->type
== SOCKET_USB_FUNCTION
)
667 fprintf(f
, "%sListenUSBFunction: %s\n", prefix
, p
->path
);
668 else if (p
->type
== SOCKET_MQUEUE
)
669 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
671 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
674 exec_context_dump(&s
->exec_context
, f
, prefix
);
675 kill_context_dump(&s
->kill_context
, f
, prefix
);
677 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
678 if (!s
->exec_command
[c
])
681 fprintf(f
, "%s-> %s:\n",
682 prefix
, socket_exec_command_to_string(c
));
684 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
688 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
691 union sockaddr_union local
, remote
;
697 if (getsockname(fd
, &local
.sa
, &l
) < 0)
701 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
704 switch (local
.sa
.sa_family
) {
708 a
= ntohl(local
.in
.sin_addr
.s_addr
),
709 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
712 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
714 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
715 ntohs(local
.in
.sin_port
),
716 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
717 ntohs(remote
.in
.sin_port
)) < 0)
724 static const unsigned char ipv4_prefix
[] = {
725 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
728 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
729 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
731 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
732 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
735 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
737 a
[0], a
[1], a
[2], a
[3],
738 ntohs(local
.in6
.sin6_port
),
739 b
[0], b
[1], b
[2], b
[3],
740 ntohs(remote
.in6
.sin6_port
)) < 0)
743 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
748 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
749 ntohs(local
.in6
.sin6_port
),
750 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
751 ntohs(remote
.in6
.sin6_port
)) < 0)
762 k
= getpeercred(fd
, &ucred
);
765 "%u-"PID_FMT
"-"UID_FMT
,
766 nr
, ucred
.pid
, ucred
.uid
) < 0)
768 } else if (k
== -ENODATA
) {
769 /* This handles the case where somebody is
770 * connecting from another pid/uid namespace
771 * (e.g. from outside of our container). */
783 assert_not_reached("Unhandled socket type.");
790 static void socket_close_fds(Socket
*s
) {
796 LIST_FOREACH(port
, p
, s
->ports
) {
798 p
->event_source
= sd_event_source_unref(p
->event_source
);
803 p
->fd
= safe_close(p
->fd
);
804 socket_cleanup_fd_list(p
);
806 /* One little note: we should normally not delete any
807 * sockets in the file system here! After all some
808 * other process we spawned might still have a
809 * reference of this fd and wants to continue to use
810 * it. Therefore we delete sockets in the file system
811 * before we create a new one, not after we stopped
814 if (s
->remove_on_stop
) {
826 socket_address_unlink(&p
->address
);
835 if (s
->remove_on_stop
)
836 STRV_FOREACH(i
, s
->symlinks
)
840 static void socket_apply_socket_options(Socket
*s
, int fd
) {
847 int b
= s
->keep_alive
;
848 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
849 log_unit_warning_errno(UNIT(s
), errno
, "SO_KEEPALIVE failed: %m");
852 if (s
->keep_alive_time
) {
853 int value
= s
->keep_alive_time
/ USEC_PER_SEC
;
854 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPIDLE
, &value
, sizeof(value
)) < 0)
855 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPIDLE failed: %m");
858 if (s
->keep_alive_interval
) {
859 int value
= s
->keep_alive_interval
/ USEC_PER_SEC
;
860 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPINTVL
, &value
, sizeof(value
)) < 0)
861 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPINTVL failed: %m");
864 if (s
->keep_alive_cnt
) {
865 int value
= s
->keep_alive_cnt
;
866 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPCNT
, &value
, sizeof(value
)) < 0)
867 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPCNT failed: %m");
870 if (s
->defer_accept
) {
871 int value
= s
->defer_accept
/ USEC_PER_SEC
;
872 if (setsockopt(fd
, SOL_TCP
, TCP_DEFER_ACCEPT
, &value
, sizeof(value
)) < 0)
873 log_unit_warning_errno(UNIT(s
), errno
, "TCP_DEFER_ACCEPT failed: %m");
879 if (s
->socket_protocol
== IPPROTO_SCTP
) {
880 if (setsockopt(fd
, SOL_SCTP
, SCTP_NODELAY
, &b
, sizeof(b
)) < 0)
881 log_unit_warning_errno(UNIT(s
), errno
, "SCTP_NODELAY failed: %m");
883 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
884 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
890 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
891 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
896 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
897 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
902 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
903 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
906 if (s
->priority
>= 0)
907 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
908 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
910 if (s
->receive_buffer
> 0) {
911 int value
= (int) s
->receive_buffer
;
913 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
915 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
916 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
917 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
920 if (s
->send_buffer
> 0) {
921 int value
= (int) s
->send_buffer
;
922 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
923 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
924 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
928 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
929 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
932 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
933 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
935 if (s
->ip_ttl
>= 0) {
938 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
940 if (socket_ipv6_is_supported())
941 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
944 errno
= EAFNOSUPPORT
;
948 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
951 if (s
->tcp_congestion
)
952 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
953 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
955 if (s
->smack_ip_in
) {
956 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
958 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
961 if (s
->smack_ip_out
) {
962 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
964 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
968 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
974 if (s
->pipe_size
> 0)
975 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
976 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
979 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
981 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
985 static int fifo_address_create(
987 mode_t directory_mode
,
988 mode_t socket_mode
) {
990 _cleanup_close_
int fd
= -1;
997 mkdir_parents_label(path
, directory_mode
);
999 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
1003 /* Enforce the right access mode for the fifo */
1004 old_mask
= umask(~ socket_mode
);
1006 /* Include the original umask in our mask */
1007 (void) umask(~socket_mode
| old_mask
);
1009 r
= mkfifo(path
, socket_mode
);
1010 (void) umask(old_mask
);
1012 if (r
< 0 && errno
!= EEXIST
) {
1017 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1023 mac_selinux_create_file_clear();
1025 if (fstat(fd
, &st
) < 0) {
1030 if (!S_ISFIFO(st
.st_mode
) ||
1031 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1032 st
.st_uid
!= getuid() ||
1033 st
.st_gid
!= getgid()) {
1044 mac_selinux_create_file_clear();
1048 static int special_address_create(const char *path
, bool writable
) {
1049 _cleanup_close_
int fd
= -1;
1055 fd
= open(path
, (writable
? O_RDWR
: O_RDONLY
)|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1059 if (fstat(fd
, &st
) < 0)
1062 /* Check whether this is a /proc, /sys or /dev file or char device */
1063 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1072 static int usbffs_address_create(const char *path
) {
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(
1102 _cleanup_close_
int fd
= -1;
1105 struct mq_attr _attr
, *attr
= NULL
;
1110 if (maxmsg
> 0 && msgsize
> 0) {
1111 _attr
= (struct mq_attr
) {
1112 .mq_flags
= O_NONBLOCK
,
1113 .mq_maxmsg
= maxmsg
,
1114 .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 (void) umask(~mq_mode
| old_mask
);
1124 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1125 (void) umask(old_mask
);
1130 if (fstat(fd
, &st
) < 0)
1133 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1134 st
.st_uid
!= getuid() ||
1135 st
.st_gid
!= getgid())
1144 static int socket_symlink(Socket
*s
) {
1150 p
= socket_find_symlink_target(s
);
1154 STRV_FOREACH(i
, s
->symlinks
)
1155 symlink_label(p
, *i
);
1160 static int usbffs_write_descs(int fd
, Service
*s
) {
1163 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1166 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1170 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1173 static int usbffs_select_ep(const struct dirent
*d
) {
1174 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1177 static int usbffs_dispatch_eps(SocketPort
*p
) {
1178 _cleanup_free_
struct dirent
**ent
= NULL
;
1179 _cleanup_free_
char *path
= NULL
;
1182 path
= dirname_malloc(p
->path
);
1186 r
= scandir(path
, &ent
, usbffs_select_ep
, alphasort
);
1191 p
->auxiliary_fds
= new(int, n
);
1192 if (!p
->auxiliary_fds
)
1195 p
->n_auxiliary_fds
= n
;
1198 for (i
= 0; i
< n
; ++i
) {
1199 _cleanup_free_
char *ep
= NULL
;
1201 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1205 path_kill_slashes(ep
);
1207 r
= usbffs_address_create(ep
);
1211 p
->auxiliary_fds
[k
] = r
;
1220 close_many(p
->auxiliary_fds
, k
);
1221 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1222 p
->n_auxiliary_fds
= 0;
1227 static int socket_open_fds(Socket
*s
) {
1228 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1229 bool know_label
= false;
1235 LIST_FOREACH(port
, p
, s
->ports
) {
1245 /* Figure out label, if we don't it know
1246 * yet. We do it once, for the first
1247 * socket where we need this and
1248 * remember it for the rest. */
1250 if (s
->selinux_context_from_net
) {
1251 /* Get it from the network label */
1253 r
= mac_selinux_get_our_label(&label
);
1254 if (r
< 0 && r
!= -EOPNOTSUPP
)
1258 /* Get it from the executable we are about to start */
1260 r
= socket_instantiate_service(s
);
1264 if (UNIT_ISSET(s
->service
) &&
1265 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1266 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1267 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1275 /* Apply the socket protocol */
1276 switch(p
->address
.type
) {
1278 case SOCK_SEQPACKET
:
1279 if (p
->socket
->socket_protocol
== IPPROTO_SCTP
)
1280 p
->address
.protocol
= p
->socket
->socket_protocol
;
1283 if (p
->socket
->socket_protocol
== IPPROTO_UDPLITE
)
1284 p
->address
.protocol
= p
->socket
->socket_protocol
;
1288 r
= socket_address_listen(
1290 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1304 socket_apply_socket_options(s
, p
->fd
);
1308 case SOCKET_SPECIAL
:
1310 p
->fd
= special_address_create(p
->path
, s
->writable
);
1319 p
->fd
= fifo_address_create(
1328 socket_apply_fifo_options(s
, p
->fd
);
1334 p
->fd
= mq_address_create(
1345 case SOCKET_USB_FUNCTION
:
1347 p
->fd
= usbffs_address_create(p
->path
);
1353 r
= usbffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1357 r
= usbffs_dispatch_eps(p
);
1364 assert_not_reached("Unknown port type");
1371 socket_close_fds(s
);
1375 static void socket_unwatch_fds(Socket
*s
) {
1381 LIST_FOREACH(port
, p
, s
->ports
) {
1385 if (!p
->event_source
)
1388 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1390 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1394 static int socket_watch_fds(Socket
*s
) {
1400 LIST_FOREACH(port
, p
, s
->ports
) {
1404 if (p
->event_source
) {
1405 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1409 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1413 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1420 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1421 socket_unwatch_fds(s
);
1425 static void socket_set_state(Socket
*s
, SocketState state
) {
1426 SocketState old_state
;
1429 old_state
= s
->state
;
1437 SOCKET_STOP_PRE_SIGTERM
,
1438 SOCKET_STOP_PRE_SIGKILL
,
1440 SOCKET_FINAL_SIGTERM
,
1441 SOCKET_FINAL_SIGKILL
)) {
1443 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1444 socket_unwatch_control_pid(s
);
1445 s
->control_command
= NULL
;
1446 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1449 if (state
!= SOCKET_LISTENING
)
1450 socket_unwatch_fds(s
);
1458 SOCKET_STOP_PRE_SIGTERM
,
1459 SOCKET_STOP_PRE_SIGKILL
))
1460 socket_close_fds(s
);
1462 if (state
!= old_state
)
1463 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1465 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1468 static int socket_coldplug(Unit
*u
) {
1469 Socket
*s
= SOCKET(u
);
1473 assert(s
->state
== SOCKET_DEAD
);
1475 if (s
->deserialized_state
== s
->state
)
1478 if (s
->control_pid
> 0 &&
1479 pid_is_unwaited(s
->control_pid
) &&
1480 IN_SET(s
->deserialized_state
,
1485 SOCKET_STOP_PRE_SIGTERM
,
1486 SOCKET_STOP_PRE_SIGKILL
,
1488 SOCKET_FINAL_SIGTERM
,
1489 SOCKET_FINAL_SIGKILL
)) {
1491 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1495 r
= socket_arm_timer(s
, usec_add(u
->state_change_timestamp
.monotonic
, s
->timeout_usec
));
1500 if (IN_SET(s
->deserialized_state
,
1506 SOCKET_STOP_PRE_SIGTERM
,
1507 SOCKET_STOP_PRE_SIGKILL
)) {
1509 r
= socket_open_fds(s
);
1514 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1515 r
= socket_watch_fds(s
);
1520 socket_set_state(s
, s
->deserialized_state
);
1524 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1525 _cleanup_free_
char **argv
= NULL
;
1528 ExecParameters exec_params
= {
1529 .apply_permissions
= true,
1530 .apply_chroot
= true,
1531 .apply_tty_stdin
= true,
1532 .bus_endpoint_fd
= -1,
1542 (void) unit_realize_cgroup(UNIT(s
));
1543 if (s
->reset_cpu_usage
) {
1544 (void) unit_reset_cpu_usage(UNIT(s
));
1545 s
->reset_cpu_usage
= false;
1548 r
= unit_setup_exec_runtime(UNIT(s
));
1552 r
= socket_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
1556 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1560 exec_params
.argv
= argv
;
1561 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1562 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1563 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1564 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1565 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1566 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1568 r
= exec_spawn(UNIT(s
),
1577 r
= unit_watch_pid(UNIT(s
), pid
);
1579 /* FIXME: we need to do something here */
1586 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1590 r
= socket_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
1594 /* We have to resolve the user names out-of-process, hence
1595 * let's fork here. It's messy, but well, what can we do? */
1603 uid_t uid
= UID_INVALID
;
1604 gid_t gid
= GID_INVALID
;
1607 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1608 (void) ignore_signals(SIGPIPE
, -1);
1611 if (!isempty(s
->user
)) {
1612 const char *user
= s
->user
;
1614 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1621 if (!isempty(s
->group
)) {
1622 const char *group
= s
->group
;
1624 r
= get_group_creds(&group
, &gid
);
1631 LIST_FOREACH(port
, p
, s
->ports
) {
1632 const char *path
= NULL
;
1634 if (p
->type
== SOCKET_SOCKET
)
1635 path
= socket_address_get_path(&p
->address
);
1636 else if (p
->type
== SOCKET_FIFO
)
1642 if (chown(path
, uid
, gid
) < 0) {
1653 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1658 r
= unit_watch_pid(UNIT(s
), pid
);
1666 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1670 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1673 if (f
!= SOCKET_SUCCESS
)
1676 exec_runtime_destroy(s
->exec_runtime
);
1677 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1679 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1681 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1684 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1686 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1690 if (f
!= SOCKET_SUCCESS
)
1693 socket_unwatch_control_pid(s
);
1694 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1695 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1697 if (s
->control_command
) {
1698 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1702 socket_set_state(s
, SOCKET_STOP_POST
);
1704 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1709 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1710 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1713 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1718 if (f
!= SOCKET_SUCCESS
)
1721 r
= unit_kill_context(
1724 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1725 KILL_KILL
: KILL_TERMINATE
,
1733 r
= socket_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
1737 socket_set_state(s
, state
);
1738 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1739 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1740 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1741 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1742 else if (state
== SOCKET_FINAL_SIGTERM
)
1743 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1745 socket_enter_dead(s
, SOCKET_SUCCESS
);
1750 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1752 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1753 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1755 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1758 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1762 if (f
!= SOCKET_SUCCESS
)
1765 socket_unwatch_control_pid(s
);
1766 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1767 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1769 if (s
->control_command
) {
1770 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1774 socket_set_state(s
, SOCKET_STOP_PRE
);
1776 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1781 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1782 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1785 static void socket_enter_listening(Socket
*s
) {
1789 r
= socket_watch_fds(s
);
1791 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1795 socket_set_state(s
, SOCKET_LISTENING
);
1799 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1802 static void socket_enter_start_post(Socket
*s
) {
1806 socket_unwatch_control_pid(s
);
1807 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1808 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1810 if (s
->control_command
) {
1811 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1813 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1817 socket_set_state(s
, SOCKET_START_POST
);
1819 socket_enter_listening(s
);
1824 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1827 static void socket_enter_start_chown(Socket
*s
) {
1832 r
= socket_open_fds(s
);
1834 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1838 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1840 socket_unwatch_control_pid(s
);
1841 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1842 s
->control_command
= NULL
;
1844 r
= socket_chown(s
, &s
->control_pid
);
1846 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1850 socket_set_state(s
, SOCKET_START_CHOWN
);
1852 socket_enter_start_post(s
);
1857 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1860 static void socket_enter_start_pre(Socket
*s
) {
1864 socket_unwatch_control_pid(s
);
1865 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1866 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1868 if (s
->control_command
) {
1869 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1871 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1875 socket_set_state(s
, SOCKET_START_PRE
);
1877 socket_enter_start_chown(s
);
1882 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1885 static void socket_enter_running(Socket
*s
, int cfd
) {
1886 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
1891 /* We don't take connections anymore if we are supposed to
1892 * shut down anyway */
1893 if (unit_stop_pending(UNIT(s
))) {
1895 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1900 /* Flush all sockets by closing and reopening them */
1901 socket_close_fds(s
);
1903 r
= socket_open_fds(s
);
1905 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1906 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1910 r
= socket_watch_fds(s
);
1912 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1913 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1923 bool pending
= false;
1925 /* If there's already a start pending don't bother to
1927 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1928 if (unit_active_or_pending(other
)) {
1934 if (!UNIT_ISSET(s
->service
)) {
1935 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1940 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, &error
, NULL
);
1945 socket_set_state(s
, SOCKET_RUNNING
);
1947 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1950 if (s
->n_connections
>= s
->max_connections
) {
1951 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1956 r
= socket_instantiate_service(s
);
1960 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1965 /* ENOTCONN is legitimate if TCP RST was received.
1966 * This connection is over, but the socket unit lives on. */
1971 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1975 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1979 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1983 service
= SERVICE(UNIT_DEREF(s
->service
));
1984 unit_ref_unset(&s
->service
);
1987 UNIT(service
)->no_gc
= false;
1989 unit_choose_id(UNIT(service
), name
);
1991 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1996 s
->n_connections
++;
1998 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, &error
, NULL
);
2002 /* Notify clients about changed counters */
2003 unit_add_to_dbus_queue(UNIT(s
));
2009 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
2010 cfd
>= 0 ? "template" : "non-template",
2011 bus_error_message(&error
, r
));
2013 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2017 static void socket_run_next(Socket
*s
) {
2021 assert(s
->control_command
);
2022 assert(s
->control_command
->command_next
);
2024 socket_unwatch_control_pid(s
);
2026 s
->control_command
= s
->control_command
->command_next
;
2028 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2035 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2037 if (s
->state
== SOCKET_START_POST
)
2038 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2039 else if (s
->state
== SOCKET_STOP_POST
)
2040 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2042 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2045 static int socket_start(Unit
*u
) {
2046 Socket
*s
= SOCKET(u
);
2050 /* We cannot fulfill this request right now, try again later
2052 if (IN_SET(s
->state
,
2054 SOCKET_STOP_PRE_SIGKILL
,
2055 SOCKET_STOP_PRE_SIGTERM
,
2057 SOCKET_FINAL_SIGTERM
,
2058 SOCKET_FINAL_SIGKILL
))
2061 /* Already on it! */
2062 if (IN_SET(s
->state
,
2068 /* Cannot run this without the service being around */
2069 if (UNIT_ISSET(s
->service
)) {
2072 service
= SERVICE(UNIT_DEREF(s
->service
));
2074 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2075 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2079 /* If the service is already active we cannot start the
2081 if (service
->state
!= SERVICE_DEAD
&&
2082 service
->state
!= SERVICE_FAILED
&&
2083 service
->state
!= SERVICE_AUTO_RESTART
) {
2084 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2089 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2091 s
->result
= SOCKET_SUCCESS
;
2092 s
->reset_cpu_usage
= true;
2094 socket_enter_start_pre(s
);
2099 static int socket_stop(Unit
*u
) {
2100 Socket
*s
= SOCKET(u
);
2105 if (IN_SET(s
->state
,
2107 SOCKET_STOP_PRE_SIGTERM
,
2108 SOCKET_STOP_PRE_SIGKILL
,
2110 SOCKET_FINAL_SIGTERM
,
2111 SOCKET_FINAL_SIGKILL
))
2114 /* If there's already something running we go directly into
2116 if (IN_SET(s
->state
,
2119 SOCKET_START_POST
)) {
2120 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2124 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2126 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2130 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2131 Socket
*s
= SOCKET(u
);
2139 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2140 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2141 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2143 if (s
->control_pid
> 0)
2144 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2146 if (s
->control_command_id
>= 0)
2147 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2149 LIST_FOREACH(port
, p
, s
->ports
) {
2155 copy
= fdset_put_dup(fds
, p
->fd
);
2159 if (p
->type
== SOCKET_SOCKET
) {
2160 _cleanup_free_
char *t
= NULL
;
2162 r
= socket_address_print(&p
->address
, &t
);
2166 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2167 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2169 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2171 } else if (p
->type
== SOCKET_SPECIAL
)
2172 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2173 else if (p
->type
== SOCKET_MQUEUE
)
2174 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2175 else if (p
->type
== SOCKET_USB_FUNCTION
)
2176 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2178 assert(p
->type
== SOCKET_FIFO
);
2179 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2186 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2187 Socket
*s
= SOCKET(u
);
2193 if (streq(key
, "state")) {
2196 state
= socket_state_from_string(value
);
2198 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2200 s
->deserialized_state
= state
;
2201 } else if (streq(key
, "result")) {
2204 f
= socket_result_from_string(value
);
2206 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2207 else if (f
!= SOCKET_SUCCESS
)
2210 } else if (streq(key
, "n-accepted")) {
2213 if (safe_atou(value
, &k
) < 0)
2214 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2217 } else if (streq(key
, "control-pid")) {
2220 if (parse_pid(value
, &pid
) < 0)
2221 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2223 s
->control_pid
= pid
;
2224 } else if (streq(key
, "control-command")) {
2225 SocketExecCommand id
;
2227 id
= socket_exec_command_from_string(value
);
2229 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2231 s
->control_command_id
= id
;
2232 s
->control_command
= s
->exec_command
[id
];
2234 } else if (streq(key
, "fifo")) {
2238 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2239 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2242 LIST_FOREACH(port
, p
, s
->ports
)
2243 if (p
->type
== SOCKET_FIFO
&&
2244 path_equal_or_files_same(p
->path
, value
+skip
))
2249 p
->fd
= fdset_remove(fds
, fd
);
2253 } else if (streq(key
, "special")) {
2257 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2258 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2261 LIST_FOREACH(port
, p
, s
->ports
)
2262 if (p
->type
== SOCKET_SPECIAL
&&
2263 path_equal_or_files_same(p
->path
, value
+skip
))
2268 p
->fd
= fdset_remove(fds
, fd
);
2272 } else if (streq(key
, "mqueue")) {
2276 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2277 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2280 LIST_FOREACH(port
, p
, s
->ports
)
2281 if (p
->type
== SOCKET_MQUEUE
&&
2282 streq(p
->path
, value
+skip
))
2287 p
->fd
= fdset_remove(fds
, fd
);
2291 } else if (streq(key
, "socket")) {
2292 int fd
, type
, skip
= 0;
2295 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2296 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2299 LIST_FOREACH(port
, p
, s
->ports
)
2300 if (socket_address_is(&p
->address
, value
+skip
, type
))
2305 p
->fd
= fdset_remove(fds
, fd
);
2309 } else if (streq(key
, "netlink")) {
2313 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2314 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2317 LIST_FOREACH(port
, p
, s
->ports
)
2318 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2323 p
->fd
= fdset_remove(fds
, fd
);
2327 } else if (streq(key
, "ffs")) {
2331 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2332 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2335 LIST_FOREACH(port
, p
, s
->ports
)
2336 if (p
->type
== SOCKET_USB_FUNCTION
&&
2337 path_equal_or_files_same(p
->path
, value
+skip
))
2342 p
->fd
= fdset_remove(fds
, fd
);
2347 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2352 static void socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2353 Socket
*s
= SOCKET(u
);
2358 LIST_FOREACH(port
, p
, s
->ports
) {
2362 if (p
->type
!= SOCKET_SOCKET
)
2368 FDSET_FOREACH(fd
, fds
, i
) {
2369 if (socket_address_matches_fd(&p
->address
, fd
)) {
2370 p
->fd
= fdset_remove(fds
, fd
);
2371 s
->deserialized_state
= SOCKET_LISTENING
;
2378 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2381 return state_translation_table
[SOCKET(u
)->state
];
2384 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2387 return socket_state_to_string(SOCKET(u
)->state
);
2390 const char* socket_port_type_to_string(SocketPort
*p
) {
2398 switch (p
->address
.type
) {
2406 case SOCK_SEQPACKET
:
2407 return "SequentialPacket";
2410 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2417 case SOCKET_SPECIAL
:
2421 return "MessageQueue";
2426 case SOCKET_USB_FUNCTION
:
2427 return "USBFunction";
2434 _pure_
static bool socket_check_gc(Unit
*u
) {
2435 Socket
*s
= SOCKET(u
);
2439 return s
->n_connections
> 0;
2442 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2443 SocketPort
*p
= userdata
;
2449 if (p
->socket
->state
!= SOCKET_LISTENING
)
2452 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2454 if (revents
!= EPOLLIN
) {
2456 if (revents
& EPOLLHUP
)
2457 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.");
2459 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2463 if (p
->socket
->accept
&&
2464 p
->type
== SOCKET_SOCKET
&&
2465 socket_address_can_accept(&p
->address
)) {
2469 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2475 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2482 socket_apply_socket_options(p
->socket
, cfd
);
2485 socket_enter_running(p
->socket
, cfd
);
2489 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2493 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2494 Socket
*s
= SOCKET(u
);
2500 if (pid
!= s
->control_pid
)
2505 if (is_clean_exit(code
, status
, NULL
))
2507 else if (code
== CLD_EXITED
)
2508 f
= SOCKET_FAILURE_EXIT_CODE
;
2509 else if (code
== CLD_KILLED
)
2510 f
= SOCKET_FAILURE_SIGNAL
;
2511 else if (code
== CLD_DUMPED
)
2512 f
= SOCKET_FAILURE_CORE_DUMP
;
2514 assert_not_reached("Unknown sigchld code");
2516 if (s
->control_command
) {
2517 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2519 if (s
->control_command
->ignore
)
2523 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2524 "Control process exited, code=%s status=%i",
2525 sigchld_code_to_string(code
), status
);
2527 if (f
!= SOCKET_SUCCESS
)
2530 if (s
->control_command
&&
2531 s
->control_command
->command_next
&&
2532 f
== SOCKET_SUCCESS
) {
2534 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2537 s
->control_command
= NULL
;
2538 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2540 /* No further commands for this step, so let's figure
2541 * out what to do next */
2543 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2547 case SOCKET_START_PRE
:
2548 if (f
== SOCKET_SUCCESS
)
2549 socket_enter_start_chown(s
);
2551 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2554 case SOCKET_START_CHOWN
:
2555 if (f
== SOCKET_SUCCESS
)
2556 socket_enter_start_post(s
);
2558 socket_enter_stop_pre(s
, f
);
2561 case SOCKET_START_POST
:
2562 if (f
== SOCKET_SUCCESS
)
2563 socket_enter_listening(s
);
2565 socket_enter_stop_pre(s
, f
);
2568 case SOCKET_STOP_PRE
:
2569 case SOCKET_STOP_PRE_SIGTERM
:
2570 case SOCKET_STOP_PRE_SIGKILL
:
2571 socket_enter_stop_post(s
, f
);
2574 case SOCKET_STOP_POST
:
2575 case SOCKET_FINAL_SIGTERM
:
2576 case SOCKET_FINAL_SIGKILL
:
2577 socket_enter_dead(s
, f
);
2581 assert_not_reached("Uh, control process died at wrong time.");
2585 /* Notify clients about changed exit status */
2586 unit_add_to_dbus_queue(u
);
2589 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2590 Socket
*s
= SOCKET(userdata
);
2593 assert(s
->timer_event_source
== source
);
2597 case SOCKET_START_PRE
:
2598 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2599 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2602 case SOCKET_START_CHOWN
:
2603 case SOCKET_START_POST
:
2604 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2605 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2608 case SOCKET_STOP_PRE
:
2609 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2610 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2613 case SOCKET_STOP_PRE_SIGTERM
:
2614 if (s
->kill_context
.send_sigkill
) {
2615 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2616 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2618 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2619 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2623 case SOCKET_STOP_PRE_SIGKILL
:
2624 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2625 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2628 case SOCKET_STOP_POST
:
2629 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2630 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2633 case SOCKET_FINAL_SIGTERM
:
2634 if (s
->kill_context
.send_sigkill
) {
2635 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2636 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2638 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2639 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2643 case SOCKET_FINAL_SIGKILL
:
2644 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2645 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2649 assert_not_reached("Timeout at wrong time.");
2655 int socket_collect_fds(Socket
*s
, int **fds
) {
2656 int *rfds
, k
= 0, n
= 0;
2662 /* Called from the service code for requesting our fds */
2664 LIST_FOREACH(port
, p
, s
->ports
) {
2667 n
+= p
->n_auxiliary_fds
;
2679 LIST_FOREACH(port
, p
, s
->ports
) {
2684 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2685 rfds
[k
++] = p
->auxiliary_fds
[i
];
2694 static void socket_reset_failed(Unit
*u
) {
2695 Socket
*s
= SOCKET(u
);
2699 if (s
->state
== SOCKET_FAILED
)
2700 socket_set_state(s
, SOCKET_DEAD
);
2702 s
->result
= SOCKET_SUCCESS
;
2705 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2708 /* The service is dead. Dang!
2710 * This is strictly for one-instance-for-all-connections
2713 if (s
->state
== SOCKET_RUNNING
) {
2714 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2715 if (failed_permanent
)
2716 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2718 socket_enter_listening(s
);
2722 void socket_connection_unref(Socket
*s
) {
2725 /* The service is dead. Yay!
2727 * This is strictly for one-instance-per-connection
2730 assert(s
->n_connections
> 0);
2733 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2736 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2737 Socket
*s
= SOCKET(u
);
2743 /* Don't propagate state changes from the service if we are
2744 already down or accepting connections */
2745 if ((s
->state
!= SOCKET_RUNNING
&&
2746 s
->state
!= SOCKET_LISTENING
) ||
2750 if (other
->load_state
!= UNIT_LOADED
||
2751 other
->type
!= UNIT_SERVICE
)
2754 se
= SERVICE(other
);
2756 if (se
->state
== SERVICE_FAILED
)
2757 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2759 if (se
->state
== SERVICE_DEAD
||
2760 se
->state
== SERVICE_FINAL_SIGTERM
||
2761 se
->state
== SERVICE_FINAL_SIGKILL
||
2762 se
->state
== SERVICE_AUTO_RESTART
)
2763 socket_notify_service_dead(s
, false);
2765 if (se
->state
== SERVICE_RUNNING
)
2766 socket_set_state(s
, SOCKET_RUNNING
);
2769 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2770 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2773 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2774 Socket
*s
= SOCKET(u
);
2777 if (!s
->timer_event_source
)
2780 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2787 char *socket_fdname(Socket
*s
) {
2790 /* Returns the name to use for $LISTEN_NAMES. If the user
2791 * didn't specify anything specifically, use the socket unit's
2792 * name as fallback. */
2800 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2801 [SOCKET_EXEC_START_PRE
] = "StartPre",
2802 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2803 [SOCKET_EXEC_START_POST
] = "StartPost",
2804 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2805 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2808 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2810 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2811 [SOCKET_SUCCESS
] = "success",
2812 [SOCKET_FAILURE_RESOURCES
] = "resources",
2813 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2814 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2815 [SOCKET_FAILURE_SIGNAL
] = "signal",
2816 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2817 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2820 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2822 const UnitVTable socket_vtable
= {
2823 .object_size
= sizeof(Socket
),
2824 .exec_context_offset
= offsetof(Socket
, exec_context
),
2825 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2826 .kill_context_offset
= offsetof(Socket
, kill_context
),
2827 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2833 .private_section
= "Socket",
2835 .init
= socket_init
,
2836 .done
= socket_done
,
2837 .load
= socket_load
,
2839 .coldplug
= socket_coldplug
,
2841 .dump
= socket_dump
,
2843 .start
= socket_start
,
2844 .stop
= socket_stop
,
2846 .kill
= socket_kill
,
2848 .get_timeout
= socket_get_timeout
,
2850 .serialize
= socket_serialize
,
2851 .deserialize_item
= socket_deserialize_item
,
2852 .distribute_fds
= socket_distribute_fds
,
2854 .active_state
= socket_active_state
,
2855 .sub_state_to_string
= socket_sub_state_to_string
,
2857 .check_gc
= socket_check_gc
,
2859 .sigchld_event
= socket_sigchld_event
,
2861 .trigger_notify
= socket_trigger_notify
,
2863 .reset_failed
= socket_reset_failed
,
2865 .bus_vtable
= bus_socket_vtable
,
2866 .bus_set_property
= bus_socket_set_property
,
2867 .bus_commit_properties
= bus_socket_commit_properties
,
2869 .status_message_formats
= {
2870 /*.starting_stopping = {
2871 [0] = "Starting socket %s...",
2872 [1] = "Stopping socket %s...",
2874 .finished_start_job
= {
2875 [JOB_DONE
] = "Listening on %s.",
2876 [JOB_FAILED
] = "Failed to listen on %s.",
2877 [JOB_TIMEOUT
] = "Timed out starting %s.",
2879 .finished_stop_job
= {
2880 [JOB_DONE
] = "Closed %s.",
2881 [JOB_FAILED
] = "Failed stopping %s.",
2882 [JOB_TIMEOUT
] = "Timed out stopping %s.",