chiark / gitweb /
dbus: make errors reported via D-Bus more useful
[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                        s->meta.manager->confirm_spawn,
826                        s->meta.cgroup_bondings,
827                        &pid);
828
829         strv_free(argv);
830         if (r < 0)
831                 goto fail;
832
833         if ((r = unit_watch_pid(UNIT(s), pid)) < 0)
834                 /* FIXME: we need to do something here */
835                 goto fail;
836
837         *_pid = pid;
838
839         return 0;
840
841 fail:
842         unit_unwatch_timer(UNIT(s), &s->timer_watch);
843
844         return r;
845 }
846
847 static void socket_enter_dead(Socket *s, bool success) {
848         assert(s);
849
850         if (!success)
851                 s->failure = true;
852
853         socket_set_state(s, s->failure ? SOCKET_MAINTENANCE : SOCKET_DEAD);
854 }
855
856 static void socket_enter_signal(Socket *s, SocketState state, bool success);
857
858 static void socket_enter_stop_post(Socket *s, bool success) {
859         int r;
860         assert(s);
861
862         if (!success)
863                 s->failure = true;
864
865         socket_unwatch_control_pid(s);
866
867         s->control_command_id = SOCKET_EXEC_STOP_POST;
868
869         if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST])) {
870                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
871                         goto fail;
872
873                 socket_set_state(s, SOCKET_STOP_POST);
874         } else
875                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, true);
876
877         return;
878
879 fail:
880         log_warning("%s failed to run 'stop-post' task: %s", s->meta.id, strerror(-r));
881         socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
882 }
883
884 static void socket_enter_signal(Socket *s, SocketState state, bool success) {
885         int r;
886         bool sent = false;
887
888         assert(s);
889
890         if (!success)
891                 s->failure = true;
892
893         if (s->kill_mode != KILL_NONE) {
894                 int sig = (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_FINAL_SIGTERM) ? SIGTERM : SIGKILL;
895
896                 if (s->kill_mode == KILL_CONTROL_GROUP) {
897
898                         if ((r = cgroup_bonding_kill_list(s->meta.cgroup_bondings, sig)) < 0) {
899                                 if (r != -EAGAIN && r != -ESRCH)
900                                         goto fail;
901                         } else
902                                 sent = true;
903                 }
904
905                 if (!sent && s->control_pid > 0)
906                         if (kill(s->kill_mode == KILL_PROCESS ? s->control_pid : -s->control_pid, sig) < 0 && errno != ESRCH) {
907                                 r = -errno;
908                                 goto fail;
909                         }
910         }
911
912         if (sent && s->control_pid > 0) {
913                 if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
914                         goto fail;
915
916                 socket_set_state(s, state);
917         } else if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
918                 socket_enter_stop_post(s, true);
919         else
920                 socket_enter_dead(s, true);
921
922         return;
923
924 fail:
925         log_warning("%s failed to kill processes: %s", s->meta.id, strerror(-r));
926
927         if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
928                 socket_enter_stop_post(s, false);
929         else
930                 socket_enter_dead(s, false);
931 }
932
933 static void socket_enter_stop_pre(Socket *s, bool success) {
934         int r;
935         assert(s);
936
937         if (!success)
938                 s->failure = true;
939
940         socket_unwatch_control_pid(s);
941
942         s->control_command_id = SOCKET_EXEC_STOP_PRE;
943
944         if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE])) {
945                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
946                         goto fail;
947
948                 socket_set_state(s, SOCKET_STOP_PRE);
949         } else
950                 socket_enter_stop_post(s, true);
951
952         return;
953
954 fail:
955         log_warning("%s failed to run 'stop-pre' task: %s", s->meta.id, strerror(-r));
956         socket_enter_stop_post(s, false);
957 }
958
959 static void socket_enter_listening(Socket *s) {
960         int r;
961         assert(s);
962
963         if ((r = socket_watch_fds(s)) < 0) {
964                 log_warning("%s failed to watch sockets: %s", s->meta.id, strerror(-r));
965                 goto fail;
966         }
967
968         socket_set_state(s, SOCKET_LISTENING);
969         return;
970
971 fail:
972         socket_enter_stop_pre(s, false);
973 }
974
975 static void socket_enter_start_post(Socket *s) {
976         int r;
977         assert(s);
978
979         if ((r = socket_open_fds(s)) < 0) {
980                 log_warning("%s failed to listen on sockets: %s", s->meta.id, strerror(-r));
981                 goto fail;
982         }
983
984         socket_unwatch_control_pid(s);
985
986         s->control_command_id = SOCKET_EXEC_START_POST;
987
988         if ((s->control_command = s->exec_command[SOCKET_EXEC_START_POST])) {
989                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0) {
990                         log_warning("%s failed to run 'start-post' task: %s", s->meta.id, strerror(-r));
991                         goto fail;
992                 }
993
994                 socket_set_state(s, SOCKET_START_POST);
995         } else
996                 socket_enter_listening(s);
997
998         return;
999
1000 fail:
1001         socket_enter_stop_pre(s, false);
1002 }
1003
1004 static void socket_enter_start_pre(Socket *s) {
1005         int r;
1006         assert(s);
1007
1008         socket_unwatch_control_pid(s);
1009
1010         s->control_command_id = SOCKET_EXEC_START_PRE;
1011
1012         if ((s->control_command = s->exec_command[SOCKET_EXEC_START_PRE])) {
1013                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1014                         goto fail;
1015
1016                 socket_set_state(s, SOCKET_START_PRE);
1017         } else
1018                 socket_enter_start_post(s);
1019
1020         return;
1021
1022 fail:
1023         log_warning("%s failed to run 'start-pre' task: %s", s->meta.id, strerror(-r));
1024         socket_enter_dead(s, false);
1025 }
1026
1027 static void socket_enter_running(Socket *s, int cfd) {
1028         int r;
1029         DBusError error;
1030
1031         assert(s);
1032         dbus_error_init(&error);
1033
1034         if (cfd < 0) {
1035                 if ((r = manager_add_job(s->meta.manager, JOB_START, UNIT(s->service), JOB_REPLACE, true, &error, NULL)) < 0)
1036                         goto fail;
1037
1038                 socket_set_state(s, SOCKET_RUNNING);
1039         } else {
1040                 Unit *u;
1041                 char *prefix, *instance, *name;
1042
1043                 if (s->n_connections >= s->max_connections) {
1044                         log_warning("Too many incoming connections (%u)", s->n_connections);
1045                         close_nointr_nofail(cfd);
1046                         return;
1047                 }
1048
1049                 if ((r = instance_from_socket(cfd, s->n_accepted++, &instance)) < 0)
1050                         goto fail;
1051
1052                 if (!(prefix = unit_name_to_prefix(s->meta.id))) {
1053                         free(instance);
1054                         r = -ENOMEM;
1055                         goto fail;
1056                 }
1057
1058                 name = unit_name_build(prefix, instance, ".service");
1059                 free(prefix);
1060                 free(instance);
1061
1062                 if (!name) {
1063                         r = -ENOMEM;
1064                         goto fail;
1065                 }
1066
1067                 r = manager_load_unit(s->meta.manager, name, NULL, NULL, &u);
1068                 free(name);
1069
1070                 if (r < 0)
1071                         goto fail;
1072
1073                 if ((r = service_set_socket_fd(SERVICE(u), cfd, s)) < 0)
1074                         goto fail;
1075
1076                 cfd = -1;
1077
1078                 s->n_connections ++;
1079
1080                 if ((r = manager_add_job(u->meta.manager, JOB_START, u, JOB_REPLACE, true, &error, NULL)) < 0)
1081                         goto fail;
1082         }
1083
1084         return;
1085
1086 fail:
1087         log_warning("%s failed to queue socket startup job: %s", s->meta.id, bus_error(&error, r));
1088         socket_enter_stop_pre(s, false);
1089
1090         if (cfd >= 0)
1091                 close_nointr_nofail(cfd);
1092
1093         dbus_error_free(&error);
1094 }
1095
1096 static void socket_run_next(Socket *s, bool success) {
1097         int r;
1098
1099         assert(s);
1100         assert(s->control_command);
1101         assert(s->control_command->command_next);
1102
1103         if (!success)
1104                 s->failure = true;
1105
1106         socket_unwatch_control_pid(s);
1107
1108         s->control_command = s->control_command->command_next;
1109
1110         if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1111                 goto fail;
1112
1113         return;
1114
1115 fail:
1116         log_warning("%s failed to run next task: %s", s->meta.id, strerror(-r));
1117
1118         if (s->state == SOCKET_START_POST)
1119                 socket_enter_stop_pre(s, false);
1120         else if (s->state == SOCKET_STOP_POST)
1121                 socket_enter_dead(s, false);
1122         else
1123                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1124 }
1125
1126 static int socket_start(Unit *u) {
1127         Socket *s = SOCKET(u);
1128
1129         assert(s);
1130
1131         /* We cannot fulfill this request right now, try again later
1132          * please! */
1133         if (s->state == SOCKET_STOP_PRE ||
1134             s->state == SOCKET_STOP_PRE_SIGKILL ||
1135             s->state == SOCKET_STOP_PRE_SIGTERM ||
1136             s->state == SOCKET_STOP_POST ||
1137             s->state == SOCKET_FINAL_SIGTERM ||
1138             s->state == SOCKET_FINAL_SIGKILL)
1139                 return -EAGAIN;
1140
1141         if (s->state == SOCKET_START_PRE ||
1142             s->state == SOCKET_START_POST)
1143                 return 0;
1144
1145         /* Cannot run this without the service being around */
1146         if (s->service) {
1147                 if (s->service->meta.load_state != UNIT_LOADED)
1148                         return -ENOENT;
1149
1150                 /* If the service is alredy actvie we cannot start the
1151                  * socket */
1152                 if (s->service->state != SERVICE_DEAD &&
1153                     s->service->state != SERVICE_MAINTENANCE &&
1154                     s->service->state != SERVICE_AUTO_RESTART)
1155                         return -EBUSY;
1156         }
1157
1158         assert(s->state == SOCKET_DEAD || s->state == SOCKET_MAINTENANCE);
1159
1160         s->failure = false;
1161         socket_enter_start_pre(s);
1162         return 0;
1163 }
1164
1165 static int socket_stop(Unit *u) {
1166         Socket *s = SOCKET(u);
1167
1168         assert(s);
1169
1170         /* We cannot fulfill this request right now, try again later
1171          * please! */
1172         if (s->state == SOCKET_START_PRE ||
1173             s->state == SOCKET_START_POST)
1174                 return -EAGAIN;
1175
1176         /* Already on it */
1177         if (s->state == SOCKET_STOP_PRE ||
1178             s->state == SOCKET_STOP_PRE_SIGTERM ||
1179             s->state == SOCKET_STOP_PRE_SIGKILL ||
1180             s->state == SOCKET_STOP_POST ||
1181             s->state == SOCKET_FINAL_SIGTERM ||
1182             s->state == SOCKET_FINAL_SIGTERM)
1183                 return 0;
1184
1185         assert(s->state == SOCKET_LISTENING || s->state == SOCKET_RUNNING);
1186
1187         socket_enter_stop_pre(s, true);
1188         return 0;
1189 }
1190
1191 static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
1192         Socket *s = SOCKET(u);
1193         SocketPort *p;
1194         int r;
1195
1196         assert(u);
1197         assert(f);
1198         assert(fds);
1199
1200         unit_serialize_item(u, f, "state", socket_state_to_string(s->state));
1201         unit_serialize_item(u, f, "failure", yes_no(s->failure));
1202         unit_serialize_item_format(u, f, "n-accepted", "%u", s->n_accepted);
1203
1204         if (s->control_pid > 0)
1205                 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid);
1206
1207         if (s->control_command_id >= 0)
1208                 unit_serialize_item(u, f, "control-command", socket_exec_command_to_string(s->control_command_id));
1209
1210         LIST_FOREACH(port, p, s->ports) {
1211                 int copy;
1212
1213                 if (p->fd < 0)
1214                         continue;
1215
1216                 if ((copy = fdset_put_dup(fds, p->fd)) < 0)
1217                         return copy;
1218
1219                 if (p->type == SOCKET_SOCKET) {
1220                         char *t;
1221
1222                         if ((r = socket_address_print(&p->address, &t)) < 0)
1223                                 return r;
1224
1225                         unit_serialize_item_format(u, f, "socket", "%i %i %s", copy, p->address.type, t);
1226                         free(t);
1227                 } else {
1228                         assert(p->type == SOCKET_FIFO);
1229                         unit_serialize_item_format(u, f, "fifo", "%i %s", copy, p->path);
1230                 }
1231         }
1232
1233         return 0;
1234 }
1235
1236 static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1237         Socket *s = SOCKET(u);
1238         int r;
1239
1240         assert(u);
1241         assert(key);
1242         assert(value);
1243         assert(fds);
1244
1245         if (streq(key, "state")) {
1246                 SocketState state;
1247
1248                 if ((state = socket_state_from_string(value)) < 0)
1249                         log_debug("Failed to parse state value %s", value);
1250                 else
1251                         s->deserialized_state = state;
1252         } else if (streq(key, "failure")) {
1253                 int b;
1254
1255                 if ((b = parse_boolean(value)) < 0)
1256                         log_debug("Failed to parse failure value %s", value);
1257                 else
1258                         s->failure = b || s->failure;
1259
1260         } else if (streq(key, "n-accepted")) {
1261                 unsigned k;
1262
1263                 if ((r = safe_atou(value, &k)) < 0)
1264                         log_debug("Failed to parse n-accepted value %s", value);
1265                 else
1266                         s->n_accepted += k;
1267         } else if (streq(key, "control-pid")) {
1268                 pid_t pid;
1269
1270                 if ((r = parse_pid(value, &pid)) < 0)
1271                         log_debug("Failed to parse control-pid value %s", value);
1272                 else
1273                         s->control_pid = pid;
1274         } else if (streq(key, "control-command")) {
1275                 SocketExecCommand id;
1276
1277                 if ((id = socket_exec_command_from_string(value)) < 0)
1278                         log_debug("Failed to parse exec-command value %s", value);
1279                 else {
1280                         s->control_command_id = id;
1281                         s->control_command = s->exec_command[id];
1282                 }
1283         } else if (streq(key, "fifo")) {
1284                 int fd, skip = 0;
1285                 SocketPort *p;
1286
1287                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1288                         log_debug("Failed to parse fifo value %s", value);
1289                 else {
1290
1291                         LIST_FOREACH(port, p, s->ports)
1292                                 if (streq(p->path, value+skip))
1293                                         break;
1294
1295                         if (p) {
1296                                 if (p->fd >= 0)
1297                                         close_nointr_nofail(p->fd);
1298                                 p->fd = fdset_remove(fds, fd);
1299                         }
1300                 }
1301
1302         } else if (streq(key, "socket")) {
1303                 int fd, type, skip = 0;
1304                 SocketPort *p;
1305
1306                 if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd))
1307                         log_debug("Failed to parse socket value %s", value);
1308                 else {
1309
1310                         LIST_FOREACH(port, p, s->ports)
1311                                 if (socket_address_is(&p->address, value+skip, type))
1312                                         break;
1313
1314                         if (p) {
1315                                 if (p->fd >= 0)
1316                                         close_nointr_nofail(p->fd);
1317                                 p->fd = fdset_remove(fds, fd);
1318                         }
1319                 }
1320
1321         } else
1322                 log_debug("Unknown serialization key '%s'", key);
1323
1324         return 0;
1325 }
1326
1327 static UnitActiveState socket_active_state(Unit *u) {
1328         assert(u);
1329
1330         return state_translation_table[SOCKET(u)->state];
1331 }
1332
1333 static const char *socket_sub_state_to_string(Unit *u) {
1334         assert(u);
1335
1336         return socket_state_to_string(SOCKET(u)->state);
1337 }
1338
1339 static bool socket_check_gc(Unit *u) {
1340         Socket *s = SOCKET(u);
1341
1342         assert(u);
1343
1344         return s->n_connections > 0;
1345 }
1346
1347 static void socket_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
1348         Socket *s = SOCKET(u);
1349         int cfd = -1;
1350
1351         assert(s);
1352         assert(fd >= 0);
1353
1354         if (s->state != SOCKET_LISTENING)
1355                 return;
1356
1357         log_debug("Incoming traffic on %s", u->meta.id);
1358
1359         if (events != EPOLLIN) {
1360                 log_error("Got invalid poll event on socket.");
1361                 goto fail;
1362         }
1363
1364         if (w->socket_accept) {
1365                 for (;;) {
1366
1367                         if ((cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK)) < 0) {
1368
1369                                 if (errno == EINTR)
1370                                         continue;
1371
1372                                 log_error("Failed to accept socket: %m");
1373                                 goto fail;
1374                         }
1375
1376                         break;
1377                 }
1378
1379                 socket_apply_socket_options(s, cfd);
1380         }
1381
1382         socket_enter_running(s, cfd);
1383         return;
1384
1385 fail:
1386         socket_enter_stop_pre(s, false);
1387 }
1388
1389 static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1390         Socket *s = SOCKET(u);
1391         bool success;
1392
1393         assert(s);
1394         assert(pid >= 0);
1395
1396         if (pid != s->control_pid)
1397                 return;
1398
1399         s->control_pid = 0;
1400
1401         success = is_clean_exit(code, status);
1402         s->failure = s->failure || !success;
1403
1404         if (s->control_command)
1405                 exec_status_exit(&s->control_command->exec_status, pid, code, status);
1406
1407         log_debug("%s control process exited, code=%s status=%i", u->meta.id, sigchld_code_to_string(code), status);
1408
1409         if (s->control_command && s->control_command->command_next && success) {
1410                 log_debug("%s running next command for state %s", u->meta.id, socket_state_to_string(s->state));
1411                 socket_run_next(s, success);
1412         } else {
1413                 s->control_command = NULL;
1414                 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
1415
1416                 /* No further commands for this step, so let's figure
1417                  * out what to do next */
1418
1419                 log_debug("%s got final SIGCHLD for state %s", u->meta.id, socket_state_to_string(s->state));
1420
1421                 switch (s->state) {
1422
1423                 case SOCKET_START_PRE:
1424                         if (success)
1425                                 socket_enter_start_post(s);
1426                         else
1427                                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1428                         break;
1429
1430                 case SOCKET_START_POST:
1431                         if (success)
1432                                 socket_enter_listening(s);
1433                         else
1434                                 socket_enter_stop_pre(s, false);
1435                         break;
1436
1437                 case SOCKET_STOP_PRE:
1438                 case SOCKET_STOP_PRE_SIGTERM:
1439                 case SOCKET_STOP_PRE_SIGKILL:
1440                         socket_enter_stop_post(s, success);
1441                         break;
1442
1443                 case SOCKET_STOP_POST:
1444                 case SOCKET_FINAL_SIGTERM:
1445                 case SOCKET_FINAL_SIGKILL:
1446                         socket_enter_dead(s, success);
1447                         break;
1448
1449                 default:
1450                         assert_not_reached("Uh, control process died at wrong time.");
1451                 }
1452         }
1453 }
1454
1455 static void socket_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1456         Socket *s = SOCKET(u);
1457
1458         assert(s);
1459         assert(elapsed == 1);
1460         assert(w == &s->timer_watch);
1461
1462         switch (s->state) {
1463
1464         case SOCKET_START_PRE:
1465                 log_warning("%s starting timed out. Terminating.", u->meta.id);
1466                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1467
1468         case SOCKET_START_POST:
1469                 log_warning("%s starting timed out. Stopping.", u->meta.id);
1470                 socket_enter_stop_pre(s, false);
1471                 break;
1472
1473         case SOCKET_STOP_PRE:
1474                 log_warning("%s stopping timed out. Terminating.", u->meta.id);
1475                 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, false);
1476                 break;
1477
1478         case SOCKET_STOP_PRE_SIGTERM:
1479                 log_warning("%s stopping timed out. Killing.", u->meta.id);
1480                 socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, false);
1481                 break;
1482
1483         case SOCKET_STOP_PRE_SIGKILL:
1484                 log_warning("%s still around after SIGKILL. Ignoring.", u->meta.id);
1485                 socket_enter_stop_post(s, false);
1486                 break;
1487
1488         case SOCKET_STOP_POST:
1489                 log_warning("%s stopping timed out (2). Terminating.", u->meta.id);
1490                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, false);
1491                 break;
1492
1493         case SOCKET_FINAL_SIGTERM:
1494                 log_warning("%s stopping timed out (2). Killing.", u->meta.id);
1495                 socket_enter_signal(s, SOCKET_FINAL_SIGKILL, false);
1496                 break;
1497
1498         case SOCKET_FINAL_SIGKILL:
1499                 log_warning("%s still around after SIGKILL (2). Entering maintenance mode.", u->meta.id);
1500                 socket_enter_dead(s, false);
1501                 break;
1502
1503         default:
1504                 assert_not_reached("Timeout at wrong time.");
1505         }
1506 }
1507
1508 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
1509         int *rfds;
1510         unsigned rn_fds, k;
1511         SocketPort *p;
1512
1513         assert(s);
1514         assert(fds);
1515         assert(n_fds);
1516
1517         /* Called from the service code for requesting our fds */
1518
1519         rn_fds = 0;
1520         LIST_FOREACH(port, p, s->ports)
1521                 if (p->fd >= 0)
1522                         rn_fds++;
1523
1524         if (!(rfds = new(int, rn_fds)) < 0)
1525                 return -ENOMEM;
1526
1527         k = 0;
1528         LIST_FOREACH(port, p, s->ports)
1529                 if (p->fd >= 0)
1530                         rfds[k++] = p->fd;
1531
1532         assert(k == rn_fds);
1533
1534         *fds = rfds;
1535         *n_fds = rn_fds;
1536
1537         return 0;
1538 }
1539
1540 void socket_notify_service_dead(Socket *s) {
1541         assert(s);
1542
1543         /* The service is dead. Dang!
1544          *
1545          * This is strictly for one-instance-for-all-connections
1546          * services. */
1547
1548         if (s->state == SOCKET_RUNNING) {
1549                 log_debug("%s got notified about service death.", s->meta.id);
1550                 socket_enter_listening(s);
1551         }
1552 }
1553
1554 void socket_connection_unref(Socket *s) {
1555         assert(s);
1556
1557         /* The service is dead. Yay!
1558          *
1559          * This is strictly for one-onstance-per-connection
1560          * services. */
1561
1562         assert(s->n_connections > 0);
1563         s->n_connections--;
1564
1565         log_debug("%s: One connection closed, %u left.", s->meta.id, s->n_connections);
1566 }
1567
1568 static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
1569         [SOCKET_DEAD] = "dead",
1570         [SOCKET_START_PRE] = "start-pre",
1571         [SOCKET_START_POST] = "start-post",
1572         [SOCKET_LISTENING] = "listening",
1573         [SOCKET_RUNNING] = "running",
1574         [SOCKET_STOP_PRE] = "stop-pre",
1575         [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
1576         [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
1577         [SOCKET_STOP_POST] = "stop-post",
1578         [SOCKET_FINAL_SIGTERM] = "final-sigterm",
1579         [SOCKET_FINAL_SIGKILL] = "final-sigkill",
1580         [SOCKET_MAINTENANCE] = "maintenance"
1581 };
1582
1583 DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
1584
1585 static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
1586         [SOCKET_EXEC_START_PRE] = "StartPre",
1587         [SOCKET_EXEC_START_POST] = "StartPost",
1588         [SOCKET_EXEC_STOP_PRE] = "StopPre",
1589         [SOCKET_EXEC_STOP_POST] = "StopPost"
1590 };
1591
1592 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
1593
1594 const UnitVTable socket_vtable = {
1595         .suffix = ".socket",
1596
1597         .init = socket_init,
1598         .done = socket_done,
1599         .load = socket_load,
1600
1601         .coldplug = socket_coldplug,
1602
1603         .dump = socket_dump,
1604
1605         .start = socket_start,
1606         .stop = socket_stop,
1607
1608         .serialize = socket_serialize,
1609         .deserialize_item = socket_deserialize_item,
1610
1611         .active_state = socket_active_state,
1612         .sub_state_to_string = socket_sub_state_to_string,
1613
1614         .check_gc = socket_check_gc,
1615
1616         .fd_event = socket_fd_event,
1617         .sigchld_event = socket_sigchld_event,
1618         .timer_event = socket_timer_event,
1619
1620         .bus_message_handler = bus_socket_message_handler
1621 };