]>
Commit | Line | Data |
---|---|---|
1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ | |
2 | #pragma once | |
3 | ||
4 | #include "cgroup.h" | |
5 | #include "core-forward.h" | |
6 | #include "execute.h" | |
7 | #include "list.h" | |
8 | #include "pidref.h" | |
9 | #include "socket-util.h" | |
10 | #include "unit.h" | |
11 | ||
12 | typedef enum SocketExecCommand { | |
13 | SOCKET_EXEC_START_PRE, | |
14 | SOCKET_EXEC_START_CHOWN, | |
15 | SOCKET_EXEC_START_POST, | |
16 | SOCKET_EXEC_STOP_PRE, | |
17 | SOCKET_EXEC_STOP_POST, | |
18 | _SOCKET_EXEC_COMMAND_MAX, | |
19 | _SOCKET_EXEC_COMMAND_INVALID = -EINVAL, | |
20 | } SocketExecCommand; | |
21 | ||
22 | typedef enum SocketType { | |
23 | SOCKET_SOCKET, | |
24 | SOCKET_FIFO, | |
25 | SOCKET_SPECIAL, | |
26 | SOCKET_MQUEUE, | |
27 | SOCKET_USB_FUNCTION, | |
28 | _SOCKET_TYPE_MAX, | |
29 | _SOCKET_TYPE_INVALID = -EINVAL, | |
30 | } SocketType; | |
31 | ||
32 | typedef enum SocketResult { | |
33 | SOCKET_SUCCESS, | |
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, | |
42 | _SOCKET_RESULT_MAX, | |
43 | _SOCKET_RESULT_INVALID = -EINVAL, | |
44 | } SocketResult; | |
45 | ||
46 | typedef struct SocketPort { | |
47 | Socket *socket; | |
48 | ||
49 | SocketType type; | |
50 | int fd; | |
51 | int *auxiliary_fds; | |
52 | size_t n_auxiliary_fds; | |
53 | ||
54 | SocketAddress address; | |
55 | char *path; | |
56 | sd_event_source *event_source; | |
57 | ||
58 | LIST_FIELDS(struct SocketPort, port); | |
59 | } SocketPort; | |
60 | ||
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, | |
67 | } SocketTimestamping; | |
68 | ||
69 | typedef enum SocketDeferTrigger { | |
70 | SOCKET_DEFER_NO, | |
71 | SOCKET_DEFER_YES, | |
72 | SOCKET_DEFER_PATIENT, | |
73 | _SOCKET_DEFER_MAX, | |
74 | _SOCKET_DEFER_INVALID = -EINVAL, | |
75 | } SocketDeferTrigger; | |
76 | ||
77 | typedef struct Socket { | |
78 | Unit meta; | |
79 | ||
80 | LIST_HEAD(SocketPort, ports); | |
81 | ||
82 | Set *peers_by_address; | |
83 | ||
84 | unsigned n_accepted; | |
85 | unsigned n_connections; | |
86 | unsigned n_refused; | |
87 | unsigned max_connections; | |
88 | unsigned max_connections_per_source; | |
89 | ||
90 | unsigned backlog; | |
91 | unsigned keep_alive_cnt; | |
92 | usec_t timeout_usec; | |
93 | usec_t keep_alive_time; | |
94 | usec_t keep_alive_interval; | |
95 | usec_t defer_accept; | |
96 | ||
97 | ExecCommand *exec_command[_SOCKET_EXEC_COMMAND_MAX]; | |
98 | ExecContext exec_context; | |
99 | KillContext kill_context; | |
100 | CGroupContext cgroup_context; | |
101 | ||
102 | ExecRuntime *exec_runtime; | |
103 | CGroupRuntime *cgroup_runtime; | |
104 | ||
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. */ | |
108 | UnitRef service; | |
109 | ||
110 | SocketState state, deserialized_state; | |
111 | ||
112 | sd_event_source *timer_event_source; | |
113 | ||
114 | ExecCommand *control_command; | |
115 | SocketExecCommand control_command_id; | |
116 | PidRef control_pid; | |
117 | ||
118 | bool pass_fds_to_exec; | |
119 | ||
120 | mode_t directory_mode; | |
121 | mode_t socket_mode; | |
122 | ||
123 | SocketResult result; | |
124 | SocketResult clean_result; | |
125 | ||
126 | char **symlinks; | |
127 | ||
128 | bool accept; | |
129 | bool remove_on_stop; | |
130 | bool writable; | |
131 | bool flush_pending; | |
132 | ||
133 | int socket_protocol; | |
134 | ||
135 | /* Socket options */ | |
136 | bool keep_alive; | |
137 | bool no_delay; | |
138 | bool free_bind; | |
139 | bool transparent; | |
140 | bool broadcast; | |
141 | bool pass_cred; | |
142 | bool pass_pidfd; | |
143 | bool pass_sec; | |
144 | bool pass_pktinfo; | |
145 | bool pass_rights; | |
146 | SocketTimestamping timestamping; | |
147 | ||
148 | /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */ | |
149 | SocketAddressBindIPv6Only bind_ipv6_only; | |
150 | ||
151 | int priority; | |
152 | int mark; | |
153 | size_t receive_buffer; | |
154 | size_t send_buffer; | |
155 | int ip_tos; | |
156 | int ip_ttl; | |
157 | size_t pipe_size; | |
158 | char *bind_to_device; | |
159 | char *tcp_congestion; | |
160 | bool reuse_port; | |
161 | long mq_maxmsg; | |
162 | long mq_msgsize; | |
163 | ||
164 | char *smack; | |
165 | char *smack_ip_in; | |
166 | char *smack_ip_out; | |
167 | ||
168 | bool selinux_context_from_net; | |
169 | ||
170 | char *user, *group; | |
171 | ||
172 | char *fdname; | |
173 | ||
174 | RateLimit trigger_limit; | |
175 | RateLimit poll_limit; | |
176 | ||
177 | usec_t defer_trigger_max_usec; | |
178 | SocketDeferTrigger defer_trigger; | |
179 | } Socket; | |
180 | ||
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); | |
184 | ||
185 | DEFINE_TRIVIAL_CLEANUP_FUNC(SocketPeer*, socket_peer_unref); | |
186 | ||
187 | /* Called from the service code when collecting fds */ | |
188 | int socket_collect_fds(Socket *s, int **ret); | |
189 | ||
190 | /* Called from the service code when a per-connection service ended */ | |
191 | void socket_connection_unref(Socket *s); | |
192 | ||
193 | SocketPort* socket_port_free(SocketPort *p); | |
194 | DEFINE_TRIVIAL_CLEANUP_FUNC(SocketPort*, socket_port_free); | |
195 | ||
196 | void socket_free_ports(Socket *s); | |
197 | ||
198 | int socket_port_to_address(const SocketPort *s, char **ret); | |
199 | ||
200 | int socket_load_service_unit(Socket *s, int cfd, Unit **ret); | |
201 | ||
202 | const char* socket_fdname(Socket *s); | |
203 | ||
204 | extern const UnitVTable socket_vtable; | |
205 | ||
206 | const char* socket_exec_command_to_string(SocketExecCommand i) _const_; | |
207 | SocketExecCommand socket_exec_command_from_string(const char *s) _pure_; | |
208 | ||
209 | const char* socket_result_to_string(SocketResult i) _const_; | |
210 | SocketResult socket_result_from_string(const char *s) _pure_; | |
211 | ||
212 | const char* socket_port_type_to_string(SocketPort *p) _pure_; | |
213 | SocketType socket_port_type_from_string(const char *p) _pure_; | |
214 | ||
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_; | |
218 | ||
219 | const char* socket_defer_trigger_to_string(SocketDeferTrigger i) _const_; | |
220 | SocketDeferTrigger socket_defer_trigger_from_string(const char *s) _pure_; | |
221 | ||
222 | DEFINE_CAST(SOCKET, Socket); |