1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
6 static int socket_load(Name *n) {
9 exec_context_defaults(&s->exec_context);
11 return name_load_fragment_and_dropin(n);
14 static void socket_dump(Name *n, FILE *f, const char *prefix) {
16 static const char* const state_table[_SOCKET_STATE_MAX] = {
17 [SOCKET_DEAD] = "dead",
18 [SOCKET_START_PRE] = "start-pre",
19 [SOCKET_START_POST] = "start-post",
20 [SOCKET_LISTENING] = "listening",
21 [SOCKET_RUNNING] = "running",
22 [SOCKET_STOP_PRE] = "stop-pre",
23 [SOCKET_STOP_POST] = "stop-post",
24 [SOCKET_MAINTAINANCE] = "maintainance"
27 static const char* const command_table[_SOCKET_EXEC_MAX] = {
28 [SOCKET_EXEC_START_PRE] = "StartPre",
29 [SOCKET_EXEC_START_POST] = "StartPost",
30 [SOCKET_EXEC_STOP_PRE] = "StopPre",
31 [SOCKET_EXEC_STOP_POST] = "StopPost"
35 Socket *s = SOCKET(n);
42 if ((r = address_print(&n->socket.address, &k)) < 0)
48 "%sSocket State: %s\n"
50 prefix, state_table[s->state],
55 exec_context_dump(&s->exec_context, f, prefix);
57 for (c = 0; c < _SOCKET_EXEC_MAX; c++) {
60 LIST_FOREACH(i, s->exec_command[c])
61 fprintf(f, "%s%s: %s\n", prefix, command_table[c], i->path);
65 static NameActiveState socket_active_state(Name *n) {
67 static const NameActiveState table[_SOCKET_STATE_MAX] = {
68 [SOCKET_DEAD] = NAME_INACTIVE,
69 [SOCKET_START_PRE] = NAME_ACTIVATING,
70 [SOCKET_START_POST] = NAME_ACTIVATING,
71 [SOCKET_LISTENING] = NAME_ACTIVE,
72 [SOCKET_RUNNING] = NAME_ACTIVE,
73 [SOCKET_STOP_PRE] = NAME_DEACTIVATING,
74 [SOCKET_STOP_POST] = NAME_DEACTIVATING,
75 [SOCKET_MAINTAINANCE] = NAME_INACTIVE,
78 return table[SOCKET(n)->state];
81 static void socket_free_hook(Name *n) {
84 Socket *s = SOCKET(n);
88 for (i = 0; i < s->n_fds; i++)
89 close_nointr(s->fds[i]);
91 exec_context_free(&s->exec_context);
93 for (c = 0; c < _SOCKET_EXEC_MAX; c++)
94 exec_command_free_list(s->exec_command[c]);
97 s->service->socket = NULL;
100 const NameVTable socket_vtable = {
110 .active_state = socket_active_state,
112 .free_hook = socket_free_hook