]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/socket.h
Add __attribute__((const, pure, format)) in various places
[thirdparty/systemd.git] / src / core / socket.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 typedef struct Socket Socket;
25
26 #include "manager.h"
27 #include "unit.h"
28 #include "socket-util.h"
29 #include "mount.h"
30 #include "service.h"
31
32 typedef enum SocketState {
33 SOCKET_DEAD,
34 SOCKET_START_PRE,
35 SOCKET_START_POST,
36 SOCKET_LISTENING,
37 SOCKET_RUNNING,
38 SOCKET_STOP_PRE,
39 SOCKET_STOP_PRE_SIGTERM,
40 SOCKET_STOP_PRE_SIGKILL,
41 SOCKET_STOP_POST,
42 SOCKET_FINAL_SIGTERM,
43 SOCKET_FINAL_SIGKILL,
44 SOCKET_FAILED,
45 _SOCKET_STATE_MAX,
46 _SOCKET_STATE_INVALID = -1
47 } SocketState;
48
49 typedef enum SocketExecCommand {
50 SOCKET_EXEC_START_PRE,
51 SOCKET_EXEC_START_POST,
52 SOCKET_EXEC_STOP_PRE,
53 SOCKET_EXEC_STOP_POST,
54 _SOCKET_EXEC_COMMAND_MAX,
55 _SOCKET_EXEC_COMMAND_INVALID = -1
56 } SocketExecCommand;
57
58 typedef enum SocketType {
59 SOCKET_SOCKET,
60 SOCKET_FIFO,
61 SOCKET_SPECIAL,
62 SOCKET_MQUEUE,
63 _SOCKET_FIFO_MAX,
64 _SOCKET_FIFO_INVALID = -1
65 } SocketType;
66
67 typedef enum SocketResult {
68 SOCKET_SUCCESS,
69 SOCKET_FAILURE_RESOURCES,
70 SOCKET_FAILURE_TIMEOUT,
71 SOCKET_FAILURE_EXIT_CODE,
72 SOCKET_FAILURE_SIGNAL,
73 SOCKET_FAILURE_CORE_DUMP,
74 SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
75 _SOCKET_RESULT_MAX,
76 _SOCKET_RESULT_INVALID = -1
77 } SocketResult;
78
79 typedef struct SocketPort {
80 SocketType type;
81 int fd;
82
83 SocketAddress address;
84 char *path;
85 Watch fd_watch;
86
87 LIST_FIELDS(struct SocketPort, port);
88 } SocketPort;
89
90 struct Socket {
91 Unit meta;
92
93 LIST_HEAD(SocketPort, ports);
94
95 unsigned n_accepted;
96 unsigned n_connections;
97 unsigned max_connections;
98
99 unsigned backlog;
100 usec_t timeout_usec;
101
102 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
103 ExecContext exec_context;
104 KillContext kill_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 char *smack;
149 char *smack_ip_in;
150 char *smack_ip_out;
151 };
152
153 /* Called from the service code when collecting fds */
154 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
155
156 /* Called from the service when it shut down */
157 void socket_notify_service_dead(Socket *s, bool failed_permanent);
158
159 /* Called from the mount code figure out if a mount is a dependency of
160 * any of the sockets of this socket */
161 int socket_add_one_mount_link(Socket *s, Mount *m);
162
163 /* Called from the service code when a per-connection service ended */
164 void socket_connection_unref(Socket *s);
165
166 void socket_free_ports(Socket *s);
167
168 extern const UnitVTable socket_vtable;
169
170 const char* socket_state_to_string(SocketState i) _const_;
171 SocketState socket_state_from_string(const char *s) _pure_;
172
173 const char* socket_exec_command_to_string(SocketExecCommand i) _const_;
174 SocketExecCommand socket_exec_command_from_string(const char *s) _pure_;
175
176 const char* socket_result_to_string(SocketResult i) _const_;
177 SocketResult socket_result_from_string(const char *s) _pure_;
178
179 const char* socket_port_type_to_string(SocketPort *p) _pure_;