]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/socket.h
relicense to LGPLv2.1 (with exceptions)
[thirdparty/systemd.git] / src / core / socket.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5cb5a6ff
LP
2
3#ifndef foosockethfoo
4#define foosockethfoo
5
a7334b09
LP
6/***
7 This file is part of systemd.
8
9 Copyright 2010 Lennart Poettering
10
11 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
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
a7334b09
LP
14 (at your option) any later version.
15
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
5430f7f2 19 Lesser General Public License for more details.
a7334b09 20
5430f7f2 21 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23***/
24
5cb5a6ff
LP
25typedef struct Socket Socket;
26
acbb0225 27#include "manager.h"
87f0e418 28#include "unit.h"
542563ba 29#include "socket-util.h"
6e2ef85b 30#include "mount.h"
57020a3a 31#include "service.h"
5cb5a6ff
LP
32
33typedef enum SocketState {
34 SOCKET_DEAD,
35 SOCKET_START_PRE,
36 SOCKET_START_POST,
37 SOCKET_LISTENING,
38 SOCKET_RUNNING,
39 SOCKET_STOP_PRE,
034c6ed7
LP
40 SOCKET_STOP_PRE_SIGTERM,
41 SOCKET_STOP_PRE_SIGKILL,
5cb5a6ff 42 SOCKET_STOP_POST,
80876c20
LP
43 SOCKET_FINAL_SIGTERM,
44 SOCKET_FINAL_SIGKILL,
fdf20a31 45 SOCKET_FAILED,
e537352b
LP
46 _SOCKET_STATE_MAX,
47 _SOCKET_STATE_INVALID = -1
5cb5a6ff
LP
48} SocketState;
49
50typedef enum SocketExecCommand {
51 SOCKET_EXEC_START_PRE,
52 SOCKET_EXEC_START_POST,
53 SOCKET_EXEC_STOP_PRE,
54 SOCKET_EXEC_STOP_POST,
e537352b
LP
55 _SOCKET_EXEC_COMMAND_MAX,
56 _SOCKET_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
57} SocketExecCommand;
58
542563ba
LP
59typedef enum SocketType {
60 SOCKET_SOCKET,
e537352b 61 SOCKET_FIFO,
b0a3f2bc 62 SOCKET_SPECIAL,
916abb21 63 SOCKET_MQUEUE,
e537352b
LP
64 _SOCKET_FIFO_MAX,
65 _SOCKET_FIFO_INVALID = -1
542563ba
LP
66} SocketType;
67
cfc4eb4c
LP
68typedef enum SocketResult {
69 SOCKET_SUCCESS,
70 SOCKET_FAILURE_RESOURCES,
71 SOCKET_FAILURE_TIMEOUT,
72 SOCKET_FAILURE_EXIT_CODE,
73 SOCKET_FAILURE_SIGNAL,
74 SOCKET_FAILURE_CORE_DUMP,
6bda96a0 75 SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
cfc4eb4c
LP
76 _SOCKET_RESULT_MAX,
77 _SOCKET_RESULT_INVALID = -1
78} SocketResult;
79
01f78473 80typedef struct SocketPort {
542563ba 81 SocketType type;
9d58f1db 82 int fd;
542563ba
LP
83
84 SocketAddress address;
85 char *path;
acbb0225 86 Watch fd_watch;
542563ba 87
01f78473
LP
88 LIST_FIELDS(struct SocketPort, port);
89} SocketPort;
542563ba 90
5cb5a6ff 91struct Socket {
ac155bb8 92 Unit meta;
5cb5a6ff 93
542563ba
LP
94 LIST_HEAD(SocketPort, ports);
95
7fab9d01
LP
96 unsigned n_accepted;
97 unsigned n_connections;
98 unsigned max_connections;
99
542563ba 100 unsigned backlog;
034c6ed7
LP
101 usec_t timeout_usec;
102
e537352b 103 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
5cb5a6ff
LP
104 ExecContext exec_context;
105
b15bdda8
LP
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. */
57020a3a 109 UnitRef service;
034c6ed7 110
a16e1123 111 SocketState state, deserialized_state;
034c6ed7 112
7fab9d01
LP
113 Watch timer_watch;
114
034c6ed7 115 ExecCommand* control_command;
a16e1123 116 SocketExecCommand control_command_id;
5cb5a6ff
LP
117 pid_t control_pid;
118
7fab9d01
LP
119 mode_t directory_mode;
120 mode_t socket_mode;
4f2d528d 121
cfc4eb4c 122 SocketResult result;
7fab9d01
LP
123
124 bool accept;
4fd5948e
LP
125
126 /* Socket options */
127 bool keep_alive;
7fab9d01 128 bool free_bind;
6b6d2dee 129 bool transparent;
ec6370a2 130 bool broadcast;
d68af586 131 bool pass_cred;
54ecda32 132 bool pass_sec;
4fd5948e 133 int priority;
7fab9d01 134 int mark;
4fd5948e
LP
135 size_t receive_buffer;
136 size_t send_buffer;
137 int ip_tos;
138 int ip_ttl;
139 size_t pipe_size;
4fd5948e 140 char *bind_to_device;
cebf8b20 141 char *tcp_congestion;
916abb21
LP
142 long mq_maxmsg;
143 long mq_msgsize;
57020a3a
LP
144
145 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
146 SocketAddressBindIPv6Only bind_ipv6_only;
5cb5a6ff
LP
147};
148
44d8db9e
LP
149/* Called from the service code when collecting fds */
150int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
151
ceee3d82 152/* Called from the service when it shut down */
6bda96a0 153void socket_notify_service_dead(Socket *s, bool failed_permanent);
ceee3d82 154
6e2ef85b
LP
155/* Called from the mount code figure out if a mount is a dependency of
156 * any of the sockets of this socket */
157int socket_add_one_mount_link(Socket *s, Mount *m);
158
6cf6bbc2
LP
159/* Called from the service code when a per-connection service ended */
160void socket_connection_unref(Socket *s);
161
87f0e418 162extern const UnitVTable socket_vtable;
5cb5a6ff 163
a16e1123
LP
164const char* socket_state_to_string(SocketState i);
165SocketState socket_state_from_string(const char *s);
166
167const char* socket_exec_command_to_string(SocketExecCommand i);
168SocketExecCommand socket_exec_command_from_string(const char *s);
169
cfc4eb4c
LP
170const char* socket_result_to_string(SocketResult i);
171SocketResult socket_result_from_string(const char *s);
172
5cb5a6ff 173#endif