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
) {
178 if (s
->timeout_usec
<= 0) {
179 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
183 if (s
->timer_event_source
) {
184 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
188 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
191 r
= sd_event_add_time(
192 UNIT(s
)->manager
->event
,
193 &s
->timer_event_source
,
195 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
196 socket_dispatch_timer
, s
);
200 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
205 int socket_instantiate_service(Socket
*s
) {
206 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
212 /* This fills in s->service if it isn't filled in yet. For
213 * Accept=yes sockets we create the next connection service
214 * here. For Accept=no this is mostly a NOP since the service
215 * is figured out at load time anyway. */
217 if (UNIT_DEREF(s
->service
))
223 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
227 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
230 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
235 unit_ref_set(&s
->service
, u
);
237 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
240 static bool have_non_accept_socket(Socket
*s
) {
248 LIST_FOREACH(port
, p
, s
->ports
) {
250 if (p
->type
!= SOCKET_SOCKET
)
253 if (!socket_address_can_accept(&p
->address
))
260 static int socket_add_mount_links(Socket
*s
) {
266 LIST_FOREACH(port
, p
, s
->ports
) {
267 const char *path
= NULL
;
269 if (p
->type
== SOCKET_SOCKET
)
270 path
= socket_address_get_path(&p
->address
);
271 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
277 r
= unit_require_mounts_for(UNIT(s
), path
);
285 static int socket_add_device_link(Socket
*s
) {
290 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
293 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
294 return unit_add_node_link(UNIT(s
), t
, false, UNIT_BINDS_TO
);
297 static int socket_add_default_dependencies(Socket
*s
) {
301 if (!UNIT(s
)->default_dependencies
)
304 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
308 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
309 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
314 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
317 _pure_
static bool socket_has_exec(Socket
*s
) {
321 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
322 if (s
->exec_command
[i
])
328 static int socket_add_extras(Socket
*s
) {
334 if (have_non_accept_socket(s
)) {
336 if (!UNIT_DEREF(s
->service
)) {
339 r
= unit_load_related_unit(u
, ".service", &x
);
343 unit_ref_set(&s
->service
, x
);
346 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
351 r
= socket_add_mount_links(s
);
355 r
= socket_add_device_link(s
);
359 r
= unit_patch_contexts(u
);
363 if (socket_has_exec(s
)) {
364 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
368 r
= unit_set_default_slice(u
);
373 r
= socket_add_default_dependencies(s
);
380 static const char *socket_find_symlink_target(Socket
*s
) {
381 const char *found
= NULL
;
384 LIST_FOREACH(port
, p
, s
->ports
) {
385 const char *f
= NULL
;
394 if (p
->address
.sockaddr
.un
.sun_path
[0] != 0)
395 f
= p
->address
.sockaddr
.un
.sun_path
;
413 static int socket_verify(Socket
*s
) {
416 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
420 log_unit_error(UNIT(s
), "Unit lacks Listen setting. Refusing.");
424 if (s
->accept
&& have_non_accept_socket(s
)) {
425 log_unit_error(UNIT(s
), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
429 if (s
->accept
&& s
->max_connections
<= 0) {
430 log_unit_error(UNIT(s
), "MaxConnection= setting too small. Refusing.");
434 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
435 log_unit_error(UNIT(s
), "Explicit service configuration for accepting socket units not supported. Refusing.");
439 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
440 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing.");
444 if (!strv_isempty(s
->symlinks
) && !socket_find_symlink_target(s
)) {
445 log_unit_error(UNIT(s
), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
452 static int socket_load(Unit
*u
) {
453 Socket
*s
= SOCKET(u
);
457 assert(u
->load_state
== UNIT_STUB
);
459 r
= unit_load_fragment_and_dropin(u
);
463 if (u
->load_state
== UNIT_LOADED
) {
464 /* This is a new unit? Then let's add in some extras */
465 r
= socket_add_extras(s
);
470 return socket_verify(s
);
473 _const_
static const char* listen_lookup(int family
, int type
) {
475 if (family
== AF_NETLINK
)
476 return "ListenNetlink";
478 if (type
== SOCK_STREAM
)
479 return "ListenStream";
480 else if (type
== SOCK_DGRAM
)
481 return "ListenDatagram";
482 else if (type
== SOCK_SEQPACKET
)
483 return "ListenSequentialPacket";
485 assert_not_reached("Unknown socket type");
489 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
490 char time_string
[FORMAT_TIMESPAN_MAX
];
492 Socket
*s
= SOCKET(u
);
499 prefix
= strempty(prefix
);
500 prefix2
= strjoina(prefix
, "\t");
503 "%sSocket State: %s\n"
505 "%sBindIPv6Only: %s\n"
507 "%sSocketMode: %04o\n"
508 "%sDirectoryMode: %04o\n"
512 "%sTransparent: %s\n"
514 "%sPassCredentials: %s\n"
515 "%sPassSecurity: %s\n"
516 "%sTCPCongestion: %s\n"
517 "%sRemoveOnStop: %s\n"
520 "%sSELinuxContextFromNet: %s\n",
521 prefix
, socket_state_to_string(s
->state
),
522 prefix
, socket_result_to_string(s
->result
),
523 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
525 prefix
, s
->socket_mode
,
526 prefix
, s
->directory_mode
,
527 prefix
, yes_no(s
->keep_alive
),
528 prefix
, yes_no(s
->no_delay
),
529 prefix
, yes_no(s
->free_bind
),
530 prefix
, yes_no(s
->transparent
),
531 prefix
, yes_no(s
->broadcast
),
532 prefix
, yes_no(s
->pass_cred
),
533 prefix
, yes_no(s
->pass_sec
),
534 prefix
, strna(s
->tcp_congestion
),
535 prefix
, yes_no(s
->remove_on_stop
),
536 prefix
, yes_no(s
->writable
),
537 prefix
, socket_fdname(s
),
538 prefix
, yes_no(s
->selinux_context_from_net
));
540 if (s
->control_pid
> 0)
542 "%sControl PID: "PID_FMT
"\n",
543 prefix
, s
->control_pid
);
545 if (s
->bind_to_device
)
547 "%sBindToDevice: %s\n",
548 prefix
, s
->bind_to_device
);
553 "%sNConnections: %u\n"
554 "%sMaxConnections: %u\n",
555 prefix
, s
->n_accepted
,
556 prefix
, s
->n_connections
,
557 prefix
, s
->max_connections
);
559 if (s
->priority
>= 0)
562 prefix
, s
->priority
);
564 if (s
->receive_buffer
> 0)
566 "%sReceiveBuffer: %zu\n",
567 prefix
, s
->receive_buffer
);
569 if (s
->send_buffer
> 0)
571 "%sSendBuffer: %zu\n",
572 prefix
, s
->send_buffer
);
584 if (s
->pipe_size
> 0)
587 prefix
, s
->pipe_size
);
594 if (s
->mq_maxmsg
> 0)
596 "%sMessageQueueMaxMessages: %li\n",
597 prefix
, s
->mq_maxmsg
);
599 if (s
->mq_msgsize
> 0)
601 "%sMessageQueueMessageSize: %li\n",
602 prefix
, s
->mq_msgsize
);
607 prefix
, yes_no(s
->reuse_port
));
611 "%sSmackLabel: %s\n",
616 "%sSmackLabelIPIn: %s\n",
617 prefix
, s
->smack_ip_in
);
621 "%sSmackLabelIPOut: %s\n",
622 prefix
, s
->smack_ip_out
);
624 if (!isempty(s
->user
) || !isempty(s
->group
))
627 "%sOwnerGroup: %s\n",
628 prefix
, strna(s
->user
),
629 prefix
, strna(s
->group
));
631 if (s
->keep_alive_time
> 0)
633 "%sKeepAliveTimeSec: %s\n",
634 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_time
, USEC_PER_SEC
));
636 if (s
->keep_alive_interval
)
638 "%sKeepAliveIntervalSec: %s\n",
639 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_interval
, USEC_PER_SEC
));
641 if (s
->keep_alive_cnt
)
643 "%sKeepAliveProbes: %u\n",
644 prefix
, s
->keep_alive_cnt
);
648 "%sDeferAcceptSec: %s\n",
649 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->defer_accept
, USEC_PER_SEC
));
651 LIST_FOREACH(port
, p
, s
->ports
) {
653 if (p
->type
== SOCKET_SOCKET
) {
658 r
= socket_address_print(&p
->address
, &k
);
664 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
666 } else if (p
->type
== SOCKET_SPECIAL
)
667 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
668 else if (p
->type
== SOCKET_USB_FUNCTION
)
669 fprintf(f
, "%sListenUSBFunction: %s\n", prefix
, p
->path
);
670 else if (p
->type
== SOCKET_MQUEUE
)
671 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
673 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
676 exec_context_dump(&s
->exec_context
, f
, prefix
);
677 kill_context_dump(&s
->kill_context
, f
, prefix
);
679 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
680 if (!s
->exec_command
[c
])
683 fprintf(f
, "%s-> %s:\n",
684 prefix
, socket_exec_command_to_string(c
));
686 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
690 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
693 union sockaddr_union local
, remote
;
699 if (getsockname(fd
, &local
.sa
, &l
) < 0)
703 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
706 switch (local
.sa
.sa_family
) {
710 a
= ntohl(local
.in
.sin_addr
.s_addr
),
711 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
714 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
716 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
717 ntohs(local
.in
.sin_port
),
718 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
719 ntohs(remote
.in
.sin_port
)) < 0)
726 static const unsigned char ipv4_prefix
[] = {
727 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
730 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
731 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
733 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
734 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
737 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
739 a
[0], a
[1], a
[2], a
[3],
740 ntohs(local
.in6
.sin6_port
),
741 b
[0], b
[1], b
[2], b
[3],
742 ntohs(remote
.in6
.sin6_port
)) < 0)
745 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
750 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
751 ntohs(local
.in6
.sin6_port
),
752 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
753 ntohs(remote
.in6
.sin6_port
)) < 0)
764 k
= getpeercred(fd
, &ucred
);
767 "%u-"PID_FMT
"-"UID_FMT
,
768 nr
, ucred
.pid
, ucred
.uid
) < 0)
770 } else if (k
== -ENODATA
) {
771 /* This handles the case where somebody is
772 * connecting from another pid/uid namespace
773 * (e.g. from outside of our container). */
785 assert_not_reached("Unhandled socket type.");
792 static void socket_close_fds(Socket
*s
) {
798 LIST_FOREACH(port
, p
, s
->ports
) {
800 p
->event_source
= sd_event_source_unref(p
->event_source
);
805 p
->fd
= safe_close(p
->fd
);
806 socket_cleanup_fd_list(p
);
808 /* One little note: we should normally not delete any
809 * sockets in the file system here! After all some
810 * other process we spawned might still have a
811 * reference of this fd and wants to continue to use
812 * it. Therefore we delete sockets in the file system
813 * before we create a new one, not after we stopped
816 if (s
->remove_on_stop
) {
828 socket_address_unlink(&p
->address
);
837 if (s
->remove_on_stop
)
838 STRV_FOREACH(i
, s
->symlinks
)
842 static void socket_apply_socket_options(Socket
*s
, int fd
) {
849 int b
= s
->keep_alive
;
850 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
851 log_unit_warning_errno(UNIT(s
), errno
, "SO_KEEPALIVE failed: %m");
854 if (s
->keep_alive_time
) {
855 int value
= s
->keep_alive_time
/ USEC_PER_SEC
;
856 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPIDLE
, &value
, sizeof(value
)) < 0)
857 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPIDLE failed: %m");
860 if (s
->keep_alive_interval
) {
861 int value
= s
->keep_alive_interval
/ USEC_PER_SEC
;
862 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPINTVL
, &value
, sizeof(value
)) < 0)
863 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPINTVL failed: %m");
866 if (s
->keep_alive_cnt
) {
867 int value
= s
->keep_alive_cnt
;
868 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPCNT
, &value
, sizeof(value
)) < 0)
869 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPCNT failed: %m");
872 if (s
->defer_accept
) {
873 int value
= s
->defer_accept
/ USEC_PER_SEC
;
874 if (setsockopt(fd
, SOL_TCP
, TCP_DEFER_ACCEPT
, &value
, sizeof(value
)) < 0)
875 log_unit_warning_errno(UNIT(s
), errno
, "TCP_DEFER_ACCEPT failed: %m");
881 if (s
->socket_protocol
== IPPROTO_SCTP
) {
882 if (setsockopt(fd
, SOL_SCTP
, SCTP_NODELAY
, &b
, sizeof(b
)) < 0)
883 log_unit_warning_errno(UNIT(s
), errno
, "SCTP_NODELAY failed: %m");
885 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
886 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
892 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
893 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
898 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
899 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
904 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
905 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
908 if (s
->priority
>= 0)
909 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
910 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
912 if (s
->receive_buffer
> 0) {
913 int value
= (int) s
->receive_buffer
;
915 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
917 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
918 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
919 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
922 if (s
->send_buffer
> 0) {
923 int value
= (int) s
->send_buffer
;
924 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
925 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
926 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
930 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
931 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
934 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
935 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
937 if (s
->ip_ttl
>= 0) {
940 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
942 if (socket_ipv6_is_supported())
943 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
946 errno
= EAFNOSUPPORT
;
950 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
953 if (s
->tcp_congestion
)
954 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
955 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
957 if (s
->smack_ip_in
) {
958 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
960 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
963 if (s
->smack_ip_out
) {
964 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
966 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
970 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
976 if (s
->pipe_size
> 0)
977 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
978 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
981 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
983 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
987 static int fifo_address_create(
989 mode_t directory_mode
,
990 mode_t socket_mode
) {
992 _cleanup_close_
int fd
= -1;
999 mkdir_parents_label(path
, directory_mode
);
1001 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
1005 /* Enforce the right access mode for the fifo */
1006 old_mask
= umask(~ socket_mode
);
1008 /* Include the original umask in our mask */
1009 (void) umask(~socket_mode
| old_mask
);
1011 r
= mkfifo(path
, socket_mode
);
1012 (void) umask(old_mask
);
1014 if (r
< 0 && errno
!= EEXIST
) {
1019 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1025 mac_selinux_create_file_clear();
1027 if (fstat(fd
, &st
) < 0) {
1032 if (!S_ISFIFO(st
.st_mode
) ||
1033 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1034 st
.st_uid
!= getuid() ||
1035 st
.st_gid
!= getgid()) {
1046 mac_selinux_create_file_clear();
1050 static int special_address_create(const char *path
, bool writable
) {
1051 _cleanup_close_
int fd
= -1;
1057 fd
= open(path
, (writable
? O_RDWR
: O_RDONLY
)|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1061 if (fstat(fd
, &st
) < 0)
1064 /* Check whether this is a /proc, /sys or /dev file or char device */
1065 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1074 static int usbffs_address_create(const char *path
) {
1075 _cleanup_close_
int fd
= -1;
1081 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1085 if (fstat(fd
, &st
) < 0)
1088 /* Check whether this is a regular file (ffs endpoint)*/
1089 if (!S_ISREG(st
.st_mode
))
1098 static int mq_address_create(
1104 _cleanup_close_
int fd
= -1;
1107 struct mq_attr _attr
, *attr
= NULL
;
1112 if (maxmsg
> 0 && msgsize
> 0) {
1113 _attr
= (struct mq_attr
) {
1114 .mq_flags
= O_NONBLOCK
,
1115 .mq_maxmsg
= maxmsg
,
1116 .mq_msgsize
= msgsize
,
1121 /* Enforce the right access mode for the mq */
1122 old_mask
= umask(~ mq_mode
);
1124 /* Include the original umask in our mask */
1125 (void) umask(~mq_mode
| old_mask
);
1126 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1127 (void) umask(old_mask
);
1132 if (fstat(fd
, &st
) < 0)
1135 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1136 st
.st_uid
!= getuid() ||
1137 st
.st_gid
!= getgid())
1146 static int socket_symlink(Socket
*s
) {
1152 p
= socket_find_symlink_target(s
);
1156 STRV_FOREACH(i
, s
->symlinks
)
1157 symlink_label(p
, *i
);
1162 static int usbffs_write_descs(int fd
, Service
*s
) {
1165 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1168 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1172 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1175 static int usbffs_select_ep(const struct dirent
*d
) {
1176 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1179 static int usbffs_dispatch_eps(SocketPort
*p
) {
1180 _cleanup_free_
struct dirent
**ent
= NULL
;
1181 _cleanup_free_
char *path
= NULL
;
1184 path
= dirname_malloc(p
->path
);
1188 r
= scandir(path
, &ent
, usbffs_select_ep
, alphasort
);
1193 p
->auxiliary_fds
= new(int, n
);
1194 if (!p
->auxiliary_fds
)
1197 p
->n_auxiliary_fds
= n
;
1200 for (i
= 0; i
< n
; ++i
) {
1201 _cleanup_free_
char *ep
= NULL
;
1203 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1207 path_kill_slashes(ep
);
1209 r
= usbffs_address_create(ep
);
1213 p
->auxiliary_fds
[k
] = r
;
1222 close_many(p
->auxiliary_fds
, k
);
1223 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1224 p
->n_auxiliary_fds
= 0;
1229 static int socket_open_fds(Socket
*s
) {
1230 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1231 bool know_label
= false;
1237 LIST_FOREACH(port
, p
, s
->ports
) {
1247 /* Figure out label, if we don't it know
1248 * yet. We do it once, for the first
1249 * socket where we need this and
1250 * remember it for the rest. */
1252 if (s
->selinux_context_from_net
) {
1253 /* Get it from the network label */
1255 r
= mac_selinux_get_our_label(&label
);
1256 if (r
< 0 && r
!= -EOPNOTSUPP
)
1260 /* Get it from the executable we are about to start */
1262 r
= socket_instantiate_service(s
);
1266 if (UNIT_ISSET(s
->service
) &&
1267 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1268 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1269 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1277 /* Apply the socket protocol */
1278 switch(p
->address
.type
) {
1280 case SOCK_SEQPACKET
:
1281 if (p
->socket
->socket_protocol
== IPPROTO_SCTP
)
1282 p
->address
.protocol
= p
->socket
->socket_protocol
;
1285 if (p
->socket
->socket_protocol
== IPPROTO_UDPLITE
)
1286 p
->address
.protocol
= p
->socket
->socket_protocol
;
1290 r
= socket_address_listen(
1292 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1306 socket_apply_socket_options(s
, p
->fd
);
1310 case SOCKET_SPECIAL
:
1312 p
->fd
= special_address_create(p
->path
, s
->writable
);
1321 p
->fd
= fifo_address_create(
1330 socket_apply_fifo_options(s
, p
->fd
);
1336 p
->fd
= mq_address_create(
1347 case SOCKET_USB_FUNCTION
:
1349 p
->fd
= usbffs_address_create(p
->path
);
1355 r
= usbffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1359 r
= usbffs_dispatch_eps(p
);
1366 assert_not_reached("Unknown port type");
1373 socket_close_fds(s
);
1377 static void socket_unwatch_fds(Socket
*s
) {
1383 LIST_FOREACH(port
, p
, s
->ports
) {
1387 if (!p
->event_source
)
1390 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1392 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1396 static int socket_watch_fds(Socket
*s
) {
1402 LIST_FOREACH(port
, p
, s
->ports
) {
1406 if (p
->event_source
) {
1407 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1411 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1415 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1422 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1423 socket_unwatch_fds(s
);
1427 static void socket_set_state(Socket
*s
, SocketState state
) {
1428 SocketState old_state
;
1431 old_state
= s
->state
;
1439 SOCKET_STOP_PRE_SIGTERM
,
1440 SOCKET_STOP_PRE_SIGKILL
,
1442 SOCKET_FINAL_SIGTERM
,
1443 SOCKET_FINAL_SIGKILL
)) {
1445 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1446 socket_unwatch_control_pid(s
);
1447 s
->control_command
= NULL
;
1448 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1451 if (state
!= SOCKET_LISTENING
)
1452 socket_unwatch_fds(s
);
1460 SOCKET_STOP_PRE_SIGTERM
,
1461 SOCKET_STOP_PRE_SIGKILL
))
1462 socket_close_fds(s
);
1464 if (state
!= old_state
)
1465 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1467 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1470 static int socket_coldplug(Unit
*u
) {
1471 Socket
*s
= SOCKET(u
);
1475 assert(s
->state
== SOCKET_DEAD
);
1477 if (s
->deserialized_state
== s
->state
)
1480 if (s
->control_pid
> 0 &&
1481 pid_is_unwaited(s
->control_pid
) &&
1482 IN_SET(s
->deserialized_state
,
1487 SOCKET_STOP_PRE_SIGTERM
,
1488 SOCKET_STOP_PRE_SIGKILL
,
1490 SOCKET_FINAL_SIGTERM
,
1491 SOCKET_FINAL_SIGKILL
)) {
1493 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1497 r
= socket_arm_timer(s
);
1502 if (IN_SET(s
->deserialized_state
,
1508 SOCKET_STOP_PRE_SIGTERM
,
1509 SOCKET_STOP_PRE_SIGKILL
)) {
1510 r
= socket_open_fds(s
);
1515 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1516 r
= socket_watch_fds(s
);
1521 socket_set_state(s
, s
->deserialized_state
);
1525 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1526 _cleanup_free_
char **argv
= NULL
;
1529 ExecParameters exec_params
= {
1530 .apply_permissions
= true,
1531 .apply_chroot
= true,
1532 .apply_tty_stdin
= true,
1533 .bus_endpoint_fd
= -1,
1543 (void) unit_realize_cgroup(UNIT(s
));
1544 if (s
->reset_cpu_usage
) {
1545 (void) unit_reset_cpu_usage(UNIT(s
));
1546 s
->reset_cpu_usage
= false;
1549 r
= unit_setup_exec_runtime(UNIT(s
));
1553 r
= socket_arm_timer(s
);
1557 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1561 exec_params
.argv
= argv
;
1562 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1563 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1564 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1565 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1566 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1567 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1569 r
= exec_spawn(UNIT(s
),
1578 r
= unit_watch_pid(UNIT(s
), pid
);
1580 /* FIXME: we need to do something here */
1587 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1591 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1595 r
= socket_arm_timer(s
);
1599 /* We have to resolve the user names out-of-process, hence
1600 * let's fork here. It's messy, but well, what can we do? */
1608 uid_t uid
= UID_INVALID
;
1609 gid_t gid
= GID_INVALID
;
1612 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1613 (void) ignore_signals(SIGPIPE
, -1);
1616 if (!isempty(s
->user
)) {
1617 const char *user
= s
->user
;
1619 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1626 if (!isempty(s
->group
)) {
1627 const char *group
= s
->group
;
1629 r
= get_group_creds(&group
, &gid
);
1636 LIST_FOREACH(port
, p
, s
->ports
) {
1637 const char *path
= NULL
;
1639 if (p
->type
== SOCKET_SOCKET
)
1640 path
= socket_address_get_path(&p
->address
);
1641 else if (p
->type
== SOCKET_FIFO
)
1647 if (chown(path
, uid
, gid
) < 0) {
1658 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1663 r
= unit_watch_pid(UNIT(s
), pid
);
1671 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1675 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1678 if (f
!= SOCKET_SUCCESS
)
1681 exec_runtime_destroy(s
->exec_runtime
);
1682 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1684 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1686 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1689 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1691 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1695 if (f
!= SOCKET_SUCCESS
)
1698 socket_unwatch_control_pid(s
);
1699 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1700 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1702 if (s
->control_command
) {
1703 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1707 socket_set_state(s
, SOCKET_STOP_POST
);
1709 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1714 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1715 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1718 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1723 if (f
!= SOCKET_SUCCESS
)
1726 r
= unit_kill_context(
1729 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1730 KILL_KILL
: KILL_TERMINATE
,
1738 r
= socket_arm_timer(s
);
1742 socket_set_state(s
, state
);
1743 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1744 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1745 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1746 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1747 else if (state
== SOCKET_FINAL_SIGTERM
)
1748 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1750 socket_enter_dead(s
, SOCKET_SUCCESS
);
1755 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1757 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1758 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1760 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1763 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1767 if (f
!= SOCKET_SUCCESS
)
1770 socket_unwatch_control_pid(s
);
1771 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1772 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1774 if (s
->control_command
) {
1775 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1779 socket_set_state(s
, SOCKET_STOP_PRE
);
1781 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1786 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1787 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1790 static void socket_enter_listening(Socket
*s
) {
1794 r
= socket_watch_fds(s
);
1796 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1800 socket_set_state(s
, SOCKET_LISTENING
);
1804 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1807 static void socket_enter_start_post(Socket
*s
) {
1811 socket_unwatch_control_pid(s
);
1812 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1813 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1815 if (s
->control_command
) {
1816 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1818 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1822 socket_set_state(s
, SOCKET_START_POST
);
1824 socket_enter_listening(s
);
1829 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1832 static void socket_enter_start_chown(Socket
*s
) {
1837 r
= socket_open_fds(s
);
1839 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1843 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1845 socket_unwatch_control_pid(s
);
1846 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1847 s
->control_command
= NULL
;
1849 r
= socket_chown(s
, &s
->control_pid
);
1851 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1855 socket_set_state(s
, SOCKET_START_CHOWN
);
1857 socket_enter_start_post(s
);
1862 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1865 static void socket_enter_start_pre(Socket
*s
) {
1869 socket_unwatch_control_pid(s
);
1870 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1871 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1873 if (s
->control_command
) {
1874 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1876 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1880 socket_set_state(s
, SOCKET_START_PRE
);
1882 socket_enter_start_chown(s
);
1887 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1890 static void socket_enter_running(Socket
*s
, int cfd
) {
1891 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
1896 /* We don't take connections anymore if we are supposed to
1897 * shut down anyway */
1898 if (unit_stop_pending(UNIT(s
))) {
1900 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1905 /* Flush all sockets by closing and reopening them */
1906 socket_close_fds(s
);
1908 r
= socket_open_fds(s
);
1910 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1911 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1915 r
= socket_watch_fds(s
);
1917 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1918 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1928 bool pending
= false;
1930 /* If there's already a start pending don't bother to
1932 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1933 if (unit_active_or_pending(other
)) {
1939 if (!UNIT_ISSET(s
->service
)) {
1940 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1945 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, &error
, NULL
);
1950 socket_set_state(s
, SOCKET_RUNNING
);
1952 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1955 if (s
->n_connections
>= s
->max_connections
) {
1956 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1961 r
= socket_instantiate_service(s
);
1965 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1970 /* ENOTCONN is legitimate if TCP RST was received.
1971 * This connection is over, but the socket unit lives on. */
1976 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1980 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1984 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1988 service
= SERVICE(UNIT_DEREF(s
->service
));
1989 unit_ref_unset(&s
->service
);
1992 UNIT(service
)->no_gc
= false;
1994 unit_choose_id(UNIT(service
), name
);
1996 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
2001 s
->n_connections
++;
2003 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, &error
, NULL
);
2007 /* Notify clients about changed counters */
2008 unit_add_to_dbus_queue(UNIT(s
));
2014 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
2015 cfd
>= 0 ? "template" : "non-template",
2016 bus_error_message(&error
, r
));
2018 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2022 static void socket_run_next(Socket
*s
) {
2026 assert(s
->control_command
);
2027 assert(s
->control_command
->command_next
);
2029 socket_unwatch_control_pid(s
);
2031 s
->control_command
= s
->control_command
->command_next
;
2033 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2040 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2042 if (s
->state
== SOCKET_START_POST
)
2043 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2044 else if (s
->state
== SOCKET_STOP_POST
)
2045 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2047 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2050 static int socket_start(Unit
*u
) {
2051 Socket
*s
= SOCKET(u
);
2055 /* We cannot fulfill this request right now, try again later
2057 if (IN_SET(s
->state
,
2059 SOCKET_STOP_PRE_SIGKILL
,
2060 SOCKET_STOP_PRE_SIGTERM
,
2062 SOCKET_FINAL_SIGTERM
,
2063 SOCKET_FINAL_SIGKILL
))
2066 /* Already on it! */
2067 if (IN_SET(s
->state
,
2073 /* Cannot run this without the service being around */
2074 if (UNIT_ISSET(s
->service
)) {
2077 service
= SERVICE(UNIT_DEREF(s
->service
));
2079 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2080 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2084 /* If the service is already active we cannot start the
2086 if (service
->state
!= SERVICE_DEAD
&&
2087 service
->state
!= SERVICE_FAILED
&&
2088 service
->state
!= SERVICE_AUTO_RESTART
) {
2089 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2094 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2096 s
->result
= SOCKET_SUCCESS
;
2097 s
->reset_cpu_usage
= true;
2099 socket_enter_start_pre(s
);
2104 static int socket_stop(Unit
*u
) {
2105 Socket
*s
= SOCKET(u
);
2110 if (IN_SET(s
->state
,
2112 SOCKET_STOP_PRE_SIGTERM
,
2113 SOCKET_STOP_PRE_SIGKILL
,
2115 SOCKET_FINAL_SIGTERM
,
2116 SOCKET_FINAL_SIGKILL
))
2119 /* If there's already something running we go directly into
2121 if (IN_SET(s
->state
,
2124 SOCKET_START_POST
)) {
2125 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2129 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2131 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2135 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2136 Socket
*s
= SOCKET(u
);
2144 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2145 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2146 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2148 if (s
->control_pid
> 0)
2149 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2151 if (s
->control_command_id
>= 0)
2152 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2154 LIST_FOREACH(port
, p
, s
->ports
) {
2160 copy
= fdset_put_dup(fds
, p
->fd
);
2164 if (p
->type
== SOCKET_SOCKET
) {
2165 _cleanup_free_
char *t
= NULL
;
2167 r
= socket_address_print(&p
->address
, &t
);
2171 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2172 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2174 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2176 } else if (p
->type
== SOCKET_SPECIAL
)
2177 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2178 else if (p
->type
== SOCKET_MQUEUE
)
2179 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2180 else if (p
->type
== SOCKET_USB_FUNCTION
)
2181 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2183 assert(p
->type
== SOCKET_FIFO
);
2184 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2191 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2192 Socket
*s
= SOCKET(u
);
2198 if (streq(key
, "state")) {
2201 state
= socket_state_from_string(value
);
2203 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2205 s
->deserialized_state
= state
;
2206 } else if (streq(key
, "result")) {
2209 f
= socket_result_from_string(value
);
2211 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2212 else if (f
!= SOCKET_SUCCESS
)
2215 } else if (streq(key
, "n-accepted")) {
2218 if (safe_atou(value
, &k
) < 0)
2219 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2222 } else if (streq(key
, "control-pid")) {
2225 if (parse_pid(value
, &pid
) < 0)
2226 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2228 s
->control_pid
= pid
;
2229 } else if (streq(key
, "control-command")) {
2230 SocketExecCommand id
;
2232 id
= socket_exec_command_from_string(value
);
2234 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2236 s
->control_command_id
= id
;
2237 s
->control_command
= s
->exec_command
[id
];
2239 } else if (streq(key
, "fifo")) {
2243 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2244 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2247 LIST_FOREACH(port
, p
, s
->ports
)
2248 if (p
->type
== SOCKET_FIFO
&&
2249 path_equal_or_files_same(p
->path
, value
+skip
))
2254 p
->fd
= fdset_remove(fds
, fd
);
2258 } else if (streq(key
, "special")) {
2262 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2263 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2266 LIST_FOREACH(port
, p
, s
->ports
)
2267 if (p
->type
== SOCKET_SPECIAL
&&
2268 path_equal_or_files_same(p
->path
, value
+skip
))
2273 p
->fd
= fdset_remove(fds
, fd
);
2277 } else if (streq(key
, "mqueue")) {
2281 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2282 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2285 LIST_FOREACH(port
, p
, s
->ports
)
2286 if (p
->type
== SOCKET_MQUEUE
&&
2287 streq(p
->path
, value
+skip
))
2292 p
->fd
= fdset_remove(fds
, fd
);
2296 } else if (streq(key
, "socket")) {
2297 int fd
, type
, skip
= 0;
2300 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2301 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2304 LIST_FOREACH(port
, p
, s
->ports
)
2305 if (socket_address_is(&p
->address
, value
+skip
, type
))
2310 p
->fd
= fdset_remove(fds
, fd
);
2314 } else if (streq(key
, "netlink")) {
2318 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2319 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2322 LIST_FOREACH(port
, p
, s
->ports
)
2323 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2328 p
->fd
= fdset_remove(fds
, fd
);
2332 } else if (streq(key
, "ffs")) {
2336 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2337 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2340 LIST_FOREACH(port
, p
, s
->ports
)
2341 if (p
->type
== SOCKET_USB_FUNCTION
&&
2342 path_equal_or_files_same(p
->path
, value
+skip
))
2347 p
->fd
= fdset_remove(fds
, fd
);
2352 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2357 static void socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2358 Socket
*s
= SOCKET(u
);
2363 LIST_FOREACH(port
, p
, s
->ports
) {
2367 if (p
->type
!= SOCKET_SOCKET
)
2373 FDSET_FOREACH(fd
, fds
, i
) {
2374 if (socket_address_matches_fd(&p
->address
, fd
)) {
2375 p
->fd
= fdset_remove(fds
, fd
);
2376 s
->deserialized_state
= SOCKET_LISTENING
;
2383 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2386 return state_translation_table
[SOCKET(u
)->state
];
2389 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2392 return socket_state_to_string(SOCKET(u
)->state
);
2395 const char* socket_port_type_to_string(SocketPort
*p
) {
2403 switch (p
->address
.type
) {
2411 case SOCK_SEQPACKET
:
2412 return "SequentialPacket";
2415 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2422 case SOCKET_SPECIAL
:
2426 return "MessageQueue";
2431 case SOCKET_USB_FUNCTION
:
2432 return "USBFunction";
2439 _pure_
static bool socket_check_gc(Unit
*u
) {
2440 Socket
*s
= SOCKET(u
);
2444 return s
->n_connections
> 0;
2447 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2448 SocketPort
*p
= userdata
;
2454 if (p
->socket
->state
!= SOCKET_LISTENING
)
2457 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2459 if (revents
!= EPOLLIN
) {
2461 if (revents
& EPOLLHUP
)
2462 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.");
2464 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2468 if (p
->socket
->accept
&&
2469 p
->type
== SOCKET_SOCKET
&&
2470 socket_address_can_accept(&p
->address
)) {
2474 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2480 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2487 socket_apply_socket_options(p
->socket
, cfd
);
2490 socket_enter_running(p
->socket
, cfd
);
2494 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2498 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2499 Socket
*s
= SOCKET(u
);
2505 if (pid
!= s
->control_pid
)
2510 if (is_clean_exit(code
, status
, NULL
))
2512 else if (code
== CLD_EXITED
)
2513 f
= SOCKET_FAILURE_EXIT_CODE
;
2514 else if (code
== CLD_KILLED
)
2515 f
= SOCKET_FAILURE_SIGNAL
;
2516 else if (code
== CLD_DUMPED
)
2517 f
= SOCKET_FAILURE_CORE_DUMP
;
2519 assert_not_reached("Unknown sigchld code");
2521 if (s
->control_command
) {
2522 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2524 if (s
->control_command
->ignore
)
2528 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2529 "Control process exited, code=%s status=%i",
2530 sigchld_code_to_string(code
), status
);
2532 if (f
!= SOCKET_SUCCESS
)
2535 if (s
->control_command
&&
2536 s
->control_command
->command_next
&&
2537 f
== SOCKET_SUCCESS
) {
2539 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2542 s
->control_command
= NULL
;
2543 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2545 /* No further commands for this step, so let's figure
2546 * out what to do next */
2548 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2552 case SOCKET_START_PRE
:
2553 if (f
== SOCKET_SUCCESS
)
2554 socket_enter_start_chown(s
);
2556 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2559 case SOCKET_START_CHOWN
:
2560 if (f
== SOCKET_SUCCESS
)
2561 socket_enter_start_post(s
);
2563 socket_enter_stop_pre(s
, f
);
2566 case SOCKET_START_POST
:
2567 if (f
== SOCKET_SUCCESS
)
2568 socket_enter_listening(s
);
2570 socket_enter_stop_pre(s
, f
);
2573 case SOCKET_STOP_PRE
:
2574 case SOCKET_STOP_PRE_SIGTERM
:
2575 case SOCKET_STOP_PRE_SIGKILL
:
2576 socket_enter_stop_post(s
, f
);
2579 case SOCKET_STOP_POST
:
2580 case SOCKET_FINAL_SIGTERM
:
2581 case SOCKET_FINAL_SIGKILL
:
2582 socket_enter_dead(s
, f
);
2586 assert_not_reached("Uh, control process died at wrong time.");
2590 /* Notify clients about changed exit status */
2591 unit_add_to_dbus_queue(u
);
2594 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2595 Socket
*s
= SOCKET(userdata
);
2598 assert(s
->timer_event_source
== source
);
2602 case SOCKET_START_PRE
:
2603 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2604 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2607 case SOCKET_START_CHOWN
:
2608 case SOCKET_START_POST
:
2609 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2610 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2613 case SOCKET_STOP_PRE
:
2614 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2615 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2618 case SOCKET_STOP_PRE_SIGTERM
:
2619 if (s
->kill_context
.send_sigkill
) {
2620 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2621 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2623 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2624 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2628 case SOCKET_STOP_PRE_SIGKILL
:
2629 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2630 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2633 case SOCKET_STOP_POST
:
2634 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2635 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2638 case SOCKET_FINAL_SIGTERM
:
2639 if (s
->kill_context
.send_sigkill
) {
2640 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2641 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2643 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2644 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2648 case SOCKET_FINAL_SIGKILL
:
2649 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2650 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2654 assert_not_reached("Timeout at wrong time.");
2660 int socket_collect_fds(Socket
*s
, int **fds
) {
2661 int *rfds
, k
= 0, n
= 0;
2667 /* Called from the service code for requesting our fds */
2669 LIST_FOREACH(port
, p
, s
->ports
) {
2672 n
+= p
->n_auxiliary_fds
;
2684 LIST_FOREACH(port
, p
, s
->ports
) {
2689 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2690 rfds
[k
++] = p
->auxiliary_fds
[i
];
2699 static void socket_reset_failed(Unit
*u
) {
2700 Socket
*s
= SOCKET(u
);
2704 if (s
->state
== SOCKET_FAILED
)
2705 socket_set_state(s
, SOCKET_DEAD
);
2707 s
->result
= SOCKET_SUCCESS
;
2710 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2713 /* The service is dead. Dang!
2715 * This is strictly for one-instance-for-all-connections
2718 if (s
->state
== SOCKET_RUNNING
) {
2719 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2720 if (failed_permanent
)
2721 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2723 socket_enter_listening(s
);
2727 void socket_connection_unref(Socket
*s
) {
2730 /* The service is dead. Yay!
2732 * This is strictly for one-instance-per-connection
2735 assert(s
->n_connections
> 0);
2738 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2741 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2742 Socket
*s
= SOCKET(u
);
2748 /* Don't propagate state changes from the service if we are
2749 already down or accepting connections */
2750 if ((s
->state
!= SOCKET_RUNNING
&&
2751 s
->state
!= SOCKET_LISTENING
) ||
2755 if (other
->load_state
!= UNIT_LOADED
||
2756 other
->type
!= UNIT_SERVICE
)
2759 se
= SERVICE(other
);
2761 if (se
->state
== SERVICE_FAILED
)
2762 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2764 if (se
->state
== SERVICE_DEAD
||
2765 se
->state
== SERVICE_FINAL_SIGTERM
||
2766 se
->state
== SERVICE_FINAL_SIGKILL
||
2767 se
->state
== SERVICE_AUTO_RESTART
)
2768 socket_notify_service_dead(s
, false);
2770 if (se
->state
== SERVICE_RUNNING
)
2771 socket_set_state(s
, SOCKET_RUNNING
);
2774 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2775 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2778 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2779 Socket
*s
= SOCKET(u
);
2782 if (!s
->timer_event_source
)
2785 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2792 char *socket_fdname(Socket
*s
) {
2795 /* Returns the name to use for $LISTEN_NAMES. If the user
2796 * didn't specify anything specifically, use the socket unit's
2797 * name as fallback. */
2805 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2806 [SOCKET_EXEC_START_PRE
] = "StartPre",
2807 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2808 [SOCKET_EXEC_START_POST
] = "StartPost",
2809 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2810 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2813 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2815 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2816 [SOCKET_SUCCESS
] = "success",
2817 [SOCKET_FAILURE_RESOURCES
] = "resources",
2818 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2819 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2820 [SOCKET_FAILURE_SIGNAL
] = "signal",
2821 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2822 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2825 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2827 const UnitVTable socket_vtable
= {
2828 .object_size
= sizeof(Socket
),
2829 .exec_context_offset
= offsetof(Socket
, exec_context
),
2830 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2831 .kill_context_offset
= offsetof(Socket
, kill_context
),
2832 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2838 .private_section
= "Socket",
2840 .init
= socket_init
,
2841 .done
= socket_done
,
2842 .load
= socket_load
,
2844 .coldplug
= socket_coldplug
,
2846 .dump
= socket_dump
,
2848 .start
= socket_start
,
2849 .stop
= socket_stop
,
2851 .kill
= socket_kill
,
2853 .get_timeout
= socket_get_timeout
,
2855 .serialize
= socket_serialize
,
2856 .deserialize_item
= socket_deserialize_item
,
2857 .distribute_fds
= socket_distribute_fds
,
2859 .active_state
= socket_active_state
,
2860 .sub_state_to_string
= socket_sub_state_to_string
,
2862 .check_gc
= socket_check_gc
,
2864 .sigchld_event
= socket_sigchld_event
,
2866 .trigger_notify
= socket_trigger_notify
,
2868 .reset_failed
= socket_reset_failed
,
2870 .bus_vtable
= bus_socket_vtable
,
2871 .bus_set_property
= bus_socket_set_property
,
2872 .bus_commit_properties
= bus_socket_commit_properties
,
2874 .status_message_formats
= {
2875 /*.starting_stopping = {
2876 [0] = "Starting socket %s...",
2877 [1] = "Stopping socket %s...",
2879 .finished_start_job
= {
2880 [JOB_DONE
] = "Listening on %s.",
2881 [JOB_FAILED
] = "Failed to listen on %s.",
2882 [JOB_TIMEOUT
] = "Timed out starting %s.",
2884 .finished_stop_job
= {
2885 [JOB_DONE
] = "Closed %s.",
2886 [JOB_FAILED
] = "Failed stopping %s.",
2887 [JOB_TIMEOUT
] = "Timed out stopping %s.",