1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <arpa/inet.h>
26 #include <netinet/tcp.h>
28 #include <sys/epoll.h>
34 #include "bus-error.h"
37 #include "dbus-socket.h"
39 #include "exit-status.h"
40 #include "formats-util.h"
45 #include "path-util.h"
46 #include "selinux-util.h"
47 #include "signal-util.h"
48 #include "smack-util.h"
52 #include "unit-name.h"
53 #include "unit-printf.h"
56 static const UnitActiveState state_translation_table
[_SOCKET_STATE_MAX
] = {
57 [SOCKET_DEAD
] = UNIT_INACTIVE
,
58 [SOCKET_START_PRE
] = UNIT_ACTIVATING
,
59 [SOCKET_START_CHOWN
] = UNIT_ACTIVATING
,
60 [SOCKET_START_POST
] = UNIT_ACTIVATING
,
61 [SOCKET_LISTENING
] = UNIT_ACTIVE
,
62 [SOCKET_RUNNING
] = UNIT_ACTIVE
,
63 [SOCKET_STOP_PRE
] = UNIT_DEACTIVATING
,
64 [SOCKET_STOP_PRE_SIGTERM
] = UNIT_DEACTIVATING
,
65 [SOCKET_STOP_PRE_SIGKILL
] = UNIT_DEACTIVATING
,
66 [SOCKET_STOP_POST
] = UNIT_DEACTIVATING
,
67 [SOCKET_FINAL_SIGTERM
] = UNIT_DEACTIVATING
,
68 [SOCKET_FINAL_SIGKILL
] = UNIT_DEACTIVATING
,
69 [SOCKET_FAILED
] = UNIT_FAILED
72 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
73 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
75 static void socket_init(Unit
*u
) {
76 Socket
*s
= SOCKET(u
);
79 assert(u
->load_state
== UNIT_STUB
);
81 s
->backlog
= SOMAXCONN
;
82 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
83 s
->directory_mode
= 0755;
84 s
->socket_mode
= 0666;
86 s
->max_connections
= 64;
93 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
94 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
96 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
99 static void socket_unwatch_control_pid(Socket
*s
) {
102 if (s
->control_pid
<= 0)
105 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
109 static void socket_cleanup_fd_list(SocketPort
*p
) {
110 int k
= p
->n_auxiliary_fds
;
113 safe_close(p
->auxiliary_fds
[k
]);
115 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
116 p
->n_auxiliary_fds
= 0;
119 void socket_free_ports(Socket
*s
) {
124 while ((p
= s
->ports
)) {
125 LIST_REMOVE(port
, s
->ports
, p
);
127 sd_event_source_unref(p
->event_source
);
129 socket_cleanup_fd_list(p
);
136 static void socket_done(Unit
*u
) {
137 Socket
*s
= SOCKET(u
);
141 socket_free_ports(s
);
143 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
144 exec_command_free_array(s
->exec_command
, _SOCKET_EXEC_COMMAND_MAX
);
145 s
->control_command
= NULL
;
147 socket_unwatch_control_pid(s
);
149 unit_ref_unset(&s
->service
);
151 s
->tcp_congestion
= mfree(s
->tcp_congestion
);
152 s
->bind_to_device
= mfree(s
->bind_to_device
);
155 free(s
->smack_ip_in
);
156 free(s
->smack_ip_out
);
158 strv_free(s
->symlinks
);
163 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
166 static int socket_arm_timer(Socket
*s
) {
171 if (s
->timeout_usec
<= 0) {
172 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
176 if (s
->timer_event_source
) {
177 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
181 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
184 r
= sd_event_add_time(
185 UNIT(s
)->manager
->event
,
186 &s
->timer_event_source
,
188 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
189 socket_dispatch_timer
, s
);
193 (void) sd_event_source_set_description(s
->timer_event_source
, "socket-timer");
198 int socket_instantiate_service(Socket
*s
) {
199 _cleanup_free_
char *prefix
= NULL
, *name
= NULL
;
205 /* This fills in s->service if it isn't filled in yet. For
206 * Accept=yes sockets we create the next connection service
207 * here. For Accept=no this is mostly a NOP since the service
208 * is figured out at load time anyway. */
210 if (UNIT_DEREF(s
->service
))
216 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
220 if (asprintf(&name
, "%s@%u.service", prefix
, s
->n_accepted
) < 0)
223 r
= manager_load_unit(UNIT(s
)->manager
, name
, NULL
, NULL
, &u
);
228 unit_ref_set(&s
->service
, u
);
230 return unit_add_two_dependencies(UNIT(s
), UNIT_BEFORE
, UNIT_TRIGGERS
, u
, false);
233 static bool have_non_accept_socket(Socket
*s
) {
241 LIST_FOREACH(port
, p
, s
->ports
) {
243 if (p
->type
!= SOCKET_SOCKET
)
246 if (!socket_address_can_accept(&p
->address
))
253 static int socket_add_mount_links(Socket
*s
) {
259 LIST_FOREACH(port
, p
, s
->ports
) {
260 const char *path
= NULL
;
262 if (p
->type
== SOCKET_SOCKET
)
263 path
= socket_address_get_path(&p
->address
);
264 else if (IN_SET(p
->type
, SOCKET_FIFO
, SOCKET_SPECIAL
, SOCKET_USB_FUNCTION
))
270 r
= unit_require_mounts_for(UNIT(s
), path
);
278 static int socket_add_device_link(Socket
*s
) {
283 if (!s
->bind_to_device
|| streq(s
->bind_to_device
, "lo"))
286 t
= strjoina("/sys/subsystem/net/devices/", s
->bind_to_device
);
287 return unit_add_node_link(UNIT(s
), t
, false);
290 static int socket_add_default_dependencies(Socket
*s
) {
294 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SOCKETS_TARGET
, NULL
, true);
298 if (UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
) {
299 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
304 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
307 _pure_
static bool socket_has_exec(Socket
*s
) {
311 for (i
= 0; i
< _SOCKET_EXEC_COMMAND_MAX
; i
++)
312 if (s
->exec_command
[i
])
318 static int socket_add_extras(Socket
*s
) {
324 if (have_non_accept_socket(s
)) {
326 if (!UNIT_DEREF(s
->service
)) {
329 r
= unit_load_related_unit(u
, ".service", &x
);
333 unit_ref_set(&s
->service
, x
);
336 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(s
->service
), true);
341 r
= socket_add_mount_links(s
);
345 r
= socket_add_device_link(s
);
349 r
= unit_patch_contexts(u
);
353 if (socket_has_exec(s
)) {
354 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
358 r
= unit_set_default_slice(u
);
363 if (u
->default_dependencies
) {
364 r
= socket_add_default_dependencies(s
);
372 static const char *socket_find_symlink_target(Socket
*s
) {
373 const char *found
= NULL
;
376 LIST_FOREACH(port
, p
, s
->ports
) {
377 const char *f
= NULL
;
386 if (p
->address
.sockaddr
.un
.sun_path
[0] != 0)
387 f
= p
->address
.sockaddr
.un
.sun_path
;
405 static int socket_verify(Socket
*s
) {
408 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
412 log_unit_error(UNIT(s
), "Unit lacks Listen setting. Refusing.");
416 if (s
->accept
&& have_non_accept_socket(s
)) {
417 log_unit_error(UNIT(s
), "Unit configured for accepting sockets, but sockets are non-accepting. Refusing.");
421 if (s
->accept
&& s
->max_connections
<= 0) {
422 log_unit_error(UNIT(s
), "MaxConnection= setting too small. Refusing.");
426 if (s
->accept
&& UNIT_DEREF(s
->service
)) {
427 log_unit_error(UNIT(s
), "Explicit service configuration for accepting socket units not supported. Refusing.");
431 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
432 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing.");
436 if (!strv_isempty(s
->symlinks
) && !socket_find_symlink_target(s
)) {
437 log_unit_error(UNIT(s
), "Unit has symlinks set but none or more than one node in the file system. Refusing.");
444 static int socket_load(Unit
*u
) {
445 Socket
*s
= SOCKET(u
);
449 assert(u
->load_state
== UNIT_STUB
);
451 r
= unit_load_fragment_and_dropin(u
);
455 if (u
->load_state
== UNIT_LOADED
) {
456 /* This is a new unit? Then let's add in some extras */
457 r
= socket_add_extras(s
);
462 return socket_verify(s
);
465 _const_
static const char* listen_lookup(int family
, int type
) {
467 if (family
== AF_NETLINK
)
468 return "ListenNetlink";
470 if (type
== SOCK_STREAM
)
471 return "ListenStream";
472 else if (type
== SOCK_DGRAM
)
473 return "ListenDatagram";
474 else if (type
== SOCK_SEQPACKET
)
475 return "ListenSequentialPacket";
477 assert_not_reached("Unknown socket type");
481 static void socket_dump(Unit
*u
, FILE *f
, const char *prefix
) {
482 char time_string
[FORMAT_TIMESPAN_MAX
];
484 Socket
*s
= SOCKET(u
);
491 prefix
= strempty(prefix
);
492 prefix2
= strjoina(prefix
, "\t");
495 "%sSocket State: %s\n"
497 "%sBindIPv6Only: %s\n"
499 "%sSocketMode: %04o\n"
500 "%sDirectoryMode: %04o\n"
504 "%sTransparent: %s\n"
506 "%sPassCredentials: %s\n"
507 "%sPassSecurity: %s\n"
508 "%sTCPCongestion: %s\n"
509 "%sRemoveOnStop: %s\n"
510 "%sSELinuxContextFromNet: %s\n",
511 prefix
, socket_state_to_string(s
->state
),
512 prefix
, socket_result_to_string(s
->result
),
513 prefix
, socket_address_bind_ipv6_only_to_string(s
->bind_ipv6_only
),
515 prefix
, s
->socket_mode
,
516 prefix
, s
->directory_mode
,
517 prefix
, yes_no(s
->keep_alive
),
518 prefix
, yes_no(s
->no_delay
),
519 prefix
, yes_no(s
->free_bind
),
520 prefix
, yes_no(s
->transparent
),
521 prefix
, yes_no(s
->broadcast
),
522 prefix
, yes_no(s
->pass_cred
),
523 prefix
, yes_no(s
->pass_sec
),
524 prefix
, strna(s
->tcp_congestion
),
525 prefix
, yes_no(s
->remove_on_stop
),
526 prefix
, yes_no(s
->selinux_context_from_net
));
528 if (s
->control_pid
> 0)
530 "%sControl PID: "PID_FMT
"\n",
531 prefix
, s
->control_pid
);
533 if (s
->bind_to_device
)
535 "%sBindToDevice: %s\n",
536 prefix
, s
->bind_to_device
);
541 "%sNConnections: %u\n"
542 "%sMaxConnections: %u\n",
543 prefix
, s
->n_accepted
,
544 prefix
, s
->n_connections
,
545 prefix
, s
->max_connections
);
547 if (s
->priority
>= 0)
550 prefix
, s
->priority
);
552 if (s
->receive_buffer
> 0)
554 "%sReceiveBuffer: %zu\n",
555 prefix
, s
->receive_buffer
);
557 if (s
->send_buffer
> 0)
559 "%sSendBuffer: %zu\n",
560 prefix
, s
->send_buffer
);
572 if (s
->pipe_size
> 0)
575 prefix
, s
->pipe_size
);
582 if (s
->mq_maxmsg
> 0)
584 "%sMessageQueueMaxMessages: %li\n",
585 prefix
, s
->mq_maxmsg
);
587 if (s
->mq_msgsize
> 0)
589 "%sMessageQueueMessageSize: %li\n",
590 prefix
, s
->mq_msgsize
);
595 prefix
, yes_no(s
->reuse_port
));
599 "%sSmackLabel: %s\n",
604 "%sSmackLabelIPIn: %s\n",
605 prefix
, s
->smack_ip_in
);
609 "%sSmackLabelIPOut: %s\n",
610 prefix
, s
->smack_ip_out
);
612 if (!isempty(s
->user
) || !isempty(s
->group
))
615 "%sOwnerGroup: %s\n",
616 prefix
, strna(s
->user
),
617 prefix
, strna(s
->group
));
619 if (s
->keep_alive_time
> 0)
621 "%sKeepAliveTimeSec: %s\n",
622 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_time
, USEC_PER_SEC
));
624 if (s
->keep_alive_interval
)
626 "%sKeepAliveIntervalSec: %s\n",
627 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->keep_alive_interval
, USEC_PER_SEC
));
629 if (s
->keep_alive_cnt
)
631 "%sKeepAliveProbes: %u\n",
632 prefix
, s
->keep_alive_cnt
);
636 "%sDeferAcceptSec: %s\n",
637 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, s
->defer_accept
, USEC_PER_SEC
));
639 LIST_FOREACH(port
, p
, s
->ports
) {
641 if (p
->type
== SOCKET_SOCKET
) {
646 if ((r
= socket_address_print(&p
->address
, &k
)) < 0)
651 fprintf(f
, "%s%s: %s\n", prefix
, listen_lookup(socket_address_family(&p
->address
), p
->address
.type
), t
);
653 } else if (p
->type
== SOCKET_SPECIAL
)
654 fprintf(f
, "%sListenSpecial: %s\n", prefix
, p
->path
);
655 else if (p
->type
== SOCKET_USB_FUNCTION
)
656 fprintf(f
, "%sListenUSBFunction: %s\n", prefix
, p
->path
);
657 else if (p
->type
== SOCKET_MQUEUE
)
658 fprintf(f
, "%sListenMessageQueue: %s\n", prefix
, p
->path
);
660 fprintf(f
, "%sListenFIFO: %s\n", prefix
, p
->path
);
663 exec_context_dump(&s
->exec_context
, f
, prefix
);
664 kill_context_dump(&s
->kill_context
, f
, prefix
);
666 for (c
= 0; c
< _SOCKET_EXEC_COMMAND_MAX
; c
++) {
667 if (!s
->exec_command
[c
])
670 fprintf(f
, "%s-> %s:\n",
671 prefix
, socket_exec_command_to_string(c
));
673 exec_command_dump_list(s
->exec_command
[c
], f
, prefix2
);
677 static int instance_from_socket(int fd
, unsigned nr
, char **instance
) {
680 union sockaddr_union local
, remote
;
686 if (getsockname(fd
, &local
.sa
, &l
) < 0)
690 if (getpeername(fd
, &remote
.sa
, &l
) < 0)
693 switch (local
.sa
.sa_family
) {
697 a
= ntohl(local
.in
.sin_addr
.s_addr
),
698 b
= ntohl(remote
.in
.sin_addr
.s_addr
);
701 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
703 a
>> 24, (a
>> 16) & 0xFF, (a
>> 8) & 0xFF, a
& 0xFF,
704 ntohs(local
.in
.sin_port
),
705 b
>> 24, (b
>> 16) & 0xFF, (b
>> 8) & 0xFF, b
& 0xFF,
706 ntohs(remote
.in
.sin_port
)) < 0)
713 static const unsigned char ipv4_prefix
[] = {
714 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
717 if (memcmp(&local
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0 &&
718 memcmp(&remote
.in6
.sin6_addr
, ipv4_prefix
, sizeof(ipv4_prefix
)) == 0) {
720 *a
= local
.in6
.sin6_addr
.s6_addr
+12,
721 *b
= remote
.in6
.sin6_addr
.s6_addr
+12;
724 "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
726 a
[0], a
[1], a
[2], a
[3],
727 ntohs(local
.in6
.sin6_port
),
728 b
[0], b
[1], b
[2], b
[3],
729 ntohs(remote
.in6
.sin6_port
)) < 0)
732 char a
[INET6_ADDRSTRLEN
], b
[INET6_ADDRSTRLEN
];
737 inet_ntop(AF_INET6
, &local
.in6
.sin6_addr
, a
, sizeof(a
)),
738 ntohs(local
.in6
.sin6_port
),
739 inet_ntop(AF_INET6
, &remote
.in6
.sin6_addr
, b
, sizeof(b
)),
740 ntohs(remote
.in6
.sin6_port
)) < 0)
751 k
= getpeercred(fd
, &ucred
);
754 "%u-"PID_FMT
"-"UID_FMT
,
755 nr
, ucred
.pid
, ucred
.uid
) < 0)
757 } else if (k
== -ENODATA
) {
758 /* This handles the case where somebody is
759 * connecting from another pid/uid namespace
760 * (e.g. from outside of our container). */
772 assert_not_reached("Unhandled socket type.");
779 static void socket_close_fds(Socket
*s
) {
785 LIST_FOREACH(port
, p
, s
->ports
) {
787 p
->event_source
= sd_event_source_unref(p
->event_source
);
792 p
->fd
= safe_close(p
->fd
);
793 socket_cleanup_fd_list(p
);
795 /* One little note: we should normally not delete any
796 * sockets in the file system here! After all some
797 * other process we spawned might still have a
798 * reference of this fd and wants to continue to use
799 * it. Therefore we delete sockets in the file system
800 * before we create a new one, not after we stopped
803 if (s
->remove_on_stop
) {
815 socket_address_unlink(&p
->address
);
824 if (s
->remove_on_stop
)
825 STRV_FOREACH(i
, s
->symlinks
)
829 static void socket_apply_socket_options(Socket
*s
, int fd
) {
836 int b
= s
->keep_alive
;
837 if (setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &b
, sizeof(b
)) < 0)
838 log_unit_warning_errno(UNIT(s
), errno
, "SO_KEEPALIVE failed: %m");
841 if (s
->keep_alive_time
) {
842 int value
= s
->keep_alive_time
/ USEC_PER_SEC
;
843 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPIDLE
, &value
, sizeof(value
)) < 0)
844 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPIDLE failed: %m");
847 if (s
->keep_alive_interval
) {
848 int value
= s
->keep_alive_interval
/ USEC_PER_SEC
;
849 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPINTVL
, &value
, sizeof(value
)) < 0)
850 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPINTVL failed: %m");
853 if (s
->keep_alive_cnt
) {
854 int value
= s
->keep_alive_cnt
;
855 if (setsockopt(fd
, SOL_TCP
, TCP_KEEPCNT
, &value
, sizeof(value
)) < 0)
856 log_unit_warning_errno(UNIT(s
), errno
, "TCP_KEEPCNT failed: %m");
859 if (s
->defer_accept
) {
860 int value
= s
->defer_accept
/ USEC_PER_SEC
;
861 if (setsockopt(fd
, SOL_TCP
, TCP_DEFER_ACCEPT
, &value
, sizeof(value
)) < 0)
862 log_unit_warning_errno(UNIT(s
), errno
, "TCP_DEFER_ACCEPT failed: %m");
867 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
868 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
873 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
874 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
879 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
880 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
885 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
886 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
889 if (s
->priority
>= 0)
890 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
891 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
893 if (s
->receive_buffer
> 0) {
894 int value
= (int) s
->receive_buffer
;
896 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
898 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
899 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
900 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
903 if (s
->send_buffer
> 0) {
904 int value
= (int) s
->send_buffer
;
905 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
906 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
907 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
911 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
912 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
915 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
916 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
918 if (s
->ip_ttl
>= 0) {
921 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
923 if (socket_ipv6_is_supported())
924 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
927 errno
= EAFNOSUPPORT
;
931 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
934 if (s
->tcp_congestion
)
935 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
936 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
938 if (s
->smack_ip_in
) {
939 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
941 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
944 if (s
->smack_ip_out
) {
945 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
947 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
951 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
957 if (s
->pipe_size
> 0)
958 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
959 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
962 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
964 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
968 static int fifo_address_create(
970 mode_t directory_mode
,
971 mode_t socket_mode
) {
973 _cleanup_close_
int fd
= -1;
980 mkdir_parents_label(path
, directory_mode
);
982 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
986 /* Enforce the right access mode for the fifo */
987 old_mask
= umask(~ socket_mode
);
989 /* Include the original umask in our mask */
990 (void) umask(~socket_mode
| old_mask
);
992 r
= mkfifo(path
, socket_mode
);
993 (void) umask(old_mask
);
995 if (r
< 0 && errno
!= EEXIST
) {
1000 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1006 mac_selinux_create_file_clear();
1008 if (fstat(fd
, &st
) < 0) {
1013 if (!S_ISFIFO(st
.st_mode
) ||
1014 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1015 st
.st_uid
!= getuid() ||
1016 st
.st_gid
!= getgid()) {
1027 mac_selinux_create_file_clear();
1033 static int special_address_create(const char *path
) {
1034 _cleanup_close_
int fd
= -1;
1040 fd
= open(path
, O_RDONLY
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1044 if (fstat(fd
, &st
) < 0)
1047 /* Check whether this is a /proc, /sys or /dev file or char device */
1048 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1057 static int ffs_address_create(const char *path
) {
1058 _cleanup_close_
int fd
= -1;
1064 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1068 if (fstat(fd
, &st
) < 0)
1071 /* Check whether this is a regular file (ffs endpoint)*/
1072 if (!S_ISREG(st
.st_mode
))
1081 static int mq_address_create(
1087 _cleanup_close_
int fd
= -1;
1090 struct mq_attr _attr
, *attr
= NULL
;
1095 if (maxmsg
> 0 && msgsize
> 0) {
1096 _attr
= (struct mq_attr
) {
1097 .mq_flags
= O_NONBLOCK
,
1098 .mq_maxmsg
= maxmsg
,
1099 .mq_msgsize
= msgsize
,
1104 /* Enforce the right access mode for the mq */
1105 old_mask
= umask(~ mq_mode
);
1107 /* Include the original umask in our mask */
1108 (void) umask(~mq_mode
| old_mask
);
1109 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1110 (void) umask(old_mask
);
1115 if (fstat(fd
, &st
) < 0)
1118 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1119 st
.st_uid
!= getuid() ||
1120 st
.st_gid
!= getgid())
1129 static int socket_symlink(Socket
*s
) {
1135 p
= socket_find_symlink_target(s
);
1139 STRV_FOREACH(i
, s
->symlinks
)
1140 symlink_label(p
, *i
);
1145 static int ffs_write_descs(int fd
, Service
*s
) {
1148 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1151 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1155 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1158 static int select_ep(const struct dirent
*d
) {
1159 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1162 static int ffs_dispatch_eps(SocketPort
*p
) {
1163 _cleanup_free_
struct dirent
**ent
= NULL
;
1165 _cleanup_free_
char *path
= NULL
;
1167 r
= path_get_parent(p
->path
, &path
);
1171 r
= scandir(path
, &ent
, select_ep
, alphasort
);
1176 p
->auxiliary_fds
= new(int, n
);
1177 if (!p
->auxiliary_fds
)
1180 p
->n_auxiliary_fds
= n
;
1183 for (i
= 0; i
< n
; ++i
) {
1184 _cleanup_free_
char *ep
= NULL
;
1186 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1190 path_kill_slashes(ep
);
1192 r
= ffs_address_create(ep
);
1196 p
->auxiliary_fds
[k
] = r
;
1205 close_many(p
->auxiliary_fds
, k
);
1206 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1207 p
->n_auxiliary_fds
= 0;
1212 static int socket_open_fds(Socket
*s
) {
1213 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1214 bool know_label
= false;
1220 LIST_FOREACH(port
, p
, s
->ports
) {
1225 if (p
->type
== SOCKET_SOCKET
) {
1228 /* Figure out label, if we don't it know
1229 * yet. We do it once, for the first
1230 * socket where we need this and
1231 * remember it for the rest. */
1233 if (s
->selinux_context_from_net
) {
1234 /* Get it from the network label */
1236 r
= mac_selinux_get_our_label(&label
);
1237 if (r
< 0 && r
!= -EOPNOTSUPP
)
1241 /* Get it from the executable we are about to start */
1243 r
= socket_instantiate_service(s
);
1247 if (UNIT_ISSET(s
->service
) &&
1248 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1249 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1250 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1258 r
= socket_address_listen(
1260 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1274 socket_apply_socket_options(s
, p
->fd
);
1277 } else if (p
->type
== SOCKET_SPECIAL
) {
1279 p
->fd
= special_address_create(p
->path
);
1285 } else if (p
->type
== SOCKET_FIFO
) {
1287 p
->fd
= fifo_address_create(
1296 socket_apply_fifo_options(s
, p
->fd
);
1299 } else if (p
->type
== SOCKET_MQUEUE
) {
1301 p
->fd
= mq_address_create(
1311 } else if (p
->type
== SOCKET_USB_FUNCTION
) {
1313 p
->fd
= ffs_address_create(p
->path
);
1319 r
= ffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1323 r
= ffs_dispatch_eps(p
);
1327 assert_not_reached("Unknown port type");
1333 socket_close_fds(s
);
1337 static void socket_unwatch_fds(Socket
*s
) {
1343 LIST_FOREACH(port
, p
, s
->ports
) {
1347 if (!p
->event_source
)
1350 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1352 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1356 static int socket_watch_fds(Socket
*s
) {
1362 LIST_FOREACH(port
, p
, s
->ports
) {
1366 if (p
->event_source
) {
1367 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1371 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1375 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1382 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1383 socket_unwatch_fds(s
);
1387 static void socket_set_state(Socket
*s
, SocketState state
) {
1388 SocketState old_state
;
1391 old_state
= s
->state
;
1399 SOCKET_STOP_PRE_SIGTERM
,
1400 SOCKET_STOP_PRE_SIGKILL
,
1402 SOCKET_FINAL_SIGTERM
,
1403 SOCKET_FINAL_SIGKILL
)) {
1405 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1406 socket_unwatch_control_pid(s
);
1407 s
->control_command
= NULL
;
1408 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1411 if (state
!= SOCKET_LISTENING
)
1412 socket_unwatch_fds(s
);
1420 SOCKET_STOP_PRE_SIGTERM
,
1421 SOCKET_STOP_PRE_SIGKILL
))
1422 socket_close_fds(s
);
1424 if (state
!= old_state
)
1425 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1427 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1430 static int socket_coldplug(Unit
*u
) {
1431 Socket
*s
= SOCKET(u
);
1435 assert(s
->state
== SOCKET_DEAD
);
1437 if (s
->deserialized_state
== s
->state
)
1440 if (IN_SET(s
->deserialized_state
,
1445 SOCKET_STOP_PRE_SIGTERM
,
1446 SOCKET_STOP_PRE_SIGKILL
,
1448 SOCKET_FINAL_SIGTERM
,
1449 SOCKET_FINAL_SIGKILL
)) {
1451 if (s
->control_pid
<= 0)
1454 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1458 r
= socket_arm_timer(s
);
1463 if (IN_SET(s
->deserialized_state
,
1469 SOCKET_STOP_PRE_SIGTERM
,
1470 SOCKET_STOP_PRE_SIGKILL
)) {
1471 r
= socket_open_fds(s
);
1476 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1477 r
= socket_watch_fds(s
);
1482 socket_set_state(s
, s
->deserialized_state
);
1486 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1487 _cleanup_free_
char **argv
= NULL
;
1490 ExecParameters exec_params
= {
1491 .apply_permissions
= true,
1492 .apply_chroot
= true,
1493 .apply_tty_stdin
= true,
1494 .bus_endpoint_fd
= -1,
1501 (void) unit_realize_cgroup(UNIT(s
));
1502 if (s
->reset_cpu_usage
) {
1503 (void) unit_reset_cpu_usage(UNIT(s
));
1504 s
->reset_cpu_usage
= false;
1507 r
= unit_setup_exec_runtime(UNIT(s
));
1511 r
= socket_arm_timer(s
);
1515 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1519 exec_params
.argv
= argv
;
1520 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1521 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1522 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1523 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1524 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1525 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1527 r
= exec_spawn(UNIT(s
),
1536 r
= unit_watch_pid(UNIT(s
), pid
);
1538 /* FIXME: we need to do something here */
1545 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1549 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1553 r
= socket_arm_timer(s
);
1557 /* We have to resolve the user names out-of-process, hence
1558 * let's fork here. It's messy, but well, what can we do? */
1566 uid_t uid
= UID_INVALID
;
1567 gid_t gid
= GID_INVALID
;
1570 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1571 (void) ignore_signals(SIGPIPE
, -1);
1574 if (!isempty(s
->user
)) {
1575 const char *user
= s
->user
;
1577 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1584 if (!isempty(s
->group
)) {
1585 const char *group
= s
->group
;
1587 r
= get_group_creds(&group
, &gid
);
1594 LIST_FOREACH(port
, p
, s
->ports
) {
1595 const char *path
= NULL
;
1597 if (p
->type
== SOCKET_SOCKET
)
1598 path
= socket_address_get_path(&p
->address
);
1599 else if (p
->type
== SOCKET_FIFO
)
1605 if (chown(path
, uid
, gid
) < 0) {
1616 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1621 r
= unit_watch_pid(UNIT(s
), pid
);
1629 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1633 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1636 if (f
!= SOCKET_SUCCESS
)
1639 exec_runtime_destroy(s
->exec_runtime
);
1640 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1642 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1644 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1647 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1649 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1653 if (f
!= SOCKET_SUCCESS
)
1656 socket_unwatch_control_pid(s
);
1657 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1658 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1660 if (s
->control_command
) {
1661 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1665 socket_set_state(s
, SOCKET_STOP_POST
);
1667 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1672 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1673 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1676 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1681 if (f
!= SOCKET_SUCCESS
)
1684 r
= unit_kill_context(
1687 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1688 KILL_KILL
: KILL_TERMINATE
,
1696 r
= socket_arm_timer(s
);
1700 socket_set_state(s
, state
);
1701 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1702 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1703 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1704 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1705 else if (state
== SOCKET_FINAL_SIGTERM
)
1706 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1708 socket_enter_dead(s
, SOCKET_SUCCESS
);
1713 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1715 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1716 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1718 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1721 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1725 if (f
!= SOCKET_SUCCESS
)
1728 socket_unwatch_control_pid(s
);
1729 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1730 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1732 if (s
->control_command
) {
1733 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1737 socket_set_state(s
, SOCKET_STOP_PRE
);
1739 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1744 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1745 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1748 static void socket_enter_listening(Socket
*s
) {
1752 r
= socket_watch_fds(s
);
1754 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1758 socket_set_state(s
, SOCKET_LISTENING
);
1762 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1765 static void socket_enter_start_post(Socket
*s
) {
1769 socket_unwatch_control_pid(s
);
1770 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1771 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1773 if (s
->control_command
) {
1774 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1776 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1780 socket_set_state(s
, SOCKET_START_POST
);
1782 socket_enter_listening(s
);
1787 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1790 static void socket_enter_start_chown(Socket
*s
) {
1795 r
= socket_open_fds(s
);
1797 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1801 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1803 socket_unwatch_control_pid(s
);
1804 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1805 s
->control_command
= NULL
;
1807 r
= socket_chown(s
, &s
->control_pid
);
1809 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1813 socket_set_state(s
, SOCKET_START_CHOWN
);
1815 socket_enter_start_post(s
);
1820 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1823 static void socket_enter_start_pre(Socket
*s
) {
1827 socket_unwatch_control_pid(s
);
1828 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1829 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1831 if (s
->control_command
) {
1832 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1834 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1838 socket_set_state(s
, SOCKET_START_PRE
);
1840 socket_enter_start_chown(s
);
1845 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1848 static void socket_enter_running(Socket
*s
, int cfd
) {
1849 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1854 /* We don't take connections anymore if we are supposed to
1855 * shut down anyway */
1856 if (unit_stop_pending(UNIT(s
))) {
1858 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1863 /* Flush all sockets by closing and reopening them */
1864 socket_close_fds(s
);
1866 r
= socket_open_fds(s
);
1868 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1869 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1873 r
= socket_watch_fds(s
);
1875 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1876 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1886 bool pending
= false;
1888 /* If there's already a start pending don't bother to
1890 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1891 if (unit_active_or_pending(other
)) {
1897 if (!UNIT_ISSET(s
->service
)) {
1898 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1903 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, true, &error
, NULL
);
1908 socket_set_state(s
, SOCKET_RUNNING
);
1910 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1913 if (s
->n_connections
>= s
->max_connections
) {
1914 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1919 r
= socket_instantiate_service(s
);
1923 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1928 /* ENOTCONN is legitimate if TCP RST was received.
1929 * This connection is over, but the socket unit lives on. */
1934 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1938 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1942 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1946 service
= SERVICE(UNIT_DEREF(s
->service
));
1947 unit_ref_unset(&s
->service
);
1950 UNIT(service
)->no_gc
= false;
1952 unit_choose_id(UNIT(service
), name
);
1954 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1959 s
->n_connections
++;
1961 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, true, &error
, NULL
);
1965 /* Notify clients about changed counters */
1966 unit_add_to_dbus_queue(UNIT(s
));
1972 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
1973 cfd
>= 0 ? "template" : "non-template",
1974 bus_error_message(&error
, r
));
1976 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1980 static void socket_run_next(Socket
*s
) {
1984 assert(s
->control_command
);
1985 assert(s
->control_command
->command_next
);
1987 socket_unwatch_control_pid(s
);
1989 s
->control_command
= s
->control_command
->command_next
;
1991 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1998 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2000 if (s
->state
== SOCKET_START_POST
)
2001 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2002 else if (s
->state
== SOCKET_STOP_POST
)
2003 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2005 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2008 static int socket_start(Unit
*u
) {
2009 Socket
*s
= SOCKET(u
);
2013 /* We cannot fulfill this request right now, try again later
2015 if (IN_SET(s
->state
,
2017 SOCKET_STOP_PRE_SIGKILL
,
2018 SOCKET_STOP_PRE_SIGTERM
,
2020 SOCKET_FINAL_SIGTERM
,
2021 SOCKET_FINAL_SIGKILL
))
2024 /* Already on it! */
2025 if (IN_SET(s
->state
,
2031 /* Cannot run this without the service being around */
2032 if (UNIT_ISSET(s
->service
)) {
2035 service
= SERVICE(UNIT_DEREF(s
->service
));
2037 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2038 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2042 /* If the service is already active we cannot start the
2044 if (service
->state
!= SERVICE_DEAD
&&
2045 service
->state
!= SERVICE_FAILED
&&
2046 service
->state
!= SERVICE_AUTO_RESTART
) {
2047 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2052 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2054 s
->result
= SOCKET_SUCCESS
;
2055 s
->reset_cpu_usage
= true;
2057 socket_enter_start_pre(s
);
2062 static int socket_stop(Unit
*u
) {
2063 Socket
*s
= SOCKET(u
);
2068 if (IN_SET(s
->state
,
2070 SOCKET_STOP_PRE_SIGTERM
,
2071 SOCKET_STOP_PRE_SIGKILL
,
2073 SOCKET_FINAL_SIGTERM
,
2074 SOCKET_FINAL_SIGKILL
))
2077 /* If there's already something running we go directly into
2079 if (IN_SET(s
->state
,
2082 SOCKET_START_POST
)) {
2083 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2087 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2089 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2093 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2094 Socket
*s
= SOCKET(u
);
2102 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2103 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2104 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2106 if (s
->control_pid
> 0)
2107 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2109 if (s
->control_command_id
>= 0)
2110 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2112 LIST_FOREACH(port
, p
, s
->ports
) {
2118 copy
= fdset_put_dup(fds
, p
->fd
);
2122 if (p
->type
== SOCKET_SOCKET
) {
2123 _cleanup_free_
char *t
= NULL
;
2125 r
= socket_address_print(&p
->address
, &t
);
2129 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2130 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2132 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2134 } else if (p
->type
== SOCKET_SPECIAL
)
2135 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2136 else if (p
->type
== SOCKET_MQUEUE
)
2137 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2138 else if (p
->type
== SOCKET_USB_FUNCTION
)
2139 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2141 assert(p
->type
== SOCKET_FIFO
);
2142 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2149 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2150 Socket
*s
= SOCKET(u
);
2156 if (streq(key
, "state")) {
2159 state
= socket_state_from_string(value
);
2161 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2163 s
->deserialized_state
= state
;
2164 } else if (streq(key
, "result")) {
2167 f
= socket_result_from_string(value
);
2169 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2170 else if (f
!= SOCKET_SUCCESS
)
2173 } else if (streq(key
, "n-accepted")) {
2176 if (safe_atou(value
, &k
) < 0)
2177 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2180 } else if (streq(key
, "control-pid")) {
2183 if (parse_pid(value
, &pid
) < 0)
2184 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2186 s
->control_pid
= pid
;
2187 } else if (streq(key
, "control-command")) {
2188 SocketExecCommand id
;
2190 id
= socket_exec_command_from_string(value
);
2192 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2194 s
->control_command_id
= id
;
2195 s
->control_command
= s
->exec_command
[id
];
2197 } else if (streq(key
, "fifo")) {
2201 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2202 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2205 LIST_FOREACH(port
, p
, s
->ports
)
2206 if (p
->type
== SOCKET_FIFO
&&
2207 path_equal_or_files_same(p
->path
, value
+skip
))
2212 p
->fd
= fdset_remove(fds
, fd
);
2216 } else if (streq(key
, "special")) {
2220 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2221 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2224 LIST_FOREACH(port
, p
, s
->ports
)
2225 if (p
->type
== SOCKET_SPECIAL
&&
2226 path_equal_or_files_same(p
->path
, value
+skip
))
2231 p
->fd
= fdset_remove(fds
, fd
);
2235 } else if (streq(key
, "mqueue")) {
2239 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2240 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2243 LIST_FOREACH(port
, p
, s
->ports
)
2244 if (p
->type
== SOCKET_MQUEUE
&&
2245 streq(p
->path
, value
+skip
))
2250 p
->fd
= fdset_remove(fds
, fd
);
2254 } else if (streq(key
, "socket")) {
2255 int fd
, type
, skip
= 0;
2258 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2259 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2262 LIST_FOREACH(port
, p
, s
->ports
)
2263 if (socket_address_is(&p
->address
, value
+skip
, type
))
2268 p
->fd
= fdset_remove(fds
, fd
);
2272 } else if (streq(key
, "netlink")) {
2276 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2277 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2280 LIST_FOREACH(port
, p
, s
->ports
)
2281 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2286 p
->fd
= fdset_remove(fds
, fd
);
2290 } else if (streq(key
, "ffs")) {
2294 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2295 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2298 LIST_FOREACH(port
, p
, s
->ports
)
2299 if (p
->type
== SOCKET_USB_FUNCTION
&&
2300 path_equal_or_files_same(p
->path
, value
+skip
))
2305 p
->fd
= fdset_remove(fds
, fd
);
2310 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2315 static int socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2316 Socket
*s
= SOCKET(u
);
2321 LIST_FOREACH(port
, p
, s
->ports
) {
2325 if (p
->type
!= SOCKET_SOCKET
)
2331 FDSET_FOREACH(fd
, fds
, i
) {
2332 if (socket_address_matches_fd(&p
->address
, fd
)) {
2333 p
->fd
= fdset_remove(fds
, fd
);
2334 s
->deserialized_state
= SOCKET_LISTENING
;
2343 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2346 return state_translation_table
[SOCKET(u
)->state
];
2349 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2352 return socket_state_to_string(SOCKET(u
)->state
);
2355 const char* socket_port_type_to_string(SocketPort
*p
) {
2363 switch (p
->address
.type
) {
2371 case SOCK_SEQPACKET
:
2372 return "SequentialPacket";
2375 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2382 case SOCKET_SPECIAL
:
2386 return "MessageQueue";
2391 case SOCKET_USB_FUNCTION
:
2392 return "USBFunction";
2399 _pure_
static bool socket_check_gc(Unit
*u
) {
2400 Socket
*s
= SOCKET(u
);
2404 return s
->n_connections
> 0;
2407 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2408 SocketPort
*p
= userdata
;
2414 if (p
->socket
->state
!= SOCKET_LISTENING
)
2417 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2419 if (revents
!= EPOLLIN
) {
2421 if (revents
& EPOLLHUP
)
2422 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.");
2424 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2428 if (p
->socket
->accept
&&
2429 p
->type
== SOCKET_SOCKET
&&
2430 socket_address_can_accept(&p
->address
)) {
2434 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2440 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2447 socket_apply_socket_options(p
->socket
, cfd
);
2450 socket_enter_running(p
->socket
, cfd
);
2454 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2458 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2459 Socket
*s
= SOCKET(u
);
2465 if (pid
!= s
->control_pid
)
2470 if (is_clean_exit(code
, status
, NULL
))
2472 else if (code
== CLD_EXITED
)
2473 f
= SOCKET_FAILURE_EXIT_CODE
;
2474 else if (code
== CLD_KILLED
)
2475 f
= SOCKET_FAILURE_SIGNAL
;
2476 else if (code
== CLD_DUMPED
)
2477 f
= SOCKET_FAILURE_CORE_DUMP
;
2479 assert_not_reached("Unknown sigchld code");
2481 if (s
->control_command
) {
2482 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2484 if (s
->control_command
->ignore
)
2488 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2489 "Control process exited, code=%s status=%i",
2490 sigchld_code_to_string(code
), status
);
2492 if (f
!= SOCKET_SUCCESS
)
2495 if (s
->control_command
&&
2496 s
->control_command
->command_next
&&
2497 f
== SOCKET_SUCCESS
) {
2499 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2502 s
->control_command
= NULL
;
2503 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2505 /* No further commands for this step, so let's figure
2506 * out what to do next */
2508 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2512 case SOCKET_START_PRE
:
2513 if (f
== SOCKET_SUCCESS
)
2514 socket_enter_start_chown(s
);
2516 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2519 case SOCKET_START_CHOWN
:
2520 if (f
== SOCKET_SUCCESS
)
2521 socket_enter_start_post(s
);
2523 socket_enter_stop_pre(s
, f
);
2526 case SOCKET_START_POST
:
2527 if (f
== SOCKET_SUCCESS
)
2528 socket_enter_listening(s
);
2530 socket_enter_stop_pre(s
, f
);
2533 case SOCKET_STOP_PRE
:
2534 case SOCKET_STOP_PRE_SIGTERM
:
2535 case SOCKET_STOP_PRE_SIGKILL
:
2536 socket_enter_stop_post(s
, f
);
2539 case SOCKET_STOP_POST
:
2540 case SOCKET_FINAL_SIGTERM
:
2541 case SOCKET_FINAL_SIGKILL
:
2542 socket_enter_dead(s
, f
);
2546 assert_not_reached("Uh, control process died at wrong time.");
2550 /* Notify clients about changed exit status */
2551 unit_add_to_dbus_queue(u
);
2554 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2555 Socket
*s
= SOCKET(userdata
);
2558 assert(s
->timer_event_source
== source
);
2562 case SOCKET_START_PRE
:
2563 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2564 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2567 case SOCKET_START_CHOWN
:
2568 case SOCKET_START_POST
:
2569 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2570 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2573 case SOCKET_STOP_PRE
:
2574 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2575 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2578 case SOCKET_STOP_PRE_SIGTERM
:
2579 if (s
->kill_context
.send_sigkill
) {
2580 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2581 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2583 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2584 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2588 case SOCKET_STOP_PRE_SIGKILL
:
2589 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2590 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2593 case SOCKET_STOP_POST
:
2594 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2595 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2598 case SOCKET_FINAL_SIGTERM
:
2599 if (s
->kill_context
.send_sigkill
) {
2600 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2601 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2603 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2604 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2608 case SOCKET_FINAL_SIGKILL
:
2609 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2610 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2614 assert_not_reached("Timeout at wrong time.");
2620 int socket_collect_fds(Socket
*s
, int **fds
, unsigned *n_fds
) {
2630 /* Called from the service code for requesting our fds */
2633 LIST_FOREACH(port
, p
, s
->ports
) {
2636 rn_fds
+= p
->n_auxiliary_fds
;
2645 rfds
= new(int, rn_fds
);
2650 LIST_FOREACH(port
, p
, s
->ports
) {
2653 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2654 rfds
[k
++] = p
->auxiliary_fds
[i
];
2657 assert(k
== rn_fds
);
2665 static void socket_reset_failed(Unit
*u
) {
2666 Socket
*s
= SOCKET(u
);
2670 if (s
->state
== SOCKET_FAILED
)
2671 socket_set_state(s
, SOCKET_DEAD
);
2673 s
->result
= SOCKET_SUCCESS
;
2676 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2679 /* The service is dead. Dang!
2681 * This is strictly for one-instance-for-all-connections
2684 if (s
->state
== SOCKET_RUNNING
) {
2685 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2686 if (failed_permanent
)
2687 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2689 socket_enter_listening(s
);
2693 void socket_connection_unref(Socket
*s
) {
2696 /* The service is dead. Yay!
2698 * This is strictly for one-instance-per-connection
2701 assert(s
->n_connections
> 0);
2704 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2707 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2708 Socket
*s
= SOCKET(u
);
2714 /* Don't propagate state changes from the service if we are
2715 already down or accepting connections */
2716 if ((s
->state
!= SOCKET_RUNNING
&&
2717 s
->state
!= SOCKET_LISTENING
) ||
2721 if (other
->load_state
!= UNIT_LOADED
||
2722 other
->type
!= UNIT_SERVICE
)
2725 se
= SERVICE(other
);
2727 if (se
->state
== SERVICE_FAILED
)
2728 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2730 if (se
->state
== SERVICE_DEAD
||
2731 se
->state
== SERVICE_FINAL_SIGTERM
||
2732 se
->state
== SERVICE_FINAL_SIGKILL
||
2733 se
->state
== SERVICE_AUTO_RESTART
)
2734 socket_notify_service_dead(s
, false);
2736 if (se
->state
== SERVICE_RUNNING
)
2737 socket_set_state(s
, SOCKET_RUNNING
);
2740 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2741 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2744 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2745 Socket
*s
= SOCKET(u
);
2748 if (!s
->timer_event_source
)
2751 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2758 static const char* const socket_state_table
[_SOCKET_STATE_MAX
] = {
2759 [SOCKET_DEAD
] = "dead",
2760 [SOCKET_START_PRE
] = "start-pre",
2761 [SOCKET_START_CHOWN
] = "start-chown",
2762 [SOCKET_START_POST
] = "start-post",
2763 [SOCKET_LISTENING
] = "listening",
2764 [SOCKET_RUNNING
] = "running",
2765 [SOCKET_STOP_PRE
] = "stop-pre",
2766 [SOCKET_STOP_PRE_SIGTERM
] = "stop-pre-sigterm",
2767 [SOCKET_STOP_PRE_SIGKILL
] = "stop-pre-sigkill",
2768 [SOCKET_STOP_POST
] = "stop-post",
2769 [SOCKET_FINAL_SIGTERM
] = "final-sigterm",
2770 [SOCKET_FINAL_SIGKILL
] = "final-sigkill",
2771 [SOCKET_FAILED
] = "failed"
2774 DEFINE_STRING_TABLE_LOOKUP(socket_state
, SocketState
);
2776 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2777 [SOCKET_EXEC_START_PRE
] = "StartPre",
2778 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2779 [SOCKET_EXEC_START_POST
] = "StartPost",
2780 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2781 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2784 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2786 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2787 [SOCKET_SUCCESS
] = "success",
2788 [SOCKET_FAILURE_RESOURCES
] = "resources",
2789 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2790 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2791 [SOCKET_FAILURE_SIGNAL
] = "signal",
2792 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2793 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2796 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2798 const UnitVTable socket_vtable
= {
2799 .object_size
= sizeof(Socket
),
2800 .exec_context_offset
= offsetof(Socket
, exec_context
),
2801 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2802 .kill_context_offset
= offsetof(Socket
, kill_context
),
2803 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2809 .private_section
= "Socket",
2811 .init
= socket_init
,
2812 .done
= socket_done
,
2813 .load
= socket_load
,
2815 .coldplug
= socket_coldplug
,
2817 .dump
= socket_dump
,
2819 .start
= socket_start
,
2820 .stop
= socket_stop
,
2822 .kill
= socket_kill
,
2824 .get_timeout
= socket_get_timeout
,
2826 .serialize
= socket_serialize
,
2827 .deserialize_item
= socket_deserialize_item
,
2828 .distribute_fds
= socket_distribute_fds
,
2830 .active_state
= socket_active_state
,
2831 .sub_state_to_string
= socket_sub_state_to_string
,
2833 .check_gc
= socket_check_gc
,
2835 .sigchld_event
= socket_sigchld_event
,
2837 .trigger_notify
= socket_trigger_notify
,
2839 .reset_failed
= socket_reset_failed
,
2841 .bus_vtable
= bus_socket_vtable
,
2842 .bus_set_property
= bus_socket_set_property
,
2843 .bus_commit_properties
= bus_socket_commit_properties
,
2845 .status_message_formats
= {
2846 /*.starting_stopping = {
2847 [0] = "Starting socket %s...",
2848 [1] = "Stopping socket %s...",
2850 .finished_start_job
= {
2851 [JOB_DONE
] = "Listening on %s.",
2852 [JOB_FAILED
] = "Failed to listen on %s.",
2853 [JOB_TIMEOUT
] = "Timed out starting %s.",
2855 .finished_stop_job
= {
2856 [JOB_DONE
] = "Closed %s.",
2857 [JOB_FAILED
] = "Failed stopping %s.",
2858 [JOB_TIMEOUT
] = "Timed out stopping %s.",