socket.h revision 209e9dcd7b2f23b68ff93bf20fad025bc03219ac
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder#pragma once
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner/***
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder This file is part of systemd.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Copyright 2010 Lennart Poettering
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski systemd is free software; you can redistribute it and/or modify it
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski under the terms of the GNU Lesser General Public License as published by
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder the Free Software Foundation; either version 2.1 of the License, or
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder (at your option) any later version.
0095c7efbddd0ffeed6aaf8ec015346be161d819Till Mossakowski
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder systemd is distributed in the hope that it will be useful, but
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski WITHOUT ANY WARRANTY; without even the implied warranty of
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder Lesser General Public License for more details.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder You should have received a copy of the GNU Lesser General Public License
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski along with systemd; If not, see <http://www.gnu.org/licenses/>.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder***/
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowskitypedef struct Socket Socket;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "manager.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "unit.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "socket-util.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "mount.h"
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder#include "service.h"
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder
ad270004874ce1d0697fb30d7309f180553bb315Christian Maedertypedef enum SocketState {
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder SOCKET_DEAD,
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder SOCKET_START_PRE,
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder SOCKET_START_CHOWN,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder SOCKET_START_POST,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder SOCKET_LISTENING,
d3c9318c22fcf44d9135a3b2c64f880b9a785babChristian Maeder SOCKET_RUNNING,
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder SOCKET_STOP_PRE,
f5e43c6208179131e179f075248880a8cae1e111cmaeder SOCKET_STOP_PRE_SIGTERM,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski SOCKET_STOP_PRE_SIGKILL,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski SOCKET_STOP_POST,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski SOCKET_FINAL_SIGTERM,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski SOCKET_FINAL_SIGKILL,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder SOCKET_FAILED,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski _SOCKET_STATE_MAX,
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder _SOCKET_STATE_INVALID = -1
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder} SocketState;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maedertypedef enum SocketExecCommand {
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder SOCKET_EXEC_START_PRE,
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder SOCKET_EXEC_START_CHOWN,
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder SOCKET_EXEC_START_POST,
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder SOCKET_EXEC_STOP_PRE,
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder SOCKET_EXEC_STOP_POST,
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder _SOCKET_EXEC_COMMAND_MAX,
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder _SOCKET_EXEC_COMMAND_INVALID = -1
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder} SocketExecCommand;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroedertypedef enum SocketType {
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_SOCKET,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_FIFO,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski SOCKET_SPECIAL,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski SOCKET_MQUEUE,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski _SOCKET_FIFO_MAX,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski _SOCKET_FIFO_INVALID = -1
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski} SocketType;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maedertypedef enum SocketResult {
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder SOCKET_SUCCESS,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_FAILURE_RESOURCES,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_FAILURE_TIMEOUT,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_FAILURE_EXIT_CODE,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_FAILURE_SIGNAL,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_FAILURE_CORE_DUMP,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SOCKET_FAILURE_SERVICE_FAILED_PERMANENT,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder _SOCKET_RESULT_MAX,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski _SOCKET_RESULT_INVALID = -1
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski} SocketResult;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroedertypedef struct SocketPort {
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder Socket *socket;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder SocketType type;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski int fd;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder SocketAddress address;
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder char *path;
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder sd_event_source *event_source;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski LIST_FIELDS(struct SocketPort, port);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski} SocketPort;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowskistruct Socket {
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder Unit meta;
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder LIST_HEAD(SocketPort, ports);
e7d2b3903c7b44db432538b0d720c21062c24823Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski unsigned n_accepted;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski unsigned n_connections;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski unsigned max_connections;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski unsigned backlog;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski unsigned keep_alive_cnt;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski usec_t timeout_usec;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder usec_t keep_alive_time;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski usec_t keep_alive_interval;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski ExecContext exec_context;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski KillContext kill_context;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski CGroupContext cgroup_context;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski ExecRuntime *exec_runtime;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder /* For Accept=no sockets refers to the one service we'll
a98fd29a06e80e447af26d898044c23497adbc73Mihai Codescu activate. For Accept=yes sockets is either NULL, or filled
a98fd29a06e80e447af26d898044c23497adbc73Mihai Codescu when the next service we spawn. */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski UnitRef service;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
e7d2b3903c7b44db432538b0d720c21062c24823Christian Maeder SocketState state, deserialized_state;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski sd_event_source *timer_event_source;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski ExecCommand* control_command;
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder SocketExecCommand control_command_id;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski pid_t control_pid;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder mode_t directory_mode;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski mode_t socket_mode;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski SocketResult result;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder char **symlinks;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder bool accept;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski bool remove_on_stop;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski /* Socket options */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski bool keep_alive;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder bool no_delay;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder bool free_bind;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder bool transparent;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder bool broadcast;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder bool pass_cred;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder bool pass_sec;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder SocketAddressBindIPv6Only bind_ipv6_only;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder int priority;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder int mark;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder size_t receive_buffer;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder size_t send_buffer;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder int ip_tos;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder int ip_ttl;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder size_t pipe_size;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder char *bind_to_device;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder char *tcp_congestion;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder bool reuse_port;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder long mq_maxmsg;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder long mq_msgsize;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder char *smack;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder char *smack_ip_in;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder char *smack_ip_out;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder char *user, *group;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder};
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder/* Called from the service code when collecting fds */
c911a0ec80ca4a178399c68f1e28be4e2bf42fceChristian Maederint socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder/* Called from the service code when a per-connection service ended */
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maedervoid socket_connection_unref(Socket *s);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maedervoid socket_free_ports(Socket *s);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederextern const UnitVTable socket_vtable;
c8117ae0b6088d835211e494aef229558c814bd3cmaeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederconst char* socket_state_to_string(SocketState i) _const_;
09b431a868c79a92ae7c9bd141565f43f9034144Christian MaederSocketState socket_state_from_string(const char *s) _pure_;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederconst char* socket_exec_command_to_string(SocketExecCommand i) _const_;
c8117ae0b6088d835211e494aef229558c814bd3cmaederSocketExecCommand socket_exec_command_from_string(const char *s) _pure_;
a65c6747c9acbbebc93baba7bae94d2e3d8cdafbTill Mossakowski
4d7d53fec6b551333c79da6ae3b8ca2af0a741abChristian Maederconst char* socket_result_to_string(SocketResult i) _const_;
09b431a868c79a92ae7c9bd141565f43f9034144Christian MaederSocketResult socket_result_from_string(const char *s) _pure_;
c911a0ec80ca4a178399c68f1e28be4e2bf42fceChristian Maeder
d9a45a35cd696085be1a038b2cc67bee6819c574cmaederconst char* socket_port_type_to_string(SocketPort *p) _pure_;
f5e43c6208179131e179f075248880a8cae1e111cmaeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederint socket_instantiate_service(Socket *s);
c8117ae0b6088d835211e494aef229558c814bd3cmaeder