]> git.ipfire.org Git - thirdparty/systemd.git/blame_incremental - src/core/socket.h
core/execute: use cleanup_strv_free
[thirdparty/systemd.git] / src / core / socket.h
... / ...
CommitLineData
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
24typedef 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
32typedef 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
49typedef 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
58typedef 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
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,
74 SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
75 _SOCKET_RESULT_MAX,
76 _SOCKET_RESULT_INVALID = -1
77} SocketResult;
78
79typedef 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
90struct 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
149/* Called from the service code when collecting fds */
150int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
151
152/* Called from the service when it shut down */
153void 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 */
157int socket_add_one_mount_link(Socket *s, Mount *m);
158
159/* Called from the service code when a per-connection service ended */
160void socket_connection_unref(Socket *s);
161
162extern const UnitVTable socket_vtable;
163
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
170const char* socket_result_to_string(SocketResult i);
171SocketResult socket_result_from_string(const char *s);