]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/socket.h
sd-bus: sync kdbus.h (ABI break)
[thirdparty/systemd.git] / src / core / socket.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5cb5a6ff 2
c2f1db8f 3#pragma once
5cb5a6ff 4
a7334b09
LP
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
5430f7f2
LP
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
a7334b09
LP
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
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
5cb5a6ff
LP
24typedef struct Socket Socket;
25
542563ba 26#include "socket-util.h"
6e2ef85b 27#include "mount.h"
57020a3a 28#include "service.h"
5cb5a6ff
LP
29
30typedef enum SocketState {
31 SOCKET_DEAD,
32 SOCKET_START_PRE,
3900e5fd 33 SOCKET_START_CHOWN,
5cb5a6ff
LP
34 SOCKET_START_POST,
35 SOCKET_LISTENING,
36 SOCKET_RUNNING,
37 SOCKET_STOP_PRE,
034c6ed7
LP
38 SOCKET_STOP_PRE_SIGTERM,
39 SOCKET_STOP_PRE_SIGKILL,
5cb5a6ff 40 SOCKET_STOP_POST,
80876c20
LP
41 SOCKET_FINAL_SIGTERM,
42 SOCKET_FINAL_SIGKILL,
fdf20a31 43 SOCKET_FAILED,
e537352b
LP
44 _SOCKET_STATE_MAX,
45 _SOCKET_STATE_INVALID = -1
5cb5a6ff
LP
46} SocketState;
47
48typedef enum SocketExecCommand {
49 SOCKET_EXEC_START_PRE,
3900e5fd 50 SOCKET_EXEC_START_CHOWN,
5cb5a6ff
LP
51 SOCKET_EXEC_START_POST,
52 SOCKET_EXEC_STOP_PRE,
53 SOCKET_EXEC_STOP_POST,
e537352b
LP
54 _SOCKET_EXEC_COMMAND_MAX,
55 _SOCKET_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
56} SocketExecCommand;
57
542563ba
LP
58typedef enum SocketType {
59 SOCKET_SOCKET,
e537352b 60 SOCKET_FIFO,
b0a3f2bc 61 SOCKET_SPECIAL,
916abb21 62 SOCKET_MQUEUE,
e537352b
LP
63 _SOCKET_FIFO_MAX,
64 _SOCKET_FIFO_INVALID = -1
542563ba
LP
65} SocketType;
66
cfc4eb4c
LP
67typedef 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,
6bda96a0 74 SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
cfc4eb4c
LP
75 _SOCKET_RESULT_MAX,
76 _SOCKET_RESULT_INVALID = -1
77} SocketResult;
78
01f78473 79typedef struct SocketPort {
718db961
LP
80 Socket *socket;
81
542563ba 82 SocketType type;
9d58f1db 83 int fd;
542563ba
LP
84
85 SocketAddress address;
86 char *path;
718db961 87 sd_event_source *event_source;
542563ba 88
01f78473
LP
89 LIST_FIELDS(struct SocketPort, port);
90} SocketPort;
542563ba 91
5cb5a6ff 92struct Socket {
ac155bb8 93 Unit meta;
5cb5a6ff 94
542563ba
LP
95 LIST_HEAD(SocketPort, ports);
96
7fab9d01
LP
97 unsigned n_accepted;
98 unsigned n_connections;
99 unsigned max_connections;
100
542563ba 101 unsigned backlog;
209e9dcd 102 unsigned keep_alive_cnt;
034c6ed7 103 usec_t timeout_usec;
209e9dcd
SS
104 usec_t keep_alive_time;
105 usec_t keep_alive_interval;
cc567c9b 106 usec_t defer_accept;
034c6ed7 107
e537352b 108 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
5cb5a6ff 109 ExecContext exec_context;
4819ff03 110 KillContext kill_context;
4ad49000 111 CGroupContext cgroup_context;
613b411c 112 ExecRuntime *exec_runtime;
5cb5a6ff 113
b15bdda8
LP
114 /* For Accept=no sockets refers to the one service we'll
115 activate. For Accept=yes sockets is either NULL, or filled
116 when the next service we spawn. */
57020a3a 117 UnitRef service;
034c6ed7 118
a16e1123 119 SocketState state, deserialized_state;
034c6ed7 120
718db961 121 sd_event_source *timer_event_source;
7fab9d01 122
034c6ed7 123 ExecCommand* control_command;
a16e1123 124 SocketExecCommand control_command_id;
5cb5a6ff
LP
125 pid_t control_pid;
126
7fab9d01
LP
127 mode_t directory_mode;
128 mode_t socket_mode;
4f2d528d 129
cfc4eb4c 130 SocketResult result;
7fab9d01 131
811ba7a0
LP
132 char **symlinks;
133
7fab9d01 134 bool accept;
bd1fe7c7 135 bool remove_on_stop;
4fd5948e
LP
136
137 /* Socket options */
138 bool keep_alive;
4427c3f4 139 bool no_delay;
7fab9d01 140 bool free_bind;
6b6d2dee 141 bool transparent;
ec6370a2 142 bool broadcast;
d68af586 143 bool pass_cred;
54ecda32 144 bool pass_sec;
68667801
ZJS
145
146 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
147 SocketAddressBindIPv6Only bind_ipv6_only;
148
4fd5948e 149 int priority;
7fab9d01 150 int mark;
4fd5948e
LP
151 size_t receive_buffer;
152 size_t send_buffer;
153 int ip_tos;
154 int ip_ttl;
155 size_t pipe_size;
4fd5948e 156 char *bind_to_device;
cebf8b20 157 char *tcp_congestion;
718db961 158 bool reuse_port;
916abb21
LP
159 long mq_maxmsg;
160 long mq_msgsize;
57020a3a 161
0eb59ccf
AK
162 char *smack;
163 char *smack_ip_in;
164 char *smack_ip_out;
3900e5fd 165
16115b0a
MS
166 bool selinux_context_from_net;
167
3900e5fd 168 char *user, *group;
5cb5a6ff
LP
169};
170
44d8db9e
LP
171/* Called from the service code when collecting fds */
172int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
173
6cf6bbc2
LP
174/* Called from the service code when a per-connection service ended */
175void socket_connection_unref(Socket *s);
176
74051b9b
LP
177void socket_free_ports(Socket *s);
178
87f0e418 179extern const UnitVTable socket_vtable;
5cb5a6ff 180
44a6b1b6
ZJS
181const char* socket_state_to_string(SocketState i) _const_;
182SocketState socket_state_from_string(const char *s) _pure_;
a16e1123 183
44a6b1b6
ZJS
184const char* socket_exec_command_to_string(SocketExecCommand i) _const_;
185SocketExecCommand socket_exec_command_from_string(const char *s) _pure_;
a16e1123 186
44a6b1b6
ZJS
187const char* socket_result_to_string(SocketResult i) _const_;
188SocketResult socket_result_from_string(const char *s) _pure_;
67419600 189
44a6b1b6 190const char* socket_port_type_to_string(SocketPort *p) _pure_;
8b835fcc
ZJS
191
192int socket_instantiate_service(Socket *s);