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