]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/socket.h
relicense to LGPLv2.1 (with exceptions)
[thirdparty/systemd.git] / src / core / socket.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #ifndef foosockethfoo
4 #define foosockethfoo
5
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
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.
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
19 Lesser General Public License for more details.
20
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/>.
23 ***/
24
25 typedef struct Socket Socket;
26
27 #include "manager.h"
28 #include "unit.h"
29 #include "socket-util.h"
30 #include "mount.h"
31 #include "service.h"
32
33 typedef enum SocketState {
34 SOCKET_DEAD,
35 SOCKET_START_PRE,
36 SOCKET_START_POST,
37 SOCKET_LISTENING,
38 SOCKET_RUNNING,
39 SOCKET_STOP_PRE,
40 SOCKET_STOP_PRE_SIGTERM,
41 SOCKET_STOP_PRE_SIGKILL,
42 SOCKET_STOP_POST,
43 SOCKET_FINAL_SIGTERM,
44 SOCKET_FINAL_SIGKILL,
45 SOCKET_FAILED,
46 _SOCKET_STATE_MAX,
47 _SOCKET_STATE_INVALID = -1
48 } SocketState;
49
50 typedef enum SocketExecCommand {
51 SOCKET_EXEC_START_PRE,
52 SOCKET_EXEC_START_POST,
53 SOCKET_EXEC_STOP_PRE,
54 SOCKET_EXEC_STOP_POST,
55 _SOCKET_EXEC_COMMAND_MAX,
56 _SOCKET_EXEC_COMMAND_INVALID = -1
57 } SocketExecCommand;
58
59 typedef enum SocketType {
60 SOCKET_SOCKET,
61 SOCKET_FIFO,
62 SOCKET_SPECIAL,
63 SOCKET_MQUEUE,
64 _SOCKET_FIFO_MAX,
65 _SOCKET_FIFO_INVALID = -1
66 } SocketType;
67
68 typedef 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,
75 SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
76 _SOCKET_RESULT_MAX,
77 _SOCKET_RESULT_INVALID = -1
78 } SocketResult;
79
80 typedef struct SocketPort {
81 SocketType type;
82 int fd;
83
84 SocketAddress address;
85 char *path;
86 Watch fd_watch;
87
88 LIST_FIELDS(struct SocketPort, port);
89 } SocketPort;
90
91 struct Socket {
92 Unit meta;
93
94 LIST_HEAD(SocketPort, ports);
95
96 unsigned n_accepted;
97 unsigned n_connections;
98 unsigned max_connections;
99
100 unsigned backlog;
101 usec_t timeout_usec;
102
103 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
104 ExecContext exec_context;
105
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. */
109 UnitRef service;
110
111 SocketState state, deserialized_state;
112
113 Watch timer_watch;
114
115 ExecCommand* control_command;
116 SocketExecCommand control_command_id;
117 pid_t control_pid;
118
119 mode_t directory_mode;
120 mode_t socket_mode;
121
122 SocketResult result;
123
124 bool accept;
125
126 /* Socket options */
127 bool keep_alive;
128 bool free_bind;
129 bool transparent;
130 bool broadcast;
131 bool pass_cred;
132 bool pass_sec;
133 int priority;
134 int mark;
135 size_t receive_buffer;
136 size_t send_buffer;
137 int ip_tos;
138 int ip_ttl;
139 size_t pipe_size;
140 char *bind_to_device;
141 char *tcp_congestion;
142 long mq_maxmsg;
143 long mq_msgsize;
144
145 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
146 SocketAddressBindIPv6Only bind_ipv6_only;
147 };
148
149 /* Called from the service code when collecting fds */
150 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
151
152 /* Called from the service when it shut down */
153 void socket_notify_service_dead(Socket *s, bool failed_permanent);
154
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);
158
159 /* Called from the service code when a per-connection service ended */
160 void socket_connection_unref(Socket *s);
161
162 extern const UnitVTable socket_vtable;
163
164 const char* socket_state_to_string(SocketState i);
165 SocketState socket_state_from_string(const char *s);
166
167 const char* socket_exec_command_to_string(SocketExecCommand i);
168 SocketExecCommand socket_exec_command_from_string(const char *s);
169
170 const char* socket_result_to_string(SocketResult i);
171 SocketResult socket_result_from_string(const char *s);
172
173 #endif