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 "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");
880 if (setsockopt(fd
, SOL_TCP
, TCP_NODELAY
, &b
, sizeof(b
)) < 0)
881 log_unit_warning_errno(UNIT(s
), errno
, "TCP_NODELAY failed: %m");
886 if (setsockopt(fd
, SOL_SOCKET
, SO_BROADCAST
, &one
, sizeof(one
)) < 0)
887 log_unit_warning_errno(UNIT(s
), errno
, "SO_BROADCAST failed: %m");
892 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSCRED
, &one
, sizeof(one
)) < 0)
893 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSCRED failed: %m");
898 if (setsockopt(fd
, SOL_SOCKET
, SO_PASSSEC
, &one
, sizeof(one
)) < 0)
899 log_unit_warning_errno(UNIT(s
), errno
, "SO_PASSSEC failed: %m");
902 if (s
->priority
>= 0)
903 if (setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &s
->priority
, sizeof(s
->priority
)) < 0)
904 log_unit_warning_errno(UNIT(s
), errno
, "SO_PRIORITY failed: %m");
906 if (s
->receive_buffer
> 0) {
907 int value
= (int) s
->receive_buffer
;
909 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
911 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUFFORCE
, &value
, sizeof(value
)) < 0)
912 if (setsockopt(fd
, SOL_SOCKET
, SO_RCVBUF
, &value
, sizeof(value
)) < 0)
913 log_unit_warning_errno(UNIT(s
), errno
, "SO_RCVBUF failed: %m");
916 if (s
->send_buffer
> 0) {
917 int value
= (int) s
->send_buffer
;
918 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUFFORCE
, &value
, sizeof(value
)) < 0)
919 if (setsockopt(fd
, SOL_SOCKET
, SO_SNDBUF
, &value
, sizeof(value
)) < 0)
920 log_unit_warning_errno(UNIT(s
), errno
, "SO_SNDBUF failed: %m");
924 if (setsockopt(fd
, SOL_SOCKET
, SO_MARK
, &s
->mark
, sizeof(s
->mark
)) < 0)
925 log_unit_warning_errno(UNIT(s
), errno
, "SO_MARK failed: %m");
928 if (setsockopt(fd
, IPPROTO_IP
, IP_TOS
, &s
->ip_tos
, sizeof(s
->ip_tos
)) < 0)
929 log_unit_warning_errno(UNIT(s
), errno
, "IP_TOS failed: %m");
931 if (s
->ip_ttl
>= 0) {
934 r
= setsockopt(fd
, IPPROTO_IP
, IP_TTL
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
936 if (socket_ipv6_is_supported())
937 x
= setsockopt(fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &s
->ip_ttl
, sizeof(s
->ip_ttl
));
940 errno
= EAFNOSUPPORT
;
944 log_unit_warning_errno(UNIT(s
), errno
, "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
947 if (s
->tcp_congestion
)
948 if (setsockopt(fd
, SOL_TCP
, TCP_CONGESTION
, s
->tcp_congestion
, strlen(s
->tcp_congestion
)+1) < 0)
949 log_unit_warning_errno(UNIT(s
), errno
, "TCP_CONGESTION failed: %m");
951 if (s
->smack_ip_in
) {
952 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPIN
, s
->smack_ip_in
);
954 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_in_fd: %m");
957 if (s
->smack_ip_out
) {
958 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_IPOUT
, s
->smack_ip_out
);
960 log_unit_error_errno(UNIT(s
), r
, "mac_smack_apply_ip_out_fd: %m");
964 static void socket_apply_fifo_options(Socket
*s
, int fd
) {
970 if (s
->pipe_size
> 0)
971 if (fcntl(fd
, F_SETPIPE_SZ
, s
->pipe_size
) < 0)
972 log_unit_warning_errno(UNIT(s
), errno
, "Setting pipe size failed, ignoring: %m");
975 r
= mac_smack_apply_fd(fd
, SMACK_ATTR_ACCESS
, s
->smack
);
977 log_unit_error_errno(UNIT(s
), r
, "SMACK relabelling failed, ignoring: %m");
981 static int fifo_address_create(
983 mode_t directory_mode
,
984 mode_t socket_mode
) {
986 _cleanup_close_
int fd
= -1;
993 mkdir_parents_label(path
, directory_mode
);
995 r
= mac_selinux_create_file_prepare(path
, S_IFIFO
);
999 /* Enforce the right access mode for the fifo */
1000 old_mask
= umask(~ socket_mode
);
1002 /* Include the original umask in our mask */
1003 (void) umask(~socket_mode
| old_mask
);
1005 r
= mkfifo(path
, socket_mode
);
1006 (void) umask(old_mask
);
1008 if (r
< 0 && errno
!= EEXIST
) {
1013 fd
= open(path
, O_RDWR
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
| O_NOFOLLOW
);
1019 mac_selinux_create_file_clear();
1021 if (fstat(fd
, &st
) < 0) {
1026 if (!S_ISFIFO(st
.st_mode
) ||
1027 (st
.st_mode
& 0777) != (socket_mode
& ~old_mask
) ||
1028 st
.st_uid
!= getuid() ||
1029 st
.st_gid
!= getgid()) {
1040 mac_selinux_create_file_clear();
1044 static int special_address_create(const char *path
, bool writable
) {
1045 _cleanup_close_
int fd
= -1;
1051 fd
= open(path
, (writable
? O_RDWR
: O_RDONLY
)|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1055 if (fstat(fd
, &st
) < 0)
1058 /* Check whether this is a /proc, /sys or /dev file or char device */
1059 if (!S_ISREG(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
1068 static int usbffs_address_create(const char *path
) {
1069 _cleanup_close_
int fd
= -1;
1075 fd
= open(path
, O_RDWR
|O_CLOEXEC
|O_NOCTTY
|O_NONBLOCK
|O_NOFOLLOW
);
1079 if (fstat(fd
, &st
) < 0)
1082 /* Check whether this is a regular file (ffs endpoint)*/
1083 if (!S_ISREG(st
.st_mode
))
1092 static int mq_address_create(
1098 _cleanup_close_
int fd
= -1;
1101 struct mq_attr _attr
, *attr
= NULL
;
1106 if (maxmsg
> 0 && msgsize
> 0) {
1107 _attr
= (struct mq_attr
) {
1108 .mq_flags
= O_NONBLOCK
,
1109 .mq_maxmsg
= maxmsg
,
1110 .mq_msgsize
= msgsize
,
1115 /* Enforce the right access mode for the mq */
1116 old_mask
= umask(~ mq_mode
);
1118 /* Include the original umask in our mask */
1119 (void) umask(~mq_mode
| old_mask
);
1120 fd
= mq_open(path
, O_RDONLY
|O_CLOEXEC
|O_NONBLOCK
|O_CREAT
, mq_mode
, attr
);
1121 (void) umask(old_mask
);
1126 if (fstat(fd
, &st
) < 0)
1129 if ((st
.st_mode
& 0777) != (mq_mode
& ~old_mask
) ||
1130 st
.st_uid
!= getuid() ||
1131 st
.st_gid
!= getgid())
1140 static int socket_symlink(Socket
*s
) {
1146 p
= socket_find_symlink_target(s
);
1150 STRV_FOREACH(i
, s
->symlinks
)
1151 symlink_label(p
, *i
);
1156 static int usbffs_write_descs(int fd
, Service
*s
) {
1159 if (!s
->usb_function_descriptors
|| !s
->usb_function_strings
)
1162 r
= copy_file_fd(s
->usb_function_descriptors
, fd
, false);
1166 return copy_file_fd(s
->usb_function_strings
, fd
, false);
1169 static int usbffs_select_ep(const struct dirent
*d
) {
1170 return d
->d_name
[0] != '.' && !streq(d
->d_name
, "ep0");
1173 static int usbffs_dispatch_eps(SocketPort
*p
) {
1174 _cleanup_free_
struct dirent
**ent
= NULL
;
1175 _cleanup_free_
char *path
= NULL
;
1178 path
= dirname_malloc(p
->path
);
1182 r
= scandir(path
, &ent
, usbffs_select_ep
, alphasort
);
1187 p
->auxiliary_fds
= new(int, n
);
1188 if (!p
->auxiliary_fds
)
1191 p
->n_auxiliary_fds
= n
;
1194 for (i
= 0; i
< n
; ++i
) {
1195 _cleanup_free_
char *ep
= NULL
;
1197 ep
= path_make_absolute(ent
[i
]->d_name
, path
);
1201 path_kill_slashes(ep
);
1203 r
= usbffs_address_create(ep
);
1207 p
->auxiliary_fds
[k
] = r
;
1216 close_many(p
->auxiliary_fds
, k
);
1217 p
->auxiliary_fds
= mfree(p
->auxiliary_fds
);
1218 p
->n_auxiliary_fds
= 0;
1223 static int socket_open_fds(Socket
*s
) {
1224 _cleanup_(mac_selinux_freep
) char *label
= NULL
;
1225 bool know_label
= false;
1231 LIST_FOREACH(port
, p
, s
->ports
) {
1241 /* Figure out label, if we don't it know
1242 * yet. We do it once, for the first
1243 * socket where we need this and
1244 * remember it for the rest. */
1246 if (s
->selinux_context_from_net
) {
1247 /* Get it from the network label */
1249 r
= mac_selinux_get_our_label(&label
);
1250 if (r
< 0 && r
!= -EOPNOTSUPP
)
1254 /* Get it from the executable we are about to start */
1256 r
= socket_instantiate_service(s
);
1260 if (UNIT_ISSET(s
->service
) &&
1261 SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]) {
1262 r
= mac_selinux_get_create_label_from_exe(SERVICE(UNIT_DEREF(s
->service
))->exec_command
[SERVICE_EXEC_START
]->path
, &label
);
1263 if (r
< 0 && r
!= -EPERM
&& r
!= -EOPNOTSUPP
)
1271 /* Apply the socket protocol */
1272 switch(p
->address
.type
) {
1274 case SOCK_SEQPACKET
:
1275 if (p
->socket
->socket_protocol
== IPPROTO_SCTP
)
1276 p
->address
.protocol
= p
->socket
->socket_protocol
;
1279 if (p
->socket
->socket_protocol
== IPPROTO_UDPLITE
)
1280 p
->address
.protocol
= p
->socket
->socket_protocol
;
1284 r
= socket_address_listen(
1286 SOCK_CLOEXEC
|SOCK_NONBLOCK
,
1300 socket_apply_socket_options(s
, p
->fd
);
1304 case SOCKET_SPECIAL
:
1306 p
->fd
= special_address_create(p
->path
, s
->writable
);
1315 p
->fd
= fifo_address_create(
1324 socket_apply_fifo_options(s
, p
->fd
);
1330 p
->fd
= mq_address_create(
1341 case SOCKET_USB_FUNCTION
:
1343 p
->fd
= usbffs_address_create(p
->path
);
1349 r
= usbffs_write_descs(p
->fd
, SERVICE(UNIT_DEREF(s
->service
)));
1353 r
= usbffs_dispatch_eps(p
);
1360 assert_not_reached("Unknown port type");
1367 socket_close_fds(s
);
1371 static void socket_unwatch_fds(Socket
*s
) {
1377 LIST_FOREACH(port
, p
, s
->ports
) {
1381 if (!p
->event_source
)
1384 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_OFF
);
1386 log_unit_debug_errno(UNIT(s
), r
, "Failed to disable event source: %m");
1390 static int socket_watch_fds(Socket
*s
) {
1396 LIST_FOREACH(port
, p
, s
->ports
) {
1400 if (p
->event_source
) {
1401 r
= sd_event_source_set_enabled(p
->event_source
, SD_EVENT_ON
);
1405 r
= sd_event_add_io(UNIT(s
)->manager
->event
, &p
->event_source
, p
->fd
, EPOLLIN
, socket_dispatch_io
, p
);
1409 (void) sd_event_source_set_description(p
->event_source
, "socket-port-io");
1416 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch listening fds: %m");
1417 socket_unwatch_fds(s
);
1421 static void socket_set_state(Socket
*s
, SocketState state
) {
1422 SocketState old_state
;
1425 old_state
= s
->state
;
1433 SOCKET_STOP_PRE_SIGTERM
,
1434 SOCKET_STOP_PRE_SIGKILL
,
1436 SOCKET_FINAL_SIGTERM
,
1437 SOCKET_FINAL_SIGKILL
)) {
1439 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1440 socket_unwatch_control_pid(s
);
1441 s
->control_command
= NULL
;
1442 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
1445 if (state
!= SOCKET_LISTENING
)
1446 socket_unwatch_fds(s
);
1454 SOCKET_STOP_PRE_SIGTERM
,
1455 SOCKET_STOP_PRE_SIGKILL
))
1456 socket_close_fds(s
);
1458 if (state
!= old_state
)
1459 log_unit_debug(UNIT(s
), "Changed %s -> %s", socket_state_to_string(old_state
), socket_state_to_string(state
));
1461 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
1464 static int socket_coldplug(Unit
*u
) {
1465 Socket
*s
= SOCKET(u
);
1469 assert(s
->state
== SOCKET_DEAD
);
1471 if (s
->deserialized_state
== s
->state
)
1474 if (s
->control_pid
> 0 &&
1475 pid_is_unwaited(s
->control_pid
) &&
1476 IN_SET(s
->deserialized_state
,
1481 SOCKET_STOP_PRE_SIGTERM
,
1482 SOCKET_STOP_PRE_SIGKILL
,
1484 SOCKET_FINAL_SIGTERM
,
1485 SOCKET_FINAL_SIGKILL
)) {
1487 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
1491 r
= socket_arm_timer(s
);
1496 if (IN_SET(s
->deserialized_state
,
1502 SOCKET_STOP_PRE_SIGTERM
,
1503 SOCKET_STOP_PRE_SIGKILL
)) {
1504 r
= socket_open_fds(s
);
1509 if (s
->deserialized_state
== SOCKET_LISTENING
) {
1510 r
= socket_watch_fds(s
);
1515 socket_set_state(s
, s
->deserialized_state
);
1519 static int socket_spawn(Socket
*s
, ExecCommand
*c
, pid_t
*_pid
) {
1520 _cleanup_free_
char **argv
= NULL
;
1523 ExecParameters exec_params
= {
1524 .apply_permissions
= true,
1525 .apply_chroot
= true,
1526 .apply_tty_stdin
= true,
1527 .bus_endpoint_fd
= -1,
1537 (void) unit_realize_cgroup(UNIT(s
));
1538 if (s
->reset_cpu_usage
) {
1539 (void) unit_reset_cpu_usage(UNIT(s
));
1540 s
->reset_cpu_usage
= false;
1543 r
= unit_setup_exec_runtime(UNIT(s
));
1547 r
= socket_arm_timer(s
);
1551 r
= unit_full_printf_strv(UNIT(s
), c
->argv
, &argv
);
1555 exec_params
.argv
= argv
;
1556 exec_params
.environment
= UNIT(s
)->manager
->environment
;
1557 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
1558 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
1559 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
1560 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
1561 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
1563 r
= exec_spawn(UNIT(s
),
1572 r
= unit_watch_pid(UNIT(s
), pid
);
1574 /* FIXME: we need to do something here */
1581 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1585 static int socket_chown(Socket
*s
, pid_t
*_pid
) {
1589 r
= socket_arm_timer(s
);
1593 /* We have to resolve the user names out-of-process, hence
1594 * let's fork here. It's messy, but well, what can we do? */
1602 uid_t uid
= UID_INVALID
;
1603 gid_t gid
= GID_INVALID
;
1606 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
1607 (void) ignore_signals(SIGPIPE
, -1);
1610 if (!isempty(s
->user
)) {
1611 const char *user
= s
->user
;
1613 r
= get_user_creds(&user
, &uid
, &gid
, NULL
, NULL
);
1620 if (!isempty(s
->group
)) {
1621 const char *group
= s
->group
;
1623 r
= get_group_creds(&group
, &gid
);
1630 LIST_FOREACH(port
, p
, s
->ports
) {
1631 const char *path
= NULL
;
1633 if (p
->type
== SOCKET_SOCKET
)
1634 path
= socket_address_get_path(&p
->address
);
1635 else if (p
->type
== SOCKET_FIFO
)
1641 if (chown(path
, uid
, gid
) < 0) {
1652 log_error_errno(r
, "Failed to chown socket at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
1657 r
= unit_watch_pid(UNIT(s
), pid
);
1665 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
1669 static void socket_enter_dead(Socket
*s
, SocketResult f
) {
1672 if (f
!= SOCKET_SUCCESS
)
1675 exec_runtime_destroy(s
->exec_runtime
);
1676 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
1678 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
1680 socket_set_state(s
, s
->result
!= SOCKET_SUCCESS
? SOCKET_FAILED
: SOCKET_DEAD
);
1683 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
);
1685 static void socket_enter_stop_post(Socket
*s
, SocketResult f
) {
1689 if (f
!= SOCKET_SUCCESS
)
1692 socket_unwatch_control_pid(s
);
1693 s
->control_command_id
= SOCKET_EXEC_STOP_POST
;
1694 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_POST
];
1696 if (s
->control_command
) {
1697 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1701 socket_set_state(s
, SOCKET_STOP_POST
);
1703 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_SUCCESS
);
1708 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-post' task: %m");
1709 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
1712 static void socket_enter_signal(Socket
*s
, SocketState state
, SocketResult f
) {
1717 if (f
!= SOCKET_SUCCESS
)
1720 r
= unit_kill_context(
1723 (state
!= SOCKET_STOP_PRE_SIGTERM
&& state
!= SOCKET_FINAL_SIGTERM
) ?
1724 KILL_KILL
: KILL_TERMINATE
,
1732 r
= socket_arm_timer(s
);
1736 socket_set_state(s
, state
);
1737 } else if (state
== SOCKET_STOP_PRE_SIGTERM
)
1738 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_SUCCESS
);
1739 else if (state
== SOCKET_STOP_PRE_SIGKILL
)
1740 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1741 else if (state
== SOCKET_FINAL_SIGTERM
)
1742 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_SUCCESS
);
1744 socket_enter_dead(s
, SOCKET_SUCCESS
);
1749 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
1751 if (state
== SOCKET_STOP_PRE_SIGTERM
|| state
== SOCKET_STOP_PRE_SIGKILL
)
1752 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1754 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1757 static void socket_enter_stop_pre(Socket
*s
, SocketResult f
) {
1761 if (f
!= SOCKET_SUCCESS
)
1764 socket_unwatch_control_pid(s
);
1765 s
->control_command_id
= SOCKET_EXEC_STOP_PRE
;
1766 s
->control_command
= s
->exec_command
[SOCKET_EXEC_STOP_PRE
];
1768 if (s
->control_command
) {
1769 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1773 socket_set_state(s
, SOCKET_STOP_PRE
);
1775 socket_enter_stop_post(s
, SOCKET_SUCCESS
);
1780 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'stop-pre' task: %m");
1781 socket_enter_stop_post(s
, SOCKET_FAILURE_RESOURCES
);
1784 static void socket_enter_listening(Socket
*s
) {
1788 r
= socket_watch_fds(s
);
1790 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1794 socket_set_state(s
, SOCKET_LISTENING
);
1798 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1801 static void socket_enter_start_post(Socket
*s
) {
1805 socket_unwatch_control_pid(s
);
1806 s
->control_command_id
= SOCKET_EXEC_START_POST
;
1807 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_POST
];
1809 if (s
->control_command
) {
1810 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1812 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-post' task: %m");
1816 socket_set_state(s
, SOCKET_START_POST
);
1818 socket_enter_listening(s
);
1823 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1826 static void socket_enter_start_chown(Socket
*s
) {
1831 r
= socket_open_fds(s
);
1833 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1837 if (!isempty(s
->user
) || !isempty(s
->group
)) {
1839 socket_unwatch_control_pid(s
);
1840 s
->control_command_id
= SOCKET_EXEC_START_CHOWN
;
1841 s
->control_command
= NULL
;
1843 r
= socket_chown(s
, &s
->control_pid
);
1845 log_unit_warning_errno(UNIT(s
), r
, "Failed to fork 'start-chown' task: %m");
1849 socket_set_state(s
, SOCKET_START_CHOWN
);
1851 socket_enter_start_post(s
);
1856 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1859 static void socket_enter_start_pre(Socket
*s
) {
1863 socket_unwatch_control_pid(s
);
1864 s
->control_command_id
= SOCKET_EXEC_START_PRE
;
1865 s
->control_command
= s
->exec_command
[SOCKET_EXEC_START_PRE
];
1867 if (s
->control_command
) {
1868 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
1870 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'start-pre' task: %m");
1874 socket_set_state(s
, SOCKET_START_PRE
);
1876 socket_enter_start_chown(s
);
1881 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
1884 static void socket_enter_running(Socket
*s
, int cfd
) {
1885 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
1890 /* We don't take connections anymore if we are supposed to
1891 * shut down anyway */
1892 if (unit_stop_pending(UNIT(s
))) {
1894 log_unit_debug(UNIT(s
), "Suppressing connection request since unit stop is scheduled.");
1899 /* Flush all sockets by closing and reopening them */
1900 socket_close_fds(s
);
1902 r
= socket_open_fds(s
);
1904 log_unit_warning_errno(UNIT(s
), r
, "Failed to listen on sockets: %m");
1905 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1909 r
= socket_watch_fds(s
);
1911 log_unit_warning_errno(UNIT(s
), r
, "Failed to watch sockets: %m");
1912 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
1922 bool pending
= false;
1924 /* If there's already a start pending don't bother to
1926 SET_FOREACH(other
, UNIT(s
)->dependencies
[UNIT_TRIGGERS
], i
)
1927 if (unit_active_or_pending(other
)) {
1933 if (!UNIT_ISSET(s
->service
)) {
1934 log_unit_error(UNIT(s
), "Service to activate vanished, refusing activation.");
1939 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT_DEREF(s
->service
), JOB_REPLACE
, &error
, NULL
);
1944 socket_set_state(s
, SOCKET_RUNNING
);
1946 _cleanup_free_
char *prefix
= NULL
, *instance
= NULL
, *name
= NULL
;
1949 if (s
->n_connections
>= s
->max_connections
) {
1950 log_unit_warning(UNIT(s
), "Too many incoming connections (%u)", s
->n_connections
);
1955 r
= socket_instantiate_service(s
);
1959 r
= instance_from_socket(cfd
, s
->n_accepted
, &instance
);
1964 /* ENOTCONN is legitimate if TCP RST was received.
1965 * This connection is over, but the socket unit lives on. */
1970 r
= unit_name_to_prefix(UNIT(s
)->id
, &prefix
);
1974 r
= unit_name_build(prefix
, instance
, ".service", &name
);
1978 r
= unit_add_name(UNIT_DEREF(s
->service
), name
);
1982 service
= SERVICE(UNIT_DEREF(s
->service
));
1983 unit_ref_unset(&s
->service
);
1986 UNIT(service
)->no_gc
= false;
1988 unit_choose_id(UNIT(service
), name
);
1990 r
= service_set_socket_fd(service
, cfd
, s
, s
->selinux_context_from_net
);
1995 s
->n_connections
++;
1997 r
= manager_add_job(UNIT(s
)->manager
, JOB_START
, UNIT(service
), JOB_REPLACE
, &error
, NULL
);
2001 /* Notify clients about changed counters */
2002 unit_add_to_dbus_queue(UNIT(s
));
2008 log_unit_warning(UNIT(s
), "Failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
2009 cfd
>= 0 ? "template" : "non-template",
2010 bus_error_message(&error
, r
));
2012 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2016 static void socket_run_next(Socket
*s
) {
2020 assert(s
->control_command
);
2021 assert(s
->control_command
->command_next
);
2023 socket_unwatch_control_pid(s
);
2025 s
->control_command
= s
->control_command
->command_next
;
2027 r
= socket_spawn(s
, s
->control_command
, &s
->control_pid
);
2034 log_unit_warning_errno(UNIT(s
), r
, "Failed to run next task: %m");
2036 if (s
->state
== SOCKET_START_POST
)
2037 socket_enter_stop_pre(s
, SOCKET_FAILURE_RESOURCES
);
2038 else if (s
->state
== SOCKET_STOP_POST
)
2039 socket_enter_dead(s
, SOCKET_FAILURE_RESOURCES
);
2041 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_RESOURCES
);
2044 static int socket_start(Unit
*u
) {
2045 Socket
*s
= SOCKET(u
);
2049 /* We cannot fulfill this request right now, try again later
2051 if (IN_SET(s
->state
,
2053 SOCKET_STOP_PRE_SIGKILL
,
2054 SOCKET_STOP_PRE_SIGTERM
,
2056 SOCKET_FINAL_SIGTERM
,
2057 SOCKET_FINAL_SIGKILL
))
2060 /* Already on it! */
2061 if (IN_SET(s
->state
,
2067 /* Cannot run this without the service being around */
2068 if (UNIT_ISSET(s
->service
)) {
2071 service
= SERVICE(UNIT_DEREF(s
->service
));
2073 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
2074 log_unit_error(u
, "Socket service %s not loaded, refusing.", UNIT(service
)->id
);
2078 /* If the service is already active we cannot start the
2080 if (service
->state
!= SERVICE_DEAD
&&
2081 service
->state
!= SERVICE_FAILED
&&
2082 service
->state
!= SERVICE_AUTO_RESTART
) {
2083 log_unit_error(u
, "Socket service %s already active, refusing.", UNIT(service
)->id
);
2088 assert(s
->state
== SOCKET_DEAD
|| s
->state
== SOCKET_FAILED
);
2090 s
->result
= SOCKET_SUCCESS
;
2091 s
->reset_cpu_usage
= true;
2093 socket_enter_start_pre(s
);
2098 static int socket_stop(Unit
*u
) {
2099 Socket
*s
= SOCKET(u
);
2104 if (IN_SET(s
->state
,
2106 SOCKET_STOP_PRE_SIGTERM
,
2107 SOCKET_STOP_PRE_SIGKILL
,
2109 SOCKET_FINAL_SIGTERM
,
2110 SOCKET_FINAL_SIGKILL
))
2113 /* If there's already something running we go directly into
2115 if (IN_SET(s
->state
,
2118 SOCKET_START_POST
)) {
2119 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_SUCCESS
);
2123 assert(s
->state
== SOCKET_LISTENING
|| s
->state
== SOCKET_RUNNING
);
2125 socket_enter_stop_pre(s
, SOCKET_SUCCESS
);
2129 static int socket_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2130 Socket
*s
= SOCKET(u
);
2138 unit_serialize_item(u
, f
, "state", socket_state_to_string(s
->state
));
2139 unit_serialize_item(u
, f
, "result", socket_result_to_string(s
->result
));
2140 unit_serialize_item_format(u
, f
, "n-accepted", "%u", s
->n_accepted
);
2142 if (s
->control_pid
> 0)
2143 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
2145 if (s
->control_command_id
>= 0)
2146 unit_serialize_item(u
, f
, "control-command", socket_exec_command_to_string(s
->control_command_id
));
2148 LIST_FOREACH(port
, p
, s
->ports
) {
2154 copy
= fdset_put_dup(fds
, p
->fd
);
2158 if (p
->type
== SOCKET_SOCKET
) {
2159 _cleanup_free_
char *t
= NULL
;
2161 r
= socket_address_print(&p
->address
, &t
);
2165 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2166 unit_serialize_item_format(u
, f
, "netlink", "%i %s", copy
, t
);
2168 unit_serialize_item_format(u
, f
, "socket", "%i %i %s", copy
, p
->address
.type
, t
);
2170 } else if (p
->type
== SOCKET_SPECIAL
)
2171 unit_serialize_item_format(u
, f
, "special", "%i %s", copy
, p
->path
);
2172 else if (p
->type
== SOCKET_MQUEUE
)
2173 unit_serialize_item_format(u
, f
, "mqueue", "%i %s", copy
, p
->path
);
2174 else if (p
->type
== SOCKET_USB_FUNCTION
)
2175 unit_serialize_item_format(u
, f
, "ffs", "%i %s", copy
, p
->path
);
2177 assert(p
->type
== SOCKET_FIFO
);
2178 unit_serialize_item_format(u
, f
, "fifo", "%i %s", copy
, p
->path
);
2185 static int socket_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
2186 Socket
*s
= SOCKET(u
);
2192 if (streq(key
, "state")) {
2195 state
= socket_state_from_string(value
);
2197 log_unit_debug(u
, "Failed to parse state value: %s", value
);
2199 s
->deserialized_state
= state
;
2200 } else if (streq(key
, "result")) {
2203 f
= socket_result_from_string(value
);
2205 log_unit_debug(u
, "Failed to parse result value: %s", value
);
2206 else if (f
!= SOCKET_SUCCESS
)
2209 } else if (streq(key
, "n-accepted")) {
2212 if (safe_atou(value
, &k
) < 0)
2213 log_unit_debug(u
, "Failed to parse n-accepted value: %s", value
);
2216 } else if (streq(key
, "control-pid")) {
2219 if (parse_pid(value
, &pid
) < 0)
2220 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
2222 s
->control_pid
= pid
;
2223 } else if (streq(key
, "control-command")) {
2224 SocketExecCommand id
;
2226 id
= socket_exec_command_from_string(value
);
2228 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
2230 s
->control_command_id
= id
;
2231 s
->control_command
= s
->exec_command
[id
];
2233 } else if (streq(key
, "fifo")) {
2237 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2238 log_unit_debug(u
, "Failed to parse fifo value: %s", value
);
2241 LIST_FOREACH(port
, p
, s
->ports
)
2242 if (p
->type
== SOCKET_FIFO
&&
2243 path_equal_or_files_same(p
->path
, value
+skip
))
2248 p
->fd
= fdset_remove(fds
, fd
);
2252 } else if (streq(key
, "special")) {
2256 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2257 log_unit_debug(u
, "Failed to parse special value: %s", value
);
2260 LIST_FOREACH(port
, p
, s
->ports
)
2261 if (p
->type
== SOCKET_SPECIAL
&&
2262 path_equal_or_files_same(p
->path
, value
+skip
))
2267 p
->fd
= fdset_remove(fds
, fd
);
2271 } else if (streq(key
, "mqueue")) {
2275 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2276 log_unit_debug(u
, "Failed to parse mqueue value: %s", value
);
2279 LIST_FOREACH(port
, p
, s
->ports
)
2280 if (p
->type
== SOCKET_MQUEUE
&&
2281 streq(p
->path
, value
+skip
))
2286 p
->fd
= fdset_remove(fds
, fd
);
2290 } else if (streq(key
, "socket")) {
2291 int fd
, type
, skip
= 0;
2294 if (sscanf(value
, "%i %i %n", &fd
, &type
, &skip
) < 2 || fd
< 0 || type
< 0 || !fdset_contains(fds
, fd
))
2295 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2298 LIST_FOREACH(port
, p
, s
->ports
)
2299 if (socket_address_is(&p
->address
, value
+skip
, type
))
2304 p
->fd
= fdset_remove(fds
, fd
);
2308 } else if (streq(key
, "netlink")) {
2312 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2313 log_unit_debug(u
, "Failed to parse socket value: %s", value
);
2316 LIST_FOREACH(port
, p
, s
->ports
)
2317 if (socket_address_is_netlink(&p
->address
, value
+skip
))
2322 p
->fd
= fdset_remove(fds
, fd
);
2326 } else if (streq(key
, "ffs")) {
2330 if (sscanf(value
, "%i %n", &fd
, &skip
) < 1 || fd
< 0 || !fdset_contains(fds
, fd
))
2331 log_unit_debug(u
, "Failed to parse ffs value: %s", value
);
2334 LIST_FOREACH(port
, p
, s
->ports
)
2335 if (p
->type
== SOCKET_USB_FUNCTION
&&
2336 path_equal_or_files_same(p
->path
, value
+skip
))
2341 p
->fd
= fdset_remove(fds
, fd
);
2346 log_unit_debug(UNIT(s
), "Unknown serialization key: %s", key
);
2351 static void socket_distribute_fds(Unit
*u
, FDSet
*fds
) {
2352 Socket
*s
= SOCKET(u
);
2357 LIST_FOREACH(port
, p
, s
->ports
) {
2361 if (p
->type
!= SOCKET_SOCKET
)
2367 FDSET_FOREACH(fd
, fds
, i
) {
2368 if (socket_address_matches_fd(&p
->address
, fd
)) {
2369 p
->fd
= fdset_remove(fds
, fd
);
2370 s
->deserialized_state
= SOCKET_LISTENING
;
2377 _pure_
static UnitActiveState
socket_active_state(Unit
*u
) {
2380 return state_translation_table
[SOCKET(u
)->state
];
2383 _pure_
static const char *socket_sub_state_to_string(Unit
*u
) {
2386 return socket_state_to_string(SOCKET(u
)->state
);
2389 const char* socket_port_type_to_string(SocketPort
*p
) {
2397 switch (p
->address
.type
) {
2405 case SOCK_SEQPACKET
:
2406 return "SequentialPacket";
2409 if (socket_address_family(&p
->address
) == AF_NETLINK
)
2416 case SOCKET_SPECIAL
:
2420 return "MessageQueue";
2425 case SOCKET_USB_FUNCTION
:
2426 return "USBFunction";
2433 _pure_
static bool socket_check_gc(Unit
*u
) {
2434 Socket
*s
= SOCKET(u
);
2438 return s
->n_connections
> 0;
2441 static int socket_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
2442 SocketPort
*p
= userdata
;
2448 if (p
->socket
->state
!= SOCKET_LISTENING
)
2451 log_unit_debug(UNIT(p
->socket
), "Incoming traffic");
2453 if (revents
!= EPOLLIN
) {
2455 if (revents
& EPOLLHUP
)
2456 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.");
2458 log_unit_error(UNIT(p
->socket
), "Got unexpected poll event (0x%x) on socket.", revents
);
2462 if (p
->socket
->accept
&&
2463 p
->type
== SOCKET_SOCKET
&&
2464 socket_address_can_accept(&p
->address
)) {
2468 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
);
2474 log_unit_error_errno(UNIT(p
->socket
), errno
, "Failed to accept socket: %m");
2481 socket_apply_socket_options(p
->socket
, cfd
);
2484 socket_enter_running(p
->socket
, cfd
);
2488 socket_enter_stop_pre(p
->socket
, SOCKET_FAILURE_RESOURCES
);
2492 static void socket_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
2493 Socket
*s
= SOCKET(u
);
2499 if (pid
!= s
->control_pid
)
2504 if (is_clean_exit(code
, status
, NULL
))
2506 else if (code
== CLD_EXITED
)
2507 f
= SOCKET_FAILURE_EXIT_CODE
;
2508 else if (code
== CLD_KILLED
)
2509 f
= SOCKET_FAILURE_SIGNAL
;
2510 else if (code
== CLD_DUMPED
)
2511 f
= SOCKET_FAILURE_CORE_DUMP
;
2513 assert_not_reached("Unknown sigchld code");
2515 if (s
->control_command
) {
2516 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
2518 if (s
->control_command
->ignore
)
2522 log_unit_full(u
, f
== SOCKET_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
2523 "Control process exited, code=%s status=%i",
2524 sigchld_code_to_string(code
), status
);
2526 if (f
!= SOCKET_SUCCESS
)
2529 if (s
->control_command
&&
2530 s
->control_command
->command_next
&&
2531 f
== SOCKET_SUCCESS
) {
2533 log_unit_debug(u
, "Running next command for state %s", socket_state_to_string(s
->state
));
2536 s
->control_command
= NULL
;
2537 s
->control_command_id
= _SOCKET_EXEC_COMMAND_INVALID
;
2539 /* No further commands for this step, so let's figure
2540 * out what to do next */
2542 log_unit_debug(u
, "Got final SIGCHLD for state %s", socket_state_to_string(s
->state
));
2546 case SOCKET_START_PRE
:
2547 if (f
== SOCKET_SUCCESS
)
2548 socket_enter_start_chown(s
);
2550 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, f
);
2553 case SOCKET_START_CHOWN
:
2554 if (f
== SOCKET_SUCCESS
)
2555 socket_enter_start_post(s
);
2557 socket_enter_stop_pre(s
, f
);
2560 case SOCKET_START_POST
:
2561 if (f
== SOCKET_SUCCESS
)
2562 socket_enter_listening(s
);
2564 socket_enter_stop_pre(s
, f
);
2567 case SOCKET_STOP_PRE
:
2568 case SOCKET_STOP_PRE_SIGTERM
:
2569 case SOCKET_STOP_PRE_SIGKILL
:
2570 socket_enter_stop_post(s
, f
);
2573 case SOCKET_STOP_POST
:
2574 case SOCKET_FINAL_SIGTERM
:
2575 case SOCKET_FINAL_SIGKILL
:
2576 socket_enter_dead(s
, f
);
2580 assert_not_reached("Uh, control process died at wrong time.");
2584 /* Notify clients about changed exit status */
2585 unit_add_to_dbus_queue(u
);
2588 static int socket_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
2589 Socket
*s
= SOCKET(userdata
);
2592 assert(s
->timer_event_source
== source
);
2596 case SOCKET_START_PRE
:
2597 log_unit_warning(UNIT(s
), "Starting timed out. Terminating.");
2598 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2601 case SOCKET_START_CHOWN
:
2602 case SOCKET_START_POST
:
2603 log_unit_warning(UNIT(s
), "Starting timed out. Stopping.");
2604 socket_enter_stop_pre(s
, SOCKET_FAILURE_TIMEOUT
);
2607 case SOCKET_STOP_PRE
:
2608 log_unit_warning(UNIT(s
), "Stopping timed out. Terminating.");
2609 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2612 case SOCKET_STOP_PRE_SIGTERM
:
2613 if (s
->kill_context
.send_sigkill
) {
2614 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
2615 socket_enter_signal(s
, SOCKET_STOP_PRE_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2617 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL. Ignoring.");
2618 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2622 case SOCKET_STOP_PRE_SIGKILL
:
2623 log_unit_warning(UNIT(s
), "Processes still around after SIGKILL. Ignoring.");
2624 socket_enter_stop_post(s
, SOCKET_FAILURE_TIMEOUT
);
2627 case SOCKET_STOP_POST
:
2628 log_unit_warning(UNIT(s
), "Stopping timed out (2). Terminating.");
2629 socket_enter_signal(s
, SOCKET_FINAL_SIGTERM
, SOCKET_FAILURE_TIMEOUT
);
2632 case SOCKET_FINAL_SIGTERM
:
2633 if (s
->kill_context
.send_sigkill
) {
2634 log_unit_warning(UNIT(s
), "Stopping timed out (2). Killing.");
2635 socket_enter_signal(s
, SOCKET_FINAL_SIGKILL
, SOCKET_FAILURE_TIMEOUT
);
2637 log_unit_warning(UNIT(s
), "Stopping timed out (2). Skipping SIGKILL. Ignoring.");
2638 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2642 case SOCKET_FINAL_SIGKILL
:
2643 log_unit_warning(UNIT(s
), "Still around after SIGKILL (2). Entering failed mode.");
2644 socket_enter_dead(s
, SOCKET_FAILURE_TIMEOUT
);
2648 assert_not_reached("Timeout at wrong time.");
2654 int socket_collect_fds(Socket
*s
, int **fds
) {
2655 int *rfds
, k
= 0, n
= 0;
2661 /* Called from the service code for requesting our fds */
2663 LIST_FOREACH(port
, p
, s
->ports
) {
2666 n
+= p
->n_auxiliary_fds
;
2678 LIST_FOREACH(port
, p
, s
->ports
) {
2683 for (i
= 0; i
< p
->n_auxiliary_fds
; ++i
)
2684 rfds
[k
++] = p
->auxiliary_fds
[i
];
2693 static void socket_reset_failed(Unit
*u
) {
2694 Socket
*s
= SOCKET(u
);
2698 if (s
->state
== SOCKET_FAILED
)
2699 socket_set_state(s
, SOCKET_DEAD
);
2701 s
->result
= SOCKET_SUCCESS
;
2704 static void socket_notify_service_dead(Socket
*s
, bool failed_permanent
) {
2707 /* The service is dead. Dang!
2709 * This is strictly for one-instance-for-all-connections
2712 if (s
->state
== SOCKET_RUNNING
) {
2713 log_unit_debug(UNIT(s
), "Got notified about service death (failed permanently: %s)", yes_no(failed_permanent
));
2714 if (failed_permanent
)
2715 socket_enter_stop_pre(s
, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
);
2717 socket_enter_listening(s
);
2721 void socket_connection_unref(Socket
*s
) {
2724 /* The service is dead. Yay!
2726 * This is strictly for one-instance-per-connection
2729 assert(s
->n_connections
> 0);
2732 log_unit_debug(UNIT(s
), "One connection closed, %u left.", s
->n_connections
);
2735 static void socket_trigger_notify(Unit
*u
, Unit
*other
) {
2736 Socket
*s
= SOCKET(u
);
2742 /* Don't propagate state changes from the service if we are
2743 already down or accepting connections */
2744 if ((s
->state
!= SOCKET_RUNNING
&&
2745 s
->state
!= SOCKET_LISTENING
) ||
2749 if (other
->load_state
!= UNIT_LOADED
||
2750 other
->type
!= UNIT_SERVICE
)
2753 se
= SERVICE(other
);
2755 if (se
->state
== SERVICE_FAILED
)
2756 socket_notify_service_dead(s
, se
->result
== SERVICE_FAILURE_START_LIMIT
);
2758 if (se
->state
== SERVICE_DEAD
||
2759 se
->state
== SERVICE_FINAL_SIGTERM
||
2760 se
->state
== SERVICE_FINAL_SIGKILL
||
2761 se
->state
== SERVICE_AUTO_RESTART
)
2762 socket_notify_service_dead(s
, false);
2764 if (se
->state
== SERVICE_RUNNING
)
2765 socket_set_state(s
, SOCKET_RUNNING
);
2768 static int socket_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
2769 return unit_kill_common(u
, who
, signo
, -1, SOCKET(u
)->control_pid
, error
);
2772 static int socket_get_timeout(Unit
*u
, uint64_t *timeout
) {
2773 Socket
*s
= SOCKET(u
);
2776 if (!s
->timer_event_source
)
2779 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
2786 char *socket_fdname(Socket
*s
) {
2789 /* Returns the name to use for $LISTEN_NAMES. If the user
2790 * didn't specify anything specifically, use the socket unit's
2791 * name as fallback. */
2799 static const char* const socket_exec_command_table
[_SOCKET_EXEC_COMMAND_MAX
] = {
2800 [SOCKET_EXEC_START_PRE
] = "StartPre",
2801 [SOCKET_EXEC_START_CHOWN
] = "StartChown",
2802 [SOCKET_EXEC_START_POST
] = "StartPost",
2803 [SOCKET_EXEC_STOP_PRE
] = "StopPre",
2804 [SOCKET_EXEC_STOP_POST
] = "StopPost"
2807 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command
, SocketExecCommand
);
2809 static const char* const socket_result_table
[_SOCKET_RESULT_MAX
] = {
2810 [SOCKET_SUCCESS
] = "success",
2811 [SOCKET_FAILURE_RESOURCES
] = "resources",
2812 [SOCKET_FAILURE_TIMEOUT
] = "timeout",
2813 [SOCKET_FAILURE_EXIT_CODE
] = "exit-code",
2814 [SOCKET_FAILURE_SIGNAL
] = "signal",
2815 [SOCKET_FAILURE_CORE_DUMP
] = "core-dump",
2816 [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent"
2819 DEFINE_STRING_TABLE_LOOKUP(socket_result
, SocketResult
);
2821 const UnitVTable socket_vtable
= {
2822 .object_size
= sizeof(Socket
),
2823 .exec_context_offset
= offsetof(Socket
, exec_context
),
2824 .cgroup_context_offset
= offsetof(Socket
, cgroup_context
),
2825 .kill_context_offset
= offsetof(Socket
, kill_context
),
2826 .exec_runtime_offset
= offsetof(Socket
, exec_runtime
),
2832 .private_section
= "Socket",
2834 .init
= socket_init
,
2835 .done
= socket_done
,
2836 .load
= socket_load
,
2838 .coldplug
= socket_coldplug
,
2840 .dump
= socket_dump
,
2842 .start
= socket_start
,
2843 .stop
= socket_stop
,
2845 .kill
= socket_kill
,
2847 .get_timeout
= socket_get_timeout
,
2849 .serialize
= socket_serialize
,
2850 .deserialize_item
= socket_deserialize_item
,
2851 .distribute_fds
= socket_distribute_fds
,
2853 .active_state
= socket_active_state
,
2854 .sub_state_to_string
= socket_sub_state_to_string
,
2856 .check_gc
= socket_check_gc
,
2858 .sigchld_event
= socket_sigchld_event
,
2860 .trigger_notify
= socket_trigger_notify
,
2862 .reset_failed
= socket_reset_failed
,
2864 .bus_vtable
= bus_socket_vtable
,
2865 .bus_set_property
= bus_socket_set_property
,
2866 .bus_commit_properties
= bus_socket_commit_properties
,
2868 .status_message_formats
= {
2869 /*.starting_stopping = {
2870 [0] = "Starting socket %s...",
2871 [1] = "Stopping socket %s...",
2873 .finished_start_job
= {
2874 [JOB_DONE
] = "Listening on %s.",
2875 [JOB_FAILED
] = "Failed to listen on %s.",
2876 [JOB_TIMEOUT
] = "Timed out starting %s.",
2878 .finished_stop_job
= {
2879 [JOB_DONE
] = "Closed %s.",
2880 [JOB_FAILED
] = "Failed stopping %s.",
2881 [JOB_TIMEOUT
] = "Timed out stopping %s.",