1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 This file is part of systemd.
7 Copyright 2010 Lennart Poettering
10 typedef struct Socket Socket
;
11 typedef struct SocketPeer SocketPeer
;
15 #include "socket-util.h"
18 typedef enum SocketExecCommand
{
19 SOCKET_EXEC_START_PRE
,
20 SOCKET_EXEC_START_CHOWN
,
21 SOCKET_EXEC_START_POST
,
23 SOCKET_EXEC_STOP_POST
,
24 _SOCKET_EXEC_COMMAND_MAX
,
25 _SOCKET_EXEC_COMMAND_INVALID
= -1
28 typedef enum SocketType
{
35 _SOCKET_TYPE_INVALID
= -1
38 typedef enum SocketResult
{
40 SOCKET_FAILURE_RESOURCES
,
41 SOCKET_FAILURE_TIMEOUT
,
42 SOCKET_FAILURE_EXIT_CODE
,
43 SOCKET_FAILURE_SIGNAL
,
44 SOCKET_FAILURE_CORE_DUMP
,
45 SOCKET_FAILURE_START_LIMIT_HIT
,
46 SOCKET_FAILURE_TRIGGER_LIMIT_HIT
,
47 SOCKET_FAILURE_SERVICE_START_LIMIT_HIT
,
49 _SOCKET_RESULT_INVALID
= -1
52 typedef struct SocketPort
{
58 size_t n_auxiliary_fds
;
60 SocketAddress address
;
62 sd_event_source
*event_source
;
64 LIST_FIELDS(struct SocketPort
, port
);
70 LIST_HEAD(SocketPort
, ports
);
72 Set
*peers_by_address
;
75 unsigned n_connections
;
76 unsigned max_connections
;
77 unsigned max_connections_per_source
;
80 unsigned keep_alive_cnt
;
82 usec_t keep_alive_time
;
83 usec_t keep_alive_interval
;
86 ExecCommand
* exec_command
[_SOCKET_EXEC_COMMAND_MAX
];
87 ExecContext exec_context
;
88 KillContext kill_context
;
89 CGroupContext cgroup_context
;
91 ExecRuntime
*exec_runtime
;
92 DynamicCreds dynamic_creds
;
94 /* For Accept=no sockets refers to the one service we'll
95 * activate. For Accept=yes sockets is either NULL, or filled
96 * to refer to the next service we spawn. */
99 SocketState state
, deserialized_state
;
101 sd_event_source
*timer_event_source
;
103 ExecCommand
* control_command
;
104 SocketExecCommand control_command_id
;
107 mode_t directory_mode
;
129 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
130 SocketAddressBindIPv6Only bind_ipv6_only
;
134 size_t receive_buffer
;
139 char *bind_to_device
;
140 char *tcp_congestion
;
149 bool selinux_context_from_net
;
155 RateLimit trigger_limit
;
158 SocketPeer
*socket_peer_ref(SocketPeer
*p
);
159 SocketPeer
*socket_peer_unref(SocketPeer
*p
);
160 int socket_acquire_peer(Socket
*s
, int fd
, SocketPeer
**p
);
162 DEFINE_TRIVIAL_CLEANUP_FUNC(SocketPeer
*, socket_peer_unref
);
164 /* Called from the service code when collecting fds */
165 int socket_collect_fds(Socket
*s
, int **fds
);
167 /* Called from the service code when a per-connection service ended */
168 void socket_connection_unref(Socket
*s
);
170 void socket_free_ports(Socket
*s
);
172 int socket_instantiate_service(Socket
*s
);
174 char *socket_fdname(Socket
*s
);
176 extern const UnitVTable socket_vtable
;
178 const char* socket_exec_command_to_string(SocketExecCommand i
) _const_
;
179 SocketExecCommand
socket_exec_command_from_string(const char *s
) _pure_
;
181 const char* socket_result_to_string(SocketResult i
) _const_
;
182 SocketResult
socket_result_from_string(const char *s
) _pure_
;
184 const char* socket_port_type_to_string(SocketPort
*p
) _pure_
;
185 SocketType
socket_port_type_from_string(const char *p
) _pure_
;
187 DEFINE_CAST(SOCKET
, Socket
);