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