chiark / gitweb /
socket: on ipv6 try to use IPV6_UNICAST_HOPS sockopt
[elogind.git] / src / socket.c
1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2010 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <unistd.h>
25 #include <errno.h>
26 #include <fcntl.h>
27 #include <sys/epoll.h>
28 #include <signal.h>
29 #include <arpa/inet.h>
30
31 #include "unit.h"
32 #include "socket.h"
33 #include "log.h"
34 #include "load-dropin.h"
35 #include "load-fragment.h"
36 #include "strv.h"
37 #include "unit-name.h"
38 #include "dbus-socket.h"
39 #include "missing.h"
40
41 static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
42         [SOCKET_DEAD] = UNIT_INACTIVE,
43         [SOCKET_START_PRE] = UNIT_ACTIVATING,
44         [SOCKET_START_POST] = UNIT_ACTIVATING,
45         [SOCKET_LISTENING] = UNIT_ACTIVE,
46         [SOCKET_RUNNING] = UNIT_ACTIVE,
47         [SOCKET_STOP_PRE] = UNIT_DEACTIVATING,
48         [SOCKET_STOP_PRE_SIGTERM] = UNIT_DEACTIVATING,
49         [SOCKET_STOP_PRE_SIGKILL] = UNIT_DEACTIVATING,
50         [SOCKET_STOP_POST] = UNIT_DEACTIVATING,
51         [SOCKET_FINAL_SIGTERM] = UNIT_DEACTIVATING,
52         [SOCKET_FINAL_SIGKILL] = UNIT_DEACTIVATING,
53         [SOCKET_MAINTENANCE] = UNIT_MAINTENANCE
54 };
55
56 static void socket_init(Unit *u) {
57         Socket *s = SOCKET(u);
58
59         assert(u);
60         assert(u->meta.load_state == UNIT_STUB);
61
62         s->backlog = SOMAXCONN;
63         s->timeout_usec = DEFAULT_TIMEOUT_USEC;
64         s->directory_mode = 0755;
65         s->socket_mode = 0666;
66
67         s->max_connections = 64;
68
69         s->keep_alive = false;
70         s->priority = -1;
71         s->receive_buffer = 0;
72         s->send_buffer = 0;
73         s->ip_tos = -1;
74         s->ip_ttl = -1;
75         s->pipe_size = 0;
76         s->mark = -1;
77         s->free_bind = false;
78
79         exec_context_init(&s->exec_context);
80
81         s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
82 }
83
84 static void socket_unwatch_control_pid(Socket *s) {
85         assert(s);
86
87         if (s->control_pid <= 0)
88                 return;
89
90         unit_unwatch_pid(UNIT(s), s->control_pid);
91         s->control_pid = 0;
92 }
93
94 static void socket_done(Unit *u) {
95         Socket *s = SOCKET(u);
96         SocketPort *p;
97         Meta *i;
98
99         assert(s);
100
101         while ((p = s->ports)) {
102                 LIST_REMOVE(SocketPort, port, s->ports, p);
103
104                 if (p->fd >= 0) {
105                         unit_unwatch_fd(UNIT(s), &p->fd_watch);
106                         close_nointr_nofail(p->fd);
107                 }
108
109                 free(p->path);
110                 free(p);
111         }
112
113         exec_context_done(&s->exec_context);
114         exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
115         s->control_command = NULL;
116
117         socket_unwatch_control_pid(s);
118
119         s->service = NULL;
120
121         free(s->bind_to_device);
122         s->bind_to_device = NULL;
123
124         unit_unwatch_timer(u, &s->timer_watch);
125
126         /* Make sure no service instance refers to us anymore. */
127         LIST_FOREACH(units_per_type, i, u->meta.manager->units_per_type[UNIT_SERVICE]) {
128                 Service *service = (Service *) i;
129
130                 if (service->socket == s)
131                         service->socket = NULL;
132         }
133 }
134
135 static bool have_non_accept_socket(Socket *s) {
136         SocketPort *p;
137
138         assert(s);
139
140         if (!s->accept)
141                 return true;
142
143         LIST_FOREACH(port, p, s->ports) {
144
145                 if (p->type != SOCKET_SOCKET)
146                         return true;
147
148                 if (!socket_address_can_accept(&p->address))
149                         return true;
150         }
151
152         return false;
153 }
154
155 static int socket_verify(Socket *s) {
156         assert(s);
157
158         if (s->meta.load_state != UNIT_LOADED)
159                 return 0;
160
161         if (!s->ports) {
162                 log_error("%s lacks Listen setting. Refusing.", s->meta.id);
163                 return -EINVAL;
164         }
165
166         if (s->accept && s->max_connections <= 0) {
167                 log_error("%s's MaxConnection setting too small. Refusing.", s->meta.id);
168                 return -EINVAL;
169         }
170
171         if (s->exec_context.pam_name && s->kill_mode != KILL_CONTROL_GROUP) {
172                 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", s->meta.id);
173                 return -EINVAL;
174         }
175
176         return 0;
177 }
178
179 static bool socket_needs_mount(Socket *s, const char *prefix) {
180         SocketPort *p;
181
182         assert(s);
183
184         LIST_FOREACH(port, p, s->ports) {
185
186                 if (p->type == SOCKET_SOCKET) {
187                         if (socket_address_needs_mount(&p->address, prefix))
188                                 return true;
189                 } else {
190                         assert(p->type == SOCKET_FIFO);
191                         if (path_startswith(p->path, prefix))
192                                 return true;
193                 }
194         }
195
196         return false;
197 }
198
199 int socket_add_one_mount_link(Socket *s, Mount *m) {
200         int r;
201
202         assert(s);
203         assert(m);
204
205         if (s->meta.load_state != UNIT_LOADED ||
206             m->meta.load_state != UNIT_LOADED)
207                 return 0;
208
209         if (!socket_needs_mount(s, m->where))
210                 return 0;
211
212         if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(s), true)) < 0)
213                 return r;
214
215         if ((r = unit_add_dependency(UNIT(s), UNIT_REQUIRES, UNIT(m), true)) < 0)
216                 return r;
217
218         return 0;
219 }
220
221 static int socket_add_mount_links(Socket *s) {
222         Meta *other;
223         int r;
224
225         assert(s);
226
227         LIST_FOREACH(units_per_type, other, s->meta.manager->units_per_type[UNIT_MOUNT])
228                 if ((r = socket_add_one_mount_link(s, (Mount*) other)) < 0)
229                         return r;
230
231         return 0;
232 }
233
234 static int socket_add_device_link(Socket *s) {
235         char *t;
236         int r;
237
238         assert(s);
239
240         if (!s->bind_to_device)
241                 return 0;
242
243         if (asprintf(&t, "/sys/subsystem/net/devices/%s", s->bind_to_device) < 0)
244                 return -ENOMEM;
245
246         r = unit_add_node_link(UNIT(s), t, false);
247         free(t);
248
249         return r;
250 }
251
252 static int socket_load(Unit *u) {
253         Socket *s = SOCKET(u);
254         int r;
255
256         assert(u);
257         assert(u->meta.load_state == UNIT_STUB);
258
259         if ((r = unit_load_fragment_and_dropin(u)) < 0)
260                 return r;
261
262         /* This is a new unit? Then let's add in some extras */
263         if (u->meta.load_state == UNIT_LOADED) {
264
265                 if (have_non_accept_socket(s)) {
266                         if ((r = unit_load_related_unit(u, ".service", (Unit**) &s->service)))
267                                 return r;
268
269                         if ((r = unit_add_dependency(u, UNIT_BEFORE, UNIT(s->service), true)) < 0)
270                                 return r;
271                 }
272
273                 if ((r = socket_add_mount_links(s)) < 0)
274                         return r;
275
276                 if ((r = socket_add_device_link(s)) < 0)
277                         return r;
278
279                 if ((r = unit_add_exec_dependencies(u, &s->exec_context)) < 0)
280                         return r;
281
282                 if ((r = unit_add_default_cgroup(u)) < 0)
283                         return r;
284         }
285
286         return socket_verify(s);
287 }
288
289 static const char* listen_lookup(int type) {
290
291         if (type == SOCK_STREAM)
292                 return "ListenStream";
293         else if (type == SOCK_DGRAM)
294                 return "ListenDatagram";
295         else if (type == SOCK_SEQPACKET)
296                 return "ListenSequentialPacket";
297
298         assert_not_reached("Unknown socket type");
299         return NULL;
300 }
301
302 static void socket_dump(Unit *u, FILE *f, const char *prefix) {
303
304         SocketExecCommand c;
305         Socket *s = SOCKET(u);
306         SocketPort *p;
307         const char *prefix2;
308         char *p2;
309
310         assert(s);
311         assert(f);
312
313         p2 = strappend(prefix, "\t");
314         prefix2 = p2 ? p2 : prefix;
315
316         fprintf(f,
317                 "%sSocket State: %s\n"
318                 "%sBindIPv6Only: %s\n"
319                 "%sBacklog: %u\n"
320                 "%sKillMode: %s\n"
321                 "%sSocketMode: %04o\n"
322                 "%sDirectoryMode: %04o\n"
323                 "%sKeepAlive: %s\n"
324                 "%sFreeBind: %s\n",
325                 prefix, socket_state_to_string(s->state),
326                 prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only),
327                 prefix, s->backlog,
328                 prefix, kill_mode_to_string(s->kill_mode),
329                 prefix, s->socket_mode,
330                 prefix, s->directory_mode,
331                 prefix, yes_no(s->keep_alive),
332                 prefix, yes_no(s->free_bind));
333
334         if (s->control_pid > 0)
335                 fprintf(f,
336                         "%sControl PID: %lu\n",
337                         prefix, (unsigned long) s->control_pid);
338
339         if (s->bind_to_device)
340                 fprintf(f,
341                         "%sBindToDevice: %s\n",
342                         prefix, s->bind_to_device);
343
344         if (s->accept)
345                 fprintf(f,
346                         "%sAccepted: %u\n"
347                         "%sNConnections: %u\n"
348                         "%sMaxConnections: %u\n",
349                         prefix, s->n_accepted,
350                         prefix, s->n_connections,
351                         prefix, s->max_connections);
352
353         if (s->priority >= 0)
354                 fprintf(f,
355                         "%sPriority: %i\n",
356                         prefix, s->priority);
357
358         if (s->receive_buffer > 0)
359                 fprintf(f,
360                         "%sReceiveBuffer: %zu\n",
361                         prefix, s->receive_buffer);
362
363         if (s->send_buffer > 0)
364                 fprintf(f,
365                         "%sSendBuffer: %zu\n",
366                         prefix, s->send_buffer);
367
368         if (s->ip_tos >= 0)
369                 fprintf(f,
370                         "%sIPTOS: %i\n",
371                         prefix, s->ip_tos);
372
373         if (s->ip_ttl >= 0)
374                 fprintf(f,
375                         "%sIPTTL: %i\n",
376                         prefix, s->ip_ttl);
377
378         if (s->pipe_size > 0)
379                 fprintf(f,
380                         "%sPipeSize: %zu\n",
381                         prefix, s->pipe_size);
382
383         if (s->mark >= 0)
384                 fprintf(f,
385                         "%sMark: %i\n",
386                         prefix, s->mark);
387
388         LIST_FOREACH(port, p, s->ports) {
389
390                 if (p->type == SOCKET_SOCKET) {
391                         const char *t;
392                         int r;
393                         char *k;
394
395                         if ((r = socket_address_print(&p->address, &k)) < 0)
396                                 t = strerror(-r);
397                         else
398                                 t = k;
399
400                         fprintf(f, "%s%s: %s\n", prefix, listen_lookup(p->address.type), k);
401                         free(k);
402                 } else
403                         fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
404         }
405
406         exec_context_dump(&s->exec_context, f, prefix);
407
408         for (c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
409                 if (!s->exec_command[c])
410                         continue;
411
412                 fprintf(f, "%s-> %s:\n",
413                         prefix, socket_exec_command_to_string(c));
414
415                 exec_command_dump_list(s->exec_command[c], f, prefix2);
416         }
417
418         free(p2);
419 }
420
421 static int instance_from_socket(int fd, unsigned nr, char **instance) {
422         socklen_t l;
423         char *r;
424         union {
425                 struct sockaddr sa;
426                 struct sockaddr_un un;
427                 struct sockaddr_in in;
428                 struct sockaddr_in6 in6;
429                 struct sockaddr_storage storage;
430         } local, remote;
431
432         assert(fd >= 0);
433         assert(instance);
434
435         l = sizeof(local);
436         if (getsockname(fd, &local.sa, &l) < 0)
437                 return -errno;
438
439         l = sizeof(remote);
440         if (getpeername(fd, &remote.sa, &l) < 0)
441                 return -errno;
442
443         switch (local.sa.sa_family) {
444
445         case AF_INET: {
446                 uint32_t
447                         a = ntohl(local.in.sin_addr.s_addr),
448                         b = ntohl(remote.in.sin_addr.s_addr);
449
450                 if (asprintf(&r,
451                              "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
452                              nr,
453                              a >> 24, (a >> 16) & 0xFF, (a >> 8) & 0xFF, a & 0xFF,
454                              ntohs(local.in.sin_port),
455                              b >> 24, (b >> 16) & 0xFF, (b >> 8) & 0xFF, b & 0xFF,
456                              ntohs(remote.in.sin_port)) < 0)
457                         return -ENOMEM;
458
459                 break;
460         }
461
462         case AF_INET6: {
463                 static const char ipv4_prefix[] = {
464                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
465                 };
466
467                 if (memcmp(&local.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0 &&
468                     memcmp(&remote.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0) {
469                         const uint8_t
470                                 *a = local.in6.sin6_addr.s6_addr+12,
471                                 *b = remote.in6.sin6_addr.s6_addr+12;
472
473                         if (asprintf(&r,
474                                      "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
475                                      nr,
476                                      a[0], a[1], a[2], a[3],
477                                      ntohs(local.in6.sin6_port),
478                                      b[0], b[1], b[2], b[3],
479                                      ntohs(remote.in6.sin6_port)) < 0)
480                                 return -ENOMEM;
481                 } else {
482                         char a[INET6_ADDRSTRLEN], b[INET6_ADDRSTRLEN];
483
484                         if (asprintf(&r,
485                                      "%u-%s:%u-%s:%u",
486                                      nr,
487                                      inet_ntop(AF_INET6, &local.in6.sin6_addr, a, sizeof(a)),
488                                      ntohs(local.in6.sin6_port),
489                                      inet_ntop(AF_INET6, &remote.in6.sin6_addr, b, sizeof(b)),
490                                      ntohs(remote.in6.sin6_port)) < 0)
491                                 return -ENOMEM;
492                 }
493
494                 break;
495         }
496
497         case AF_UNIX: {
498                 struct ucred ucred;
499
500                 l = sizeof(ucred);
501                 if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &l) < 0)
502                         return -errno;
503
504                 if (asprintf(&r,
505                              "%u-%lu-%lu",
506                              nr,
507                              (unsigned long) ucred.pid,
508                              (unsigned long) ucred.uid) < 0)
509                         return -ENOMEM;
510
511                 break;
512         }
513
514         default:
515                 assert_not_reached("Unhandled socket type.");
516         }
517
518         *instance = r;
519         return 0;
520 }
521
522 static void socket_close_fds(Socket *s) {
523         SocketPort *p;
524
525         assert(s);
526
527         LIST_FOREACH(port, p, s->ports) {
528                 if (p->fd < 0)
529                         continue;
530
531                 unit_unwatch_fd(UNIT(s), &p->fd_watch);
532                 close_nointr_nofail(p->fd);
533
534                 /* One little note: we should never delete any sockets
535                  * in the file system here! After all some other
536                  * process we spawned might still have a reference of
537                  * this fd and wants to continue to use it. Therefore
538                  * we delete sockets in the file system before we
539                  * create a new one, not after we stopped using
540                  * one! */
541
542                 p->fd = -1;
543         }
544 }
545
546 static void socket_apply_socket_options(Socket *s, int fd) {
547         assert(s);
548         assert(fd >= 0);
549
550         if (s->keep_alive) {
551                 int b = s->keep_alive;
552                 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &b, sizeof(b)) < 0)
553                         log_warning("SO_KEEPALIVE failed: %m");
554         }
555
556         if (s->priority >= 0)
557                 if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &s->priority, sizeof(s->priority)) < 0)
558                         log_warning("SO_PRIORITY failed: %m");
559
560         if (s->receive_buffer > 0) {
561                 int value = (int) s->receive_buffer;
562                 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0)
563                         log_warning("SO_RCVBUF failed: %m");
564         }
565
566         if (s->send_buffer > 0) {
567                 int value = (int) s->send_buffer;
568                 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0)
569                         log_warning("SO_SNDBUF failed: %m");
570         }
571
572         if (s->mark >= 0)
573                 if (setsockopt(fd, SOL_SOCKET, SO_MARK, &s->mark, sizeof(s->mark)) < 0)
574                         log_warning("SO_MARK failed: %m");
575
576         if (s->ip_tos >= 0)
577                 if (setsockopt(fd, IPPROTO_IP, IP_TOS, &s->ip_tos, sizeof(s->ip_tos)) < 0)
578                         log_warning("IP_TOS failed: %m");
579
580         if (s->ip_ttl >= 0) {
581                 int r, x;
582
583                 r = setsockopt(fd, IPPROTO_IP, IP_TTL, &s->ip_ttl, sizeof(s->ip_ttl));
584                 x = setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &s->ip_ttl, sizeof(s->ip_ttl));
585
586                 if (r < 0 && x < 0)
587                         log_warning("IP_TTL/IPV6_UNICAST_HOPS failed: %m");
588         }
589 }
590
591 static void socket_apply_pipe_options(Socket *s, int fd) {
592         assert(s);
593         assert(fd >= 0);
594
595         if (s->pipe_size > 0)
596                 if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
597                         log_warning("F_SETPIPE_SZ: %m");
598 }
599
600 static int socket_open_fds(Socket *s) {
601         SocketPort *p;
602         int r;
603
604         assert(s);
605
606         LIST_FOREACH(port, p, s->ports) {
607
608                 if (p->fd >= 0)
609                         continue;
610
611                 if (p->type == SOCKET_SOCKET) {
612
613                         if ((r = socket_address_listen(
614                                              &p->address,
615                                              s->backlog,
616                                              s->bind_ipv6_only,
617                                              s->bind_to_device,
618                                              s->free_bind,
619                                              s->directory_mode,
620                                              s->socket_mode,
621                                              &p->fd)) < 0)
622                                 goto rollback;
623
624                         socket_apply_socket_options(s, p->fd);
625
626                 } else {
627                         struct stat st;
628                         assert(p->type == SOCKET_FIFO);
629
630                         mkdir_parents(p->path, s->directory_mode);
631
632                         if (mkfifo(p->path, s->socket_mode) < 0 && errno != EEXIST) {
633                                 r = -errno;
634                                 goto rollback;
635                         }
636
637                         if ((p->fd = open(p->path, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW)) < 0) {
638                                 r = -errno;
639                                 goto rollback;
640                         }
641
642                         if (fstat(p->fd, &st) < 0) {
643                                 r = -errno;
644                                 goto rollback;
645                         }
646
647                         /* FIXME verify user, access mode */
648
649                         if (!S_ISFIFO(st.st_mode)) {
650                                 r = -EEXIST;
651                                 goto rollback;
652                         }
653
654                         socket_apply_pipe_options(s, p->fd);
655                 }
656         }
657
658         return 0;
659
660 rollback:
661         socket_close_fds(s);
662         return r;
663 }
664
665 static void socket_unwatch_fds(Socket *s) {
666         SocketPort *p;
667
668         assert(s);
669
670         LIST_FOREACH(port, p, s->ports) {
671                 if (p->fd < 0)
672                         continue;
673
674                 unit_unwatch_fd(UNIT(s), &p->fd_watch);
675         }
676 }
677
678 static int socket_watch_fds(Socket *s) {
679         SocketPort *p;
680         int r;
681
682         assert(s);
683
684         LIST_FOREACH(port, p, s->ports) {
685                 if (p->fd < 0)
686                         continue;
687
688                 p->fd_watch.socket_accept =
689                         s->accept &&
690                         p->type == SOCKET_SOCKET &&
691                         socket_address_can_accept(&p->address);
692
693                 if ((r = unit_watch_fd(UNIT(s), p->fd, EPOLLIN, &p->fd_watch)) < 0)
694                         goto fail;
695         }
696
697         return 0;
698
699 fail:
700         socket_unwatch_fds(s);
701         return r;
702 }
703
704 static void socket_set_state(Socket *s, SocketState state) {
705         SocketState old_state;
706         assert(s);
707
708         old_state = s->state;
709         s->state = state;
710
711         if (state != SOCKET_START_PRE &&
712             state != SOCKET_START_POST &&
713             state != SOCKET_STOP_PRE &&
714             state != SOCKET_STOP_PRE_SIGTERM &&
715             state != SOCKET_STOP_PRE_SIGKILL &&
716             state != SOCKET_STOP_POST &&
717             state != SOCKET_FINAL_SIGTERM &&
718             state != SOCKET_FINAL_SIGKILL) {
719                 unit_unwatch_timer(UNIT(s), &s->timer_watch);
720                 socket_unwatch_control_pid(s);
721                 s->control_command = NULL;
722                 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
723         }
724
725         if (state != SOCKET_LISTENING)
726                 socket_unwatch_fds(s);
727
728         if (state != SOCKET_START_POST &&
729             state != SOCKET_LISTENING &&
730             state != SOCKET_RUNNING &&
731             state != SOCKET_STOP_PRE &&
732             state != SOCKET_STOP_PRE_SIGTERM &&
733             state != SOCKET_STOP_PRE_SIGKILL)
734                 socket_close_fds(s);
735
736         if (state != old_state)
737                 log_debug("%s changed %s -> %s",
738                           s->meta.id,
739                           socket_state_to_string(old_state),
740                           socket_state_to_string(state));
741
742         unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state]);
743 }
744
745 static int socket_coldplug(Unit *u) {
746         Socket *s = SOCKET(u);
747         int r;
748
749         assert(s);
750         assert(s->state == SOCKET_DEAD);
751
752         if (s->deserialized_state != s->state) {
753
754                 if (s->deserialized_state == SOCKET_START_PRE ||
755                     s->deserialized_state == SOCKET_START_POST ||
756                     s->deserialized_state == SOCKET_STOP_PRE ||
757                     s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
758                     s->deserialized_state == SOCKET_STOP_PRE_SIGKILL ||
759                     s->deserialized_state == SOCKET_STOP_POST ||
760                     s->deserialized_state == SOCKET_FINAL_SIGTERM ||
761                     s->deserialized_state == SOCKET_FINAL_SIGKILL) {
762
763                         if (s->control_pid <= 0)
764                                 return -EBADMSG;
765
766                         if ((r = unit_watch_pid(UNIT(s), s->control_pid)) < 0)
767                                 return r;
768
769                         if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
770                                 return r;
771                 }
772
773                 if (s->deserialized_state == SOCKET_START_POST ||
774                     s->deserialized_state == SOCKET_LISTENING ||
775                     s->deserialized_state == SOCKET_RUNNING ||
776                     s->deserialized_state == SOCKET_STOP_PRE ||
777                     s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
778                     s->deserialized_state == SOCKET_STOP_PRE_SIGKILL)
779                         if ((r = socket_open_fds(s)) < 0)
780                                 return r;
781
782                 if (s->deserialized_state == SOCKET_LISTENING)
783                         if ((r = socket_watch_fds(s)) < 0)
784                                 return r;
785
786                 socket_set_state(s, s->deserialized_state);
787         }
788
789         return 0;
790 }
791
792 static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
793         pid_t pid;
794         int r;
795         char **argv;
796
797         assert(s);
798         assert(c);
799         assert(_pid);
800
801         if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
802                 goto fail;
803
804         if (!(argv = unit_full_printf_strv(UNIT(s), c->argv))) {
805                 r = -ENOMEM;
806                 goto fail;
807         }
808
809         r = exec_spawn(c,
810                        argv,
811                        &s->exec_context,
812                        NULL, 0,
813                        s->meta.manager->environment,
814                        true,
815                        true,
816                        s->meta.manager->confirm_spawn,
817                        s->meta.cgroup_bondings,
818                        &pid);
819
820         strv_free(argv);
821         if (r < 0)
822                 goto fail;
823
824         if ((r = unit_watch_pid(UNIT(s), pid)) < 0)
825                 /* FIXME: we need to do something here */
826                 goto fail;
827
828         *_pid = pid;
829
830         return 0;
831
832 fail:
833         unit_unwatch_timer(UNIT(s), &s->timer_watch);
834
835         return r;
836 }
837
838 static void socket_enter_dead(Socket *s, bool success) {
839         assert(s);
840
841         if (!success)
842                 s->failure = true;
843
844         socket_set_state(s, s->failure ? SOCKET_MAINTENANCE : SOCKET_DEAD);
845 }
846
847 static void socket_enter_signal(Socket *s, SocketState state, bool success);
848
849 static void socket_enter_stop_post(Socket *s, bool success) {
850         int r;
851         assert(s);
852
853         if (!success)
854                 s->failure = true;
855
856         socket_unwatch_control_pid(s);
857
858         s->control_command_id = SOCKET_EXEC_STOP_POST;
859
860         if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST])) {
861                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
862                         goto fail;
863
864                 socket_set_state(s, SOCKET_STOP_POST);
865         } else
866                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, true);
867
868         return;
869
870 fail:
871         log_warning("%s failed to run 'stop-post' task: %s", s->meta.id, strerror(-r));
872         socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
873 }
874
875 static void socket_enter_signal(Socket *s, SocketState state, bool success) {
876         int r;
877         bool sent = false;
878
879         assert(s);
880
881         if (!success)
882                 s->failure = true;
883
884         if (s->kill_mode != KILL_NONE) {
885                 int sig = (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_FINAL_SIGTERM) ? SIGTERM : SIGKILL;
886
887                 if (s->kill_mode == KILL_CONTROL_GROUP) {
888
889                         if ((r = cgroup_bonding_kill_list(s->meta.cgroup_bondings, sig)) < 0) {
890                                 if (r != -EAGAIN && r != -ESRCH)
891                                         goto fail;
892                         } else
893                                 sent = true;
894                 }
895
896                 if (!sent && s->control_pid > 0)
897                         if (kill(s->kill_mode == KILL_PROCESS ? s->control_pid : -s->control_pid, sig) < 0 && errno != ESRCH) {
898                                 r = -errno;
899                                 goto fail;
900                         }
901         }
902
903         if (sent && s->control_pid > 0) {
904                 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
905                         goto fail;
906
907                 socket_set_state(s, state);
908         } else if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
909                 socket_enter_stop_post(s, true);
910         else
911                 socket_enter_dead(s, true);
912
913         return;
914
915 fail:
916         log_warning("%s failed to kill processes: %s", s->meta.id, strerror(-r));
917
918         if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
919                 socket_enter_stop_post(s, false);
920         else
921                 socket_enter_dead(s, false);
922 }
923
924 static void socket_enter_stop_pre(Socket *s, bool success) {
925         int r;
926         assert(s);
927
928         if (!success)
929                 s->failure = true;
930
931         socket_unwatch_control_pid(s);
932
933         s->control_command_id = SOCKET_EXEC_STOP_PRE;
934
935         if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE])) {
936                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
937                         goto fail;
938
939                 socket_set_state(s, SOCKET_STOP_PRE);
940         } else
941                 socket_enter_stop_post(s, true);
942
943         return;
944
945 fail:
946         log_warning("%s failed to run 'stop-pre' task: %s", s->meta.id, strerror(-r));
947         socket_enter_stop_post(s, false);
948 }
949
950 static void socket_enter_listening(Socket *s) {
951         int r;
952         assert(s);
953
954         if ((r = socket_watch_fds(s)) < 0) {
955                 log_warning("%s failed to watch sockets: %s", s->meta.id, strerror(-r));
956                 goto fail;
957         }
958
959         socket_set_state(s, SOCKET_LISTENING);
960         return;
961
962 fail:
963         socket_enter_stop_pre(s, false);
964 }
965
966 static void socket_enter_start_post(Socket *s) {
967         int r;
968         assert(s);
969
970         if ((r = socket_open_fds(s)) < 0) {
971                 log_warning("%s failed to listen on sockets: %s", s->meta.id, strerror(-r));
972                 goto fail;
973         }
974
975         socket_unwatch_control_pid(s);
976
977         s->control_command_id = SOCKET_EXEC_START_POST;
978
979         if ((s->control_command = s->exec_command[SOCKET_EXEC_START_POST])) {
980                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0) {
981                         log_warning("%s failed to run 'start-post' task: %s", s->meta.id, strerror(-r));
982                         goto fail;
983                 }
984
985                 socket_set_state(s, SOCKET_START_POST);
986         } else
987                 socket_enter_listening(s);
988
989         return;
990
991 fail:
992         socket_enter_stop_pre(s, false);
993 }
994
995 static void socket_enter_start_pre(Socket *s) {
996         int r;
997         assert(s);
998
999         socket_unwatch_control_pid(s);
1000
1001         s->control_command_id = SOCKET_EXEC_START_PRE;
1002
1003         if ((s->control_command = s->exec_command[SOCKET_EXEC_START_PRE])) {
1004                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1005                         goto fail;
1006
1007                 socket_set_state(s, SOCKET_START_PRE);
1008         } else
1009                 socket_enter_start_post(s);
1010
1011         return;
1012
1013 fail:
1014         log_warning("%s failed to run 'start-pre' task: %s", s->meta.id, strerror(-r));
1015         socket_enter_dead(s, false);
1016 }
1017
1018 static void socket_enter_running(Socket *s, int cfd) {
1019         int r;
1020
1021         assert(s);
1022
1023         if (cfd < 0) {
1024                 if ((r = manager_add_job(s->meta.manager, JOB_START, UNIT(s->service), JOB_REPLACE, true, NULL)) < 0)
1025                         goto fail;
1026
1027                 socket_set_state(s, SOCKET_RUNNING);
1028         } else {
1029                 Unit *u;
1030                 char *prefix, *instance, *name;
1031
1032                 if (s->n_connections >= s->max_connections) {
1033                         log_warning("Too many incoming connections (%u)", s->n_connections);
1034                         close_nointr_nofail(cfd);
1035                         return;
1036                 }
1037
1038                 if ((r = instance_from_socket(cfd, s->n_accepted++, &instance)) < 0)
1039                         goto fail;
1040
1041                 if (!(prefix = unit_name_to_prefix(s->meta.id))) {
1042                         free(instance);
1043                         r = -ENOMEM;
1044                         goto fail;
1045                 }
1046
1047                 name = unit_name_build(prefix, instance, ".service");
1048                 free(prefix);
1049                 free(instance);
1050
1051                 if (!name) {
1052                         r = -ENOMEM;
1053                         goto fail;
1054                 }
1055
1056                 r = manager_load_unit(s->meta.manager, name, NULL, &u);
1057                 free(name);
1058
1059                 if (r < 0)
1060                         goto fail;
1061
1062                 if ((r = service_set_socket_fd(SERVICE(u), cfd, s)) < 0)
1063                         goto fail;
1064
1065                 cfd = -1;
1066
1067                 s->n_connections ++;
1068
1069                 if ((r = manager_add_job(u->meta.manager, JOB_START, u, JOB_REPLACE, true, NULL)) < 0)
1070                         goto fail;
1071         }
1072
1073         return;
1074
1075 fail:
1076         log_warning("%s failed to queue socket startup job: %s", s->meta.id, strerror(-r));
1077         socket_enter_stop_pre(s, false);
1078
1079         if (cfd >= 0)
1080                 close_nointr_nofail(cfd);
1081 }
1082
1083 static void socket_run_next(Socket *s, bool success) {
1084         int r;
1085
1086         assert(s);
1087         assert(s->control_command);
1088         assert(s->control_command->command_next);
1089
1090         if (!success)
1091                 s->failure = true;
1092
1093         socket_unwatch_control_pid(s);
1094
1095         s->control_command = s->control_command->command_next;
1096
1097         if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1098                 goto fail;
1099
1100         return;
1101
1102 fail:
1103         log_warning("%s failed to run next task: %s", s->meta.id, strerror(-r));
1104
1105         if (s->state == SOCKET_START_POST)
1106                 socket_enter_stop_pre(s, false);
1107         else if (s->state == SOCKET_STOP_POST)
1108                 socket_enter_dead(s, false);
1109         else
1110                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1111 }
1112
1113 static int socket_start(Unit *u) {
1114         Socket *s = SOCKET(u);
1115
1116         assert(s);
1117
1118         /* We cannot fulfill this request right now, try again later
1119          * please! */
1120         if (s->state == SOCKET_STOP_PRE ||
1121             s->state == SOCKET_STOP_PRE_SIGKILL ||
1122             s->state == SOCKET_STOP_PRE_SIGTERM ||
1123             s->state == SOCKET_STOP_POST ||
1124             s->state == SOCKET_FINAL_SIGTERM ||
1125             s->state == SOCKET_FINAL_SIGKILL)
1126                 return -EAGAIN;
1127
1128         if (s->state == SOCKET_START_PRE ||
1129             s->state == SOCKET_START_POST)
1130                 return 0;
1131
1132         /* Cannot run this without the service being around */
1133         if (s->service) {
1134                 if (s->service->meta.load_state != UNIT_LOADED)
1135                         return -ENOENT;
1136
1137                 /* If the service is alredy actvie we cannot start the
1138                  * socket */
1139                 if (s->service->state != SERVICE_DEAD &&
1140                     s->service->state != SERVICE_MAINTENANCE &&
1141                     s->service->state != SERVICE_AUTO_RESTART)
1142                         return -EBUSY;
1143         }
1144
1145         assert(s->state == SOCKET_DEAD || s->state == SOCKET_MAINTENANCE);
1146
1147         s->failure = false;
1148         socket_enter_start_pre(s);
1149         return 0;
1150 }
1151
1152 static int socket_stop(Unit *u) {
1153         Socket *s = SOCKET(u);
1154
1155         assert(s);
1156
1157         /* We cannot fulfill this request right now, try again later
1158          * please! */
1159         if (s->state == SOCKET_START_PRE ||
1160             s->state == SOCKET_START_POST)
1161                 return -EAGAIN;
1162
1163         /* Already on it */
1164         if (s->state == SOCKET_STOP_PRE ||
1165             s->state == SOCKET_STOP_PRE_SIGTERM ||
1166             s->state == SOCKET_STOP_PRE_SIGKILL ||
1167             s->state == SOCKET_STOP_POST ||
1168             s->state == SOCKET_FINAL_SIGTERM ||
1169             s->state == SOCKET_FINAL_SIGTERM)
1170                 return 0;
1171
1172         assert(s->state == SOCKET_LISTENING || s->state == SOCKET_RUNNING);
1173
1174         socket_enter_stop_pre(s, true);
1175         return 0;
1176 }
1177
1178 static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
1179         Socket *s = SOCKET(u);
1180         SocketPort *p;
1181         int r;
1182
1183         assert(u);
1184         assert(f);
1185         assert(fds);
1186
1187         unit_serialize_item(u, f, "state", socket_state_to_string(s->state));
1188         unit_serialize_item(u, f, "failure", yes_no(s->failure));
1189         unit_serialize_item_format(u, f, "n-accepted", "%u", s->n_accepted);
1190
1191         if (s->control_pid > 0)
1192                 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid);
1193
1194         if (s->control_command_id >= 0)
1195                 unit_serialize_item(u, f, "control-command", socket_exec_command_to_string(s->control_command_id));
1196
1197         LIST_FOREACH(port, p, s->ports) {
1198                 int copy;
1199
1200                 if (p->fd < 0)
1201                         continue;
1202
1203                 if ((copy = fdset_put_dup(fds, p->fd)) < 0)
1204                         return copy;
1205
1206                 if (p->type == SOCKET_SOCKET) {
1207                         char *t;
1208
1209                         if ((r = socket_address_print(&p->address, &t)) < 0)
1210                                 return r;
1211
1212                         unit_serialize_item_format(u, f, "socket", "%i %i %s", copy, p->address.type, t);
1213                         free(t);
1214                 } else {
1215                         assert(p->type == SOCKET_FIFO);
1216                         unit_serialize_item_format(u, f, "fifo", "%i %s", copy, p->path);
1217                 }
1218         }
1219
1220         return 0;
1221 }
1222
1223 static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1224         Socket *s = SOCKET(u);
1225         int r;
1226
1227         assert(u);
1228         assert(key);
1229         assert(value);
1230         assert(fds);
1231
1232         if (streq(key, "state")) {
1233                 SocketState state;
1234
1235                 if ((state = socket_state_from_string(value)) < 0)
1236                         log_debug("Failed to parse state value %s", value);
1237                 else
1238                         s->deserialized_state = state;
1239         } else if (streq(key, "failure")) {
1240                 int b;
1241
1242                 if ((b = parse_boolean(value)) < 0)
1243                         log_debug("Failed to parse failure value %s", value);
1244                 else
1245                         s->failure = b || s->failure;
1246
1247         } else if (streq(key, "n-accepted")) {
1248                 unsigned k;
1249
1250                 if ((r = safe_atou(value, &k)) < 0)
1251                         log_debug("Failed to parse n-accepted value %s", value);
1252                 else
1253                         s->n_accepted += k;
1254         } else if (streq(key, "control-pid")) {
1255                 pid_t pid;
1256
1257                 if ((r = parse_pid(value, &pid)) < 0)
1258                         log_debug("Failed to parse control-pid value %s", value);
1259                 else
1260                         s->control_pid = pid;
1261         } else if (streq(key, "control-command")) {
1262                 SocketExecCommand id;
1263
1264                 if ((id = socket_exec_command_from_string(value)) < 0)
1265                         log_debug("Failed to parse exec-command value %s", value);
1266                 else {
1267                         s->control_command_id = id;
1268                         s->control_command = s->exec_command[id];
1269                 }
1270         } else if (streq(key, "fifo")) {
1271                 int fd, skip = 0;
1272                 SocketPort *p;
1273
1274                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1275                         log_debug("Failed to parse fifo value %s", value);
1276                 else {
1277
1278                         LIST_FOREACH(port, p, s->ports)
1279                                 if (streq(p->path, value+skip))
1280                                         break;
1281
1282                         if (p) {
1283                                 if (p->fd >= 0)
1284                                         close_nointr_nofail(p->fd);
1285                                 p->fd = fdset_remove(fds, fd);
1286                         }
1287                 }
1288
1289         } else if (streq(key, "socket")) {
1290                 int fd, type, skip = 0;
1291                 SocketPort *p;
1292
1293                 if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd))
1294                         log_debug("Failed to parse socket value %s", value);
1295                 else {
1296
1297                         LIST_FOREACH(port, p, s->ports)
1298                                 if (socket_address_is(&p->address, value+skip, type))
1299                                         break;
1300
1301                         if (p) {
1302                                 if (p->fd >= 0)
1303                                         close_nointr_nofail(p->fd);
1304                                 p->fd = fdset_remove(fds, fd);
1305                         }
1306                 }
1307
1308         } else
1309                 log_debug("Unknown serialization key '%s'", key);
1310
1311         return 0;
1312 }
1313
1314 static UnitActiveState socket_active_state(Unit *u) {
1315         assert(u);
1316
1317         return state_translation_table[SOCKET(u)->state];
1318 }
1319
1320 static const char *socket_sub_state_to_string(Unit *u) {
1321         assert(u);
1322
1323         return socket_state_to_string(SOCKET(u)->state);
1324 }
1325
1326 static bool socket_check_gc(Unit *u) {
1327         Socket *s = SOCKET(u);
1328
1329         assert(u);
1330
1331         return s->n_connections > 0;
1332 }
1333
1334 static void socket_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
1335         Socket *s = SOCKET(u);
1336         int cfd = -1;
1337
1338         assert(s);
1339         assert(fd >= 0);
1340
1341         if (s->state != SOCKET_LISTENING)
1342                 return;
1343
1344         log_debug("Incoming traffic on %s", u->meta.id);
1345
1346         if (events != EPOLLIN) {
1347                 log_error("Got invalid poll event on socket.");
1348                 goto fail;
1349         }
1350
1351         if (w->socket_accept) {
1352                 for (;;) {
1353
1354                         if ((cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK)) < 0) {
1355
1356                                 if (errno == EINTR)
1357                                         continue;
1358
1359                                 log_error("Failed to accept socket: %m");
1360                                 goto fail;
1361                         }
1362
1363                         break;
1364                 }
1365
1366                 socket_apply_socket_options(s, cfd);
1367         }
1368
1369         socket_enter_running(s, cfd);
1370         return;
1371
1372 fail:
1373         socket_enter_stop_pre(s, false);
1374 }
1375
1376 static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1377         Socket *s = SOCKET(u);
1378         bool success;
1379
1380         assert(s);
1381         assert(pid >= 0);
1382
1383         if (pid != s->control_pid)
1384                 return;
1385
1386         s->control_pid = 0;
1387
1388         success = is_clean_exit(code, status);
1389         s->failure = s->failure || !success;
1390
1391         if (s->control_command)
1392                 exec_status_fill(&s->control_command->exec_status, pid, code, status);
1393
1394         log_debug("%s control process exited, code=%s status=%i", u->meta.id, sigchld_code_to_string(code), status);
1395
1396         if (s->control_command && s->control_command->command_next && success) {
1397                 log_debug("%s running next command for state %s", u->meta.id, socket_state_to_string(s->state));
1398                 socket_run_next(s, success);
1399         } else {
1400                 s->control_command = NULL;
1401                 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
1402
1403                 /* No further commands for this step, so let's figure
1404                  * out what to do next */
1405
1406                 log_debug("%s got final SIGCHLD for state %s", u->meta.id, socket_state_to_string(s->state));
1407
1408                 switch (s->state) {
1409
1410                 case SOCKET_START_PRE:
1411                         if (success)
1412                                 socket_enter_start_post(s);
1413                         else
1414                                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1415                         break;
1416
1417                 case SOCKET_START_POST:
1418                         if (success)
1419                                 socket_enter_listening(s);
1420                         else
1421                                 socket_enter_stop_pre(s, false);
1422                         break;
1423
1424                 case SOCKET_STOP_PRE:
1425                 case SOCKET_STOP_PRE_SIGTERM:
1426                 case SOCKET_STOP_PRE_SIGKILL:
1427                         socket_enter_stop_post(s, success);
1428                         break;
1429
1430                 case SOCKET_STOP_POST:
1431                 case SOCKET_FINAL_SIGTERM:
1432                 case SOCKET_FINAL_SIGKILL:
1433                         socket_enter_dead(s, success);
1434                         break;
1435
1436                 default:
1437                         assert_not_reached("Uh, control process died at wrong time.");
1438                 }
1439         }
1440 }
1441
1442 static void socket_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1443         Socket *s = SOCKET(u);
1444
1445         assert(s);
1446         assert(elapsed == 1);
1447         assert(w == &s->timer_watch);
1448
1449         switch (s->state) {
1450
1451         case SOCKET_START_PRE:
1452                 log_warning("%s starting timed out. Terminating.", u->meta.id);
1453                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1454
1455         case SOCKET_START_POST:
1456                 log_warning("%s starting timed out. Stopping.", u->meta.id);
1457                 socket_enter_stop_pre(s, false);
1458                 break;
1459
1460         case SOCKET_STOP_PRE:
1461                 log_warning("%s stopping timed out. Terminating.", u->meta.id);
1462                 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, false);
1463                 break;
1464
1465         case SOCKET_STOP_PRE_SIGTERM:
1466                 log_warning("%s stopping timed out. Killing.", u->meta.id);
1467                 socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, false);
1468                 break;
1469
1470         case SOCKET_STOP_PRE_SIGKILL:
1471                 log_warning("%s still around after SIGKILL. Ignoring.", u->meta.id);
1472                 socket_enter_stop_post(s, false);
1473                 break;
1474
1475         case SOCKET_STOP_POST:
1476                 log_warning("%s stopping timed out (2). Terminating.", u->meta.id);
1477                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1478                 break;
1479
1480         case SOCKET_FINAL_SIGTERM:
1481                 log_warning("%s stopping timed out (2). Killing.", u->meta.id);
1482                 socket_enter_signal(s, SOCKET_FINAL_SIGKILL, false);
1483                 break;
1484
1485         case SOCKET_FINAL_SIGKILL:
1486                 log_warning("%s still around after SIGKILL (2). Entering maintenance mode.", u->meta.id);
1487                 socket_enter_dead(s, false);
1488                 break;
1489
1490         default:
1491                 assert_not_reached("Timeout at wrong time.");
1492         }
1493 }
1494
1495 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
1496         int *rfds;
1497         unsigned rn_fds, k;
1498         SocketPort *p;
1499
1500         assert(s);
1501         assert(fds);
1502         assert(n_fds);
1503
1504         /* Called from the service code for requesting our fds */
1505
1506         rn_fds = 0;
1507         LIST_FOREACH(port, p, s->ports)
1508                 if (p->fd >= 0)
1509                         rn_fds++;
1510
1511         if (!(rfds = new(int, rn_fds)) < 0)
1512                 return -ENOMEM;
1513
1514         k = 0;
1515         LIST_FOREACH(port, p, s->ports)
1516                 if (p->fd >= 0)
1517                         rfds[k++] = p->fd;
1518
1519         assert(k == rn_fds);
1520
1521         *fds = rfds;
1522         *n_fds = rn_fds;
1523
1524         return 0;
1525 }
1526
1527 void socket_notify_service_dead(Socket *s) {
1528         assert(s);
1529
1530         /* The service is dead. Dang!
1531          *
1532          * This is strictly for one-instance-for-all-connections
1533          * services. */
1534
1535         if (s->state == SOCKET_RUNNING) {
1536                 log_debug("%s got notified about service death.", s->meta.id);
1537                 socket_enter_listening(s);
1538         }
1539 }
1540
1541 void socket_connection_unref(Socket *s) {
1542         assert(s);
1543
1544         /* The service is dead. Yay!
1545          *
1546          * This is strictly for one-onstance-per-connection
1547          * services. */
1548
1549         assert(s->n_connections > 0);
1550         s->n_connections--;
1551
1552         log_debug("%s: One connection closed, %u left.", s->meta.id, s->n_connections);
1553 }
1554
1555 static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
1556         [SOCKET_DEAD] = "dead",
1557         [SOCKET_START_PRE] = "start-pre",
1558         [SOCKET_START_POST] = "start-post",
1559         [SOCKET_LISTENING] = "listening",
1560         [SOCKET_RUNNING] = "running",
1561         [SOCKET_STOP_PRE] = "stop-pre",
1562         [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
1563         [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
1564         [SOCKET_STOP_POST] = "stop-post",
1565         [SOCKET_FINAL_SIGTERM] = "final-sigterm",
1566         [SOCKET_FINAL_SIGKILL] = "final-sigkill",
1567         [SOCKET_MAINTENANCE] = "maintenance"
1568 };
1569
1570 DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
1571
1572 static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
1573         [SOCKET_EXEC_START_PRE] = "StartPre",
1574         [SOCKET_EXEC_START_POST] = "StartPost",
1575         [SOCKET_EXEC_STOP_PRE] = "StopPre",
1576         [SOCKET_EXEC_STOP_POST] = "StopPost"
1577 };
1578
1579 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
1580
1581 const UnitVTable socket_vtable = {
1582         .suffix = ".socket",
1583
1584         .init = socket_init,
1585         .done = socket_done,
1586         .load = socket_load,
1587
1588         .coldplug = socket_coldplug,
1589
1590         .dump = socket_dump,
1591
1592         .start = socket_start,
1593         .stop = socket_stop,
1594
1595         .serialize = socket_serialize,
1596         .deserialize_item = socket_deserialize_item,
1597
1598         .active_state = socket_active_state,
1599         .sub_state_to_string = socket_sub_state_to_string,
1600
1601         .check_gc = socket_check_gc,
1602
1603         .fd_event = socket_fd_event,
1604         .sigchld_event = socket_sigchld_event,
1605         .timer_event = socket_timer_event,
1606
1607         .bus_message_handler = bus_socket_message_handler
1608 };