1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
5 #include "core-forward.h"
9 #include "socket-util.h"
12 typedef enum SocketExecCommand
{
13 SOCKET_EXEC_START_PRE
,
14 SOCKET_EXEC_START_CHOWN
,
15 SOCKET_EXEC_START_POST
,
17 SOCKET_EXEC_STOP_POST
,
18 _SOCKET_EXEC_COMMAND_MAX
,
19 _SOCKET_EXEC_COMMAND_INVALID
= -EINVAL
,
22 typedef enum SocketType
{
29 _SOCKET_TYPE_INVALID
= -EINVAL
,
32 typedef enum SocketResult
{
34 SOCKET_FAILURE_RESOURCES
,
35 SOCKET_FAILURE_TIMEOUT
,
36 SOCKET_FAILURE_EXIT_CODE
,
37 SOCKET_FAILURE_SIGNAL
,
38 SOCKET_FAILURE_CORE_DUMP
,
39 SOCKET_FAILURE_START_LIMIT_HIT
,
40 SOCKET_FAILURE_TRIGGER_LIMIT_HIT
,
41 SOCKET_FAILURE_SERVICE_START_LIMIT_HIT
,
43 _SOCKET_RESULT_INVALID
= -EINVAL
,
46 typedef struct SocketPort
{
52 size_t n_auxiliary_fds
;
54 SocketAddress address
;
56 sd_event_source
*event_source
;
58 LIST_FIELDS(struct SocketPort
, port
);
61 typedef enum SocketTimestamping
{
62 SOCKET_TIMESTAMPING_OFF
,
63 SOCKET_TIMESTAMPING_US
, /* SO_TIMESTAMP */
64 SOCKET_TIMESTAMPING_NS
, /* SO_TIMESTAMPNS */
65 _SOCKET_TIMESTAMPING_MAX
,
66 _SOCKET_TIMESTAMPING_INVALID
= -EINVAL
,
69 typedef enum SocketDeferTrigger
{
74 _SOCKET_DEFER_INVALID
= -EINVAL
,
77 typedef struct Socket
{
80 LIST_HEAD(SocketPort
, ports
);
82 Set
*peers_by_address
;
85 unsigned n_connections
;
87 unsigned max_connections
;
88 unsigned max_connections_per_source
;
91 unsigned keep_alive_cnt
;
93 usec_t keep_alive_time
;
94 usec_t keep_alive_interval
;
97 ExecCommand
*exec_command
[_SOCKET_EXEC_COMMAND_MAX
];
98 ExecContext exec_context
;
99 KillContext kill_context
;
100 CGroupContext cgroup_context
;
102 ExecRuntime
*exec_runtime
;
103 CGroupRuntime
*cgroup_runtime
;
105 /* For Accept=no sockets refers to the one service we'll
106 * activate. For Accept=yes sockets is either NULL, or filled
107 * to refer to the next service we spawn. */
110 SocketState state
, deserialized_state
;
112 sd_event_source
*timer_event_source
;
114 ExecCommand
*control_command
;
115 SocketExecCommand control_command_id
;
118 bool pass_fds_to_exec
;
120 mode_t directory_mode
;
124 SocketResult clean_result
;
146 SocketTimestamping timestamping
;
148 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
149 SocketAddressBindIPv6Only bind_ipv6_only
;
153 size_t receive_buffer
;
158 char *bind_to_device
;
159 char *tcp_congestion
;
168 bool selinux_context_from_net
;
174 RateLimit trigger_limit
;
175 RateLimit poll_limit
;
177 usec_t defer_trigger_max_usec
;
178 SocketDeferTrigger defer_trigger
;
181 SocketPeer
*socket_peer_ref(SocketPeer
*p
);
182 SocketPeer
*socket_peer_unref(SocketPeer
*p
);
183 int socket_acquire_peer(Socket
*s
, int fd
, SocketPeer
**p
);
185 DEFINE_TRIVIAL_CLEANUP_FUNC(SocketPeer
*, socket_peer_unref
);
187 /* Called from the service code when collecting fds */
188 int socket_collect_fds(Socket
*s
, int **ret
);
190 /* Called from the service code when a per-connection service ended */
191 void socket_connection_unref(Socket
*s
);
193 SocketPort
* socket_port_free(SocketPort
*p
);
194 DEFINE_TRIVIAL_CLEANUP_FUNC(SocketPort
*, socket_port_free
);
196 void socket_free_ports(Socket
*s
);
198 int socket_port_to_address(const SocketPort
*s
, char **ret
);
200 int socket_load_service_unit(Socket
*s
, int cfd
, Unit
**ret
);
202 const char* socket_fdname(Socket
*s
);
204 extern const UnitVTable socket_vtable
;
206 const char* socket_exec_command_to_string(SocketExecCommand i
) _const_
;
207 SocketExecCommand
socket_exec_command_from_string(const char *s
) _pure_
;
209 const char* socket_result_to_string(SocketResult i
) _const_
;
210 SocketResult
socket_result_from_string(const char *s
) _pure_
;
212 const char* socket_port_type_to_string(SocketPort
*p
) _pure_
;
213 SocketType
socket_port_type_from_string(const char *p
) _pure_
;
215 const char* socket_timestamping_to_string(SocketTimestamping p
) _const_
;
216 SocketTimestamping
socket_timestamping_from_string(const char *p
) _pure_
;
217 SocketTimestamping
socket_timestamping_from_string_harder(const char *p
) _pure_
;
219 const char* socket_defer_trigger_to_string(SocketDeferTrigger i
) _const_
;
220 SocketDeferTrigger
socket_defer_trigger_from_string(const char *s
) _pure_
;
222 DEFINE_CAST(SOCKET
, Socket
);