]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/socket.h
core: introduce activation rate limiting for socket units
[thirdparty/systemd.git] / src / core / socket.h
1 #pragma once
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 typedef struct Socket Socket;
23
24 #include "mount.h"
25 #include "service.h"
26 #include "socket-util.h"
27
28 typedef enum SocketExecCommand {
29 SOCKET_EXEC_START_PRE,
30 SOCKET_EXEC_START_CHOWN,
31 SOCKET_EXEC_START_POST,
32 SOCKET_EXEC_STOP_PRE,
33 SOCKET_EXEC_STOP_POST,
34 _SOCKET_EXEC_COMMAND_MAX,
35 _SOCKET_EXEC_COMMAND_INVALID = -1
36 } SocketExecCommand;
37
38 typedef enum SocketType {
39 SOCKET_SOCKET,
40 SOCKET_FIFO,
41 SOCKET_SPECIAL,
42 SOCKET_MQUEUE,
43 SOCKET_USB_FUNCTION,
44 _SOCKET_FIFO_MAX,
45 _SOCKET_FIFO_INVALID = -1
46 } SocketType;
47
48 typedef enum SocketResult {
49 SOCKET_SUCCESS,
50 SOCKET_FAILURE_RESOURCES,
51 SOCKET_FAILURE_TIMEOUT,
52 SOCKET_FAILURE_EXIT_CODE,
53 SOCKET_FAILURE_SIGNAL,
54 SOCKET_FAILURE_CORE_DUMP,
55 SOCKET_FAILURE_TRIGGER_LIMIT_HIT,
56 SOCKET_FAILURE_SERVICE_START_LIMIT_HIT,
57 _SOCKET_RESULT_MAX,
58 _SOCKET_RESULT_INVALID = -1
59 } SocketResult;
60
61 typedef struct SocketPort {
62 Socket *socket;
63
64 SocketType type;
65 int fd;
66 int *auxiliary_fds;
67 int n_auxiliary_fds;
68
69 SocketAddress address;
70 char *path;
71 sd_event_source *event_source;
72
73 LIST_FIELDS(struct SocketPort, port);
74 } SocketPort;
75
76 struct Socket {
77 Unit meta;
78
79 LIST_HEAD(SocketPort, ports);
80
81 unsigned n_accepted;
82 unsigned n_connections;
83 unsigned max_connections;
84
85 unsigned backlog;
86 unsigned keep_alive_cnt;
87 usec_t timeout_usec;
88 usec_t keep_alive_time;
89 usec_t keep_alive_interval;
90 usec_t defer_accept;
91
92 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
93 ExecContext exec_context;
94 KillContext kill_context;
95 CGroupContext cgroup_context;
96 ExecRuntime *exec_runtime;
97
98 /* For Accept=no sockets refers to the one service we'll
99 activate. For Accept=yes sockets is either NULL, or filled
100 when the next service we spawn. */
101 UnitRef service;
102
103 SocketState state, deserialized_state;
104
105 sd_event_source *timer_event_source;
106
107 ExecCommand* control_command;
108 SocketExecCommand control_command_id;
109 pid_t control_pid;
110
111 mode_t directory_mode;
112 mode_t socket_mode;
113
114 SocketResult result;
115
116 char **symlinks;
117
118 bool accept;
119 bool remove_on_stop;
120 bool writable;
121
122 int socket_protocol;
123
124 /* Socket options */
125 bool keep_alive;
126 bool no_delay;
127 bool free_bind;
128 bool transparent;
129 bool broadcast;
130 bool pass_cred;
131 bool pass_sec;
132
133 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
134 SocketAddressBindIPv6Only bind_ipv6_only;
135
136 int priority;
137 int mark;
138 size_t receive_buffer;
139 size_t send_buffer;
140 int ip_tos;
141 int ip_ttl;
142 size_t pipe_size;
143 char *bind_to_device;
144 char *tcp_congestion;
145 bool reuse_port;
146 long mq_maxmsg;
147 long mq_msgsize;
148
149 char *smack;
150 char *smack_ip_in;
151 char *smack_ip_out;
152
153 bool selinux_context_from_net;
154
155 char *user, *group;
156
157 bool reset_cpu_usage:1;
158
159 char *fdname;
160
161 RateLimit trigger_limit;
162 };
163
164 /* Called from the service code when collecting fds */
165 int socket_collect_fds(Socket *s, int **fds);
166
167 /* Called from the service code when a per-connection service ended */
168 void socket_connection_unref(Socket *s);
169
170 void socket_free_ports(Socket *s);
171
172 int socket_instantiate_service(Socket *s);
173
174 char *socket_fdname(Socket *s);
175
176 extern const UnitVTable socket_vtable;
177
178 const char* socket_exec_command_to_string(SocketExecCommand i) _const_;
179 SocketExecCommand socket_exec_command_from_string(const char *s) _pure_;
180
181 const char* socket_result_to_string(SocketResult i) _const_;
182 SocketResult socket_result_from_string(const char *s) _pure_;
183
184 const char* socket_port_type_to_string(SocketPort *p) _pure_;