chiark / gitweb /
unit: remove union Unit
[elogind.git] / src / socket.h
index 43d28d7e04d3a207873c41ece3c33977e410deaf..b6df83aee557eb1f8d3ffcd490109941cc9ff409 100644 (file)
@@ -1,4 +1,4 @@
-/*-*- Mode: C; c-basic-offset: 8 -*-*/
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
 
 #ifndef foosockethfoo
 #define foosockethfoo
@@ -28,6 +28,7 @@ typedef struct Socket Socket;
 #include "unit.h"
 #include "socket-util.h"
 #include "mount.h"
+#include "service.h"
 
 typedef enum SocketState {
         SOCKET_DEAD,
@@ -41,7 +42,7 @@ typedef enum SocketState {
         SOCKET_STOP_POST,
         SOCKET_FINAL_SIGTERM,
         SOCKET_FINAL_SIGKILL,
-        SOCKET_MAINTAINANCE,
+        SOCKET_FAILED,
         _SOCKET_STATE_MAX,
         _SOCKET_STATE_INVALID = -1
 } SocketState;
@@ -58,57 +59,78 @@ typedef enum SocketExecCommand {
 typedef enum SocketType {
         SOCKET_SOCKET,
         SOCKET_FIFO,
+        SOCKET_SPECIAL,
+        SOCKET_MQUEUE,
         _SOCKET_FIFO_MAX,
         _SOCKET_FIFO_INVALID = -1
 } SocketType;
 
-typedef struct SocketPort SocketPort;
-
-struct SocketPort {
+typedef struct SocketPort {
         SocketType type;
         int fd;
 
         SocketAddress address;
         char *path;
-
         Watch fd_watch;
 
-        LIST_FIELDS(SocketPort, port);
-};
+        LIST_FIELDS(struct SocketPort, port);
+} SocketPort;
 
 struct Socket {
-        Meta meta;
+        Unit meta;
 
         LIST_HEAD(SocketPort, ports);
 
-        /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
-        bool bind_ipv6_only;
-        unsigned backlog;
+        unsigned n_accepted;
+        unsigned n_connections;
+        unsigned max_connections;
 
+        unsigned backlog;
         usec_t timeout_usec;
 
         ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
         ExecContext exec_context;
 
-        Service *service;
+        /* For Accept=no sockets refers to the one service we'll
+        activate. For Accept=yes sockets is either NULL, or filled
+        when the next service we spawn. */
+        UnitRef service;
 
         SocketState state, deserialized_state;
 
-        KillMode kill_mode;
+        Watch timer_watch;
 
         ExecCommand* control_command;
         SocketExecCommand control_command_id;
         pid_t control_pid;
 
-        char *bind_to_device;
         mode_t directory_mode;
         mode_t socket_mode;
 
+        bool failure;
+
         bool accept;
-        unsigned n_accepted;
 
-        bool failure;
-        Watch timer_watch;
+        /* Socket options */
+        bool keep_alive;
+        bool free_bind;
+        bool transparent;
+        bool broadcast;
+        bool pass_cred;
+        int priority;
+        int mark;
+        size_t receive_buffer;
+        size_t send_buffer;
+        int ip_tos;
+        int ip_ttl;
+        size_t pipe_size;
+        char *bind_to_device;
+        char *tcp_congestion;
+        long mq_maxmsg;
+        long mq_msgsize;
+
+        /* Only for INET6 sockets: issue IPV6_V6ONLY sockopt */
+        SocketAddressBindIPv6Only bind_ipv6_only;
 };
 
 /* Called from the service code when collecting fds */
@@ -121,6 +143,9 @@ void socket_notify_service_dead(Socket *s);
  * any of the sockets of this socket */
 int socket_add_one_mount_link(Socket *s, Mount *m);
 
+/* Called from the service code when a per-connection service ended */
+void socket_connection_unref(Socket *s);
+
 extern const UnitVTable socket_vtable;
 
 const char* socket_state_to_string(SocketState i);