]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/socket.h
core: general cgroup rework
[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
acbb0225 26#include "manager.h"
87f0e418 27#include "unit.h"
542563ba 28#include "socket-util.h"
6e2ef85b 29#include "mount.h"
57020a3a 30#include "service.h"
5cb5a6ff
LP
31
32typedef enum SocketState {
33 SOCKET_DEAD,
34 SOCKET_START_PRE,
35 SOCKET_START_POST,
36 SOCKET_LISTENING,
37 SOCKET_RUNNING,
38 SOCKET_STOP_PRE,
034c6ed7
LP
39 SOCKET_STOP_PRE_SIGTERM,
40 SOCKET_STOP_PRE_SIGKILL,
5cb5a6ff 41 SOCKET_STOP_POST,
80876c20
LP
42 SOCKET_FINAL_SIGTERM,
43 SOCKET_FINAL_SIGKILL,
fdf20a31 44 SOCKET_FAILED,
e537352b
LP
45 _SOCKET_STATE_MAX,
46 _SOCKET_STATE_INVALID = -1
5cb5a6ff
LP
47} SocketState;
48
49typedef enum SocketExecCommand {
50 SOCKET_EXEC_START_PRE,
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 {
542563ba 80 SocketType type;
9d58f1db 81 int fd;
542563ba
LP
82
83 SocketAddress address;
84 char *path;
acbb0225 85 Watch fd_watch;
542563ba 86
01f78473
LP
87 LIST_FIELDS(struct SocketPort, port);
88} SocketPort;
542563ba 89
5cb5a6ff 90struct Socket {
ac155bb8 91 Unit meta;
5cb5a6ff 92
542563ba
LP
93 LIST_HEAD(SocketPort, ports);
94
7fab9d01
LP
95 unsigned n_accepted;
96 unsigned n_connections;
97 unsigned max_connections;
98
542563ba 99 unsigned backlog;
034c6ed7
LP
100 usec_t timeout_usec;
101
e537352b 102 ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
5cb5a6ff 103 ExecContext exec_context;
4819ff03 104 KillContext kill_context;
4ad49000 105 CGroupContext cgroup_context;
5cb5a6ff 106
b15bdda8
LP
107 /* For Accept=no sockets refers to the one service we'll
108 activate. For Accept=yes sockets is either NULL, or filled
109 when the next service we spawn. */
57020a3a 110 UnitRef service;
034c6ed7 111
a16e1123 112 SocketState state, deserialized_state;
034c6ed7 113
7fab9d01
LP
114 Watch timer_watch;
115
034c6ed7 116 ExecCommand* control_command;
a16e1123 117 SocketExecCommand control_command_id;
5cb5a6ff
LP
118 pid_t control_pid;
119
7fab9d01
LP
120 mode_t directory_mode;
121 mode_t socket_mode;
4f2d528d 122
cfc4eb4c 123 SocketResult result;
7fab9d01
LP
124
125 bool accept;
4fd5948e
LP
126
127 /* Socket options */
128 bool keep_alive;
7fab9d01 129 bool free_bind;
6b6d2dee 130 bool transparent;
ec6370a2 131 bool broadcast;
d68af586 132 bool pass_cred;
54ecda32 133 bool pass_sec;
68667801
ZJS
134
135 /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
136 SocketAddressBindIPv6Only bind_ipv6_only;
137
4fd5948e 138 int priority;
7fab9d01 139 int mark;
4fd5948e
LP
140 size_t receive_buffer;
141 size_t send_buffer;
142 int ip_tos;
143 int ip_ttl;
144 size_t pipe_size;
4fd5948e 145 char *bind_to_device;
cebf8b20 146 char *tcp_congestion;
916abb21
LP
147 long mq_maxmsg;
148 long mq_msgsize;
57020a3a 149
0eb59ccf
AK
150 char *smack;
151 char *smack_ip_in;
152 char *smack_ip_out;
5cb5a6ff
LP
153};
154
44d8db9e
LP
155/* Called from the service code when collecting fds */
156int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
157
ceee3d82 158/* Called from the service when it shut down */
6bda96a0 159void socket_notify_service_dead(Socket *s, bool failed_permanent);
ceee3d82 160
6e2ef85b
LP
161/* Called from the mount code figure out if a mount is a dependency of
162 * any of the sockets of this socket */
163int socket_add_one_mount_link(Socket *s, Mount *m);
164
6cf6bbc2
LP
165/* Called from the service code when a per-connection service ended */
166void socket_connection_unref(Socket *s);
167
74051b9b
LP
168void socket_free_ports(Socket *s);
169
87f0e418 170extern const UnitVTable socket_vtable;
5cb5a6ff 171
44a6b1b6
ZJS
172const char* socket_state_to_string(SocketState i) _const_;
173SocketState socket_state_from_string(const char *s) _pure_;
a16e1123 174
44a6b1b6
ZJS
175const char* socket_exec_command_to_string(SocketExecCommand i) _const_;
176SocketExecCommand socket_exec_command_from_string(const char *s) _pure_;
a16e1123 177
44a6b1b6
ZJS
178const char* socket_result_to_string(SocketResult i) _const_;
179SocketResult socket_result_from_string(const char *s) _pure_;
67419600 180
44a6b1b6 181const char* socket_port_type_to_string(SocketPort *p) _pure_;