chiark / gitweb /
508f00eb346b5a1a6f9cb1b3d4eea30815af0e51
[elogind.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
105         /* For Accept=no sockets refers to the one service we'll
106         activate. For Accept=yes sockets is either NULL, or filled
107         when the next service we spawn. */
108         UnitRef service;
109
110         SocketState state, deserialized_state;
111
112         Watch timer_watch;
113
114         ExecCommand* control_command;
115         SocketExecCommand control_command_id;
116         pid_t control_pid;
117
118         mode_t directory_mode;
119         mode_t socket_mode;
120
121         SocketResult result;
122
123         bool accept;
124
125         /* Socket options */
126         bool keep_alive;
127         bool free_bind;
128         bool transparent;
129         bool broadcast;
130         bool pass_cred;
131         bool pass_sec;
132         int priority;
133         int mark;
134         size_t receive_buffer;
135         size_t send_buffer;
136         int ip_tos;
137         int ip_ttl;
138         size_t pipe_size;
139         char *bind_to_device;
140         char *tcp_congestion;
141         long mq_maxmsg;
142         long mq_msgsize;
143
144         /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
145         SocketAddressBindIPv6Only bind_ipv6_only;
146 };
147
148 /* Called from the service code when collecting fds */
149 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
150
151 /* Called from the service when it shut down */
152 void socket_notify_service_dead(Socket *s, bool failed_permanent);
153
154 /* Called from the mount code figure out if a mount is a dependency of
155  * any of the sockets of this socket */
156 int socket_add_one_mount_link(Socket *s, Mount *m);
157
158 /* Called from the service code when a per-connection service ended */
159 void socket_connection_unref(Socket *s);
160
161 extern const UnitVTable socket_vtable;
162
163 const char* socket_state_to_string(SocketState i);
164 SocketState socket_state_from_string(const char *s);
165
166 const char* socket_exec_command_to_string(SocketExecCommand i);
167 SocketExecCommand socket_exec_command_from_string(const char *s);
168
169 const char* socket_result_to_string(SocketResult i);
170 SocketResult socket_result_from_string(const char *s);