1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
7 This file is part of systemd.
9 Copyright 2010 Lennart Poettering
11 systemd is free software; you can redistribute it and/or modify it
12 under the terms of the GNU Lesser General Public License as published by
13 the Free Software Foundation; either version 2.1 of the License, or
14 (at your option) any later version.
16 systemd is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 Lesser General Public License for more details.
21 You should have received a copy of the GNU Lesser General Public License
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 typedef struct Socket Socket;
29 #include "socket-util.h"
33 typedef enum SocketState {
40 SOCKET_STOP_PRE_SIGTERM,
41 SOCKET_STOP_PRE_SIGKILL,
47 _SOCKET_STATE_INVALID = -1
50 typedef enum SocketExecCommand {
51 SOCKET_EXEC_START_PRE,
52 SOCKET_EXEC_START_POST,
54 SOCKET_EXEC_STOP_POST,
55 _SOCKET_EXEC_COMMAND_MAX,
56 _SOCKET_EXEC_COMMAND_INVALID = -1
59 typedef enum SocketType {
65 _SOCKET_FIFO_INVALID = -1
68 typedef enum SocketResult {
70 SOCKET_FAILURE_RESOURCES,
71 SOCKET_FAILURE_TIMEOUT,
72 SOCKET_FAILURE_EXIT_CODE,
73 SOCKET_FAILURE_SIGNAL,
74 SOCKET_FAILURE_CORE_DUMP,
75 SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
77 _SOCKET_RESULT_INVALID = -1
80 typedef struct SocketPort {
84 SocketAddress address;
88 LIST_FIELDS(struct SocketPort, port);
94 LIST_HEAD(SocketPort, ports);
97 unsigned n_connections;
98 unsigned max_connections;
103 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
104 ExecContext exec_context;
106 /* For Accept=no sockets refers to the one service we'll
107 activate. For Accept=yes sockets is either NULL, or filled
108 when the next service we spawn. */
111 SocketState state, deserialized_state;
115 ExecCommand* control_command;
116 SocketExecCommand control_command_id;
119 mode_t directory_mode;
135 size_t receive_buffer;
140 char *bind_to_device;
141 char *tcp_congestion;
145 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
146 SocketAddressBindIPv6Only bind_ipv6_only;
149 /* Called from the service code when collecting fds */
150 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
152 /* Called from the service when it shut down */
153 void socket_notify_service_dead(Socket *s, bool failed_permanent);
155 /* Called from the mount code figure out if a mount is a dependency of
156 * any of the sockets of this socket */
157 int socket_add_one_mount_link(Socket *s, Mount *m);
159 /* Called from the service code when a per-connection service ended */
160 void socket_connection_unref(Socket *s);
162 extern const UnitVTable socket_vtable;
164 const char* socket_state_to_string(SocketState i);
165 SocketState socket_state_from_string(const char *s);
167 const char* socket_exec_command_to_string(SocketExecCommand i);
168 SocketExecCommand socket_exec_command_from_string(const char *s);
170 const char* socket_result_to_string(SocketResult i);
171 SocketResult socket_result_from_string(const char *s);