1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
6 static int socket_load(Name *n) {
9 exec_context_defaults(&s->exec_context);
10 s->backlog = SOMAXCONN;
12 return name_load_fragment_and_dropin(n);
15 static const char* listen_lookup(int type) {
17 if (type == SOCK_STREAM)
18 return "ListenStream";
19 else if (type == SOCK_DGRAM)
20 return "ListenDatagram";
21 else if (type == SOCK_SEQPACKET)
22 return "ListenSequentialPacket";
24 assert_not_reached("Unkown socket type");
28 static void socket_dump(Name *n, FILE *f, const char *prefix) {
30 static const char* const state_table[_SOCKET_STATE_MAX] = {
31 [SOCKET_DEAD] = "dead",
32 [SOCKET_START_PRE] = "start-pre",
33 [SOCKET_START_POST] = "start-post",
34 [SOCKET_LISTENING] = "listening",
35 [SOCKET_RUNNING] = "running",
36 [SOCKET_STOP_PRE] = "stop-pre",
37 [SOCKET_STOP_POST] = "stop-post",
38 [SOCKET_MAINTAINANCE] = "maintainance"
41 static const char* const command_table[_SOCKET_EXEC_MAX] = {
42 [SOCKET_EXEC_START_PRE] = "StartPre",
43 [SOCKET_EXEC_START_POST] = "StartPost",
44 [SOCKET_EXEC_STOP_PRE] = "StopPre",
45 [SOCKET_EXEC_STOP_POST] = "StopPost"
49 Socket *s = SOCKET(n);
55 "%sSocket State: %s\n"
56 "%sBindIPv6Only: %s\n"
58 prefix, state_table[s->state],
59 prefix, yes_no(s->bind_ipv6_only),
62 LIST_FOREACH(p, s->ports) {
64 if (p->type == SOCKET_SOCKET) {
69 if ((r = socket_address_print(&p->address, &k)) < 0)
74 fprintf(f, "%s%s: %s\n", prefix, listen_lookup(p->address.type), k);
77 fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
80 exec_context_dump(&s->exec_context, f, prefix);
82 for (c = 0; c < _SOCKET_EXEC_MAX; c++) {
85 LIST_FOREACH(i, s->exec_command[c])
86 fprintf(f, "%s%s: %s\n", prefix, command_table[c], i->path);
90 static int socket_start(Name *n) {
94 static int socket_stop(Name *n) {
98 static NameActiveState socket_active_state(Name *n) {
100 static const NameActiveState table[_SOCKET_STATE_MAX] = {
101 [SOCKET_DEAD] = NAME_INACTIVE,
102 [SOCKET_START_PRE] = NAME_ACTIVATING,
103 [SOCKET_START_POST] = NAME_ACTIVATING,
104 [SOCKET_LISTENING] = NAME_ACTIVE,
105 [SOCKET_RUNNING] = NAME_ACTIVE,
106 [SOCKET_STOP_PRE] = NAME_DEACTIVATING,
107 [SOCKET_STOP_POST] = NAME_DEACTIVATING,
108 [SOCKET_MAINTAINANCE] = NAME_INACTIVE,
111 return table[SOCKET(n)->state];
114 static void socket_free_hook(Name *n) {
116 Socket *s = SOCKET(n);
121 while ((p = s->ports)) {
122 LIST_REMOVE(SocketPort, s->ports, p);
130 exec_context_free(&s->exec_context);
132 for (c = 0; c < _SOCKET_EXEC_MAX; c++)
133 exec_command_free_list(s->exec_command[c]);
136 s->service->socket = NULL;
139 const NameVTable socket_vtable = {
145 .start = socket_start,
149 .active_state = socket_active_state,
151 .free_hook = socket_free_hook