chiark / gitweb /
core: add global settings for enabling CPUAccounting=, MemoryAccounting=, BlockIOAcco...
[elogind.git] / src / core / socket.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
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 Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 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   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser 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 #include <netinet/tcp.h>
31 #include <mqueue.h>
32 #ifdef HAVE_XATTR
33 #include <attr/xattr.h>
34 #endif
35
36 #include "sd-event.h"
37 #include "log.h"
38 #include "load-dropin.h"
39 #include "load-fragment.h"
40 #include "strv.h"
41 #include "mkdir.h"
42 #include "path-util.h"
43 #include "unit-name.h"
44 #include "unit-printf.h"
45 #include "missing.h"
46 #include "special.h"
47 #include "label.h"
48 #include "exit-status.h"
49 #include "def.h"
50 #include "smack-util.h"
51 #include "bus-util.h"
52 #include "bus-error.h"
53 #include "dbus-socket.h"
54 #include "unit.h"
55 #include "socket.h"
56
57 static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
58         [SOCKET_DEAD] = UNIT_INACTIVE,
59         [SOCKET_START_PRE] = UNIT_ACTIVATING,
60         [SOCKET_START_POST] = UNIT_ACTIVATING,
61         [SOCKET_LISTENING] = UNIT_ACTIVE,
62         [SOCKET_RUNNING] = UNIT_ACTIVE,
63         [SOCKET_STOP_PRE] = UNIT_DEACTIVATING,
64         [SOCKET_STOP_PRE_SIGTERM] = UNIT_DEACTIVATING,
65         [SOCKET_STOP_PRE_SIGKILL] = UNIT_DEACTIVATING,
66         [SOCKET_STOP_POST] = UNIT_DEACTIVATING,
67         [SOCKET_FINAL_SIGTERM] = UNIT_DEACTIVATING,
68         [SOCKET_FINAL_SIGKILL] = UNIT_DEACTIVATING,
69         [SOCKET_FAILED] = UNIT_FAILED
70 };
71
72 static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
73 static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata);
74
75 static void socket_init(Unit *u) {
76         Socket *s = SOCKET(u);
77
78         assert(u);
79         assert(u->load_state == UNIT_STUB);
80
81         s->backlog = SOMAXCONN;
82         s->timeout_usec = u->manager->default_timeout_start_usec;
83         s->directory_mode = 0755;
84         s->socket_mode = 0666;
85
86         s->max_connections = 64;
87
88         s->priority = -1;
89         s->ip_tos = -1;
90         s->ip_ttl = -1;
91         s->mark = -1;
92
93         exec_context_init(&s->exec_context);
94         s->exec_context.std_output = u->manager->default_std_output;
95         s->exec_context.std_error = u->manager->default_std_error;
96         kill_context_init(&s->kill_context);
97         cgroup_context_init(&s->cgroup_context);
98
99         unit_cgroup_context_init_defaults(u, &s->cgroup_context);
100
101         s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
102 }
103
104 static void socket_unwatch_control_pid(Socket *s) {
105         assert(s);
106
107         if (s->control_pid <= 0)
108                 return;
109
110         unit_unwatch_pid(UNIT(s), s->control_pid);
111         s->control_pid = 0;
112 }
113
114 void socket_free_ports(Socket *s) {
115         SocketPort *p;
116
117         assert(s);
118
119         while ((p = s->ports)) {
120                 LIST_REMOVE(port, s->ports, p);
121
122                 sd_event_source_unref(p->event_source);
123
124                 if (p->fd >= 0)
125                         close_nointr_nofail(p->fd);
126
127                 free(p->path);
128                 free(p);
129         }
130 }
131
132 static void socket_done(Unit *u) {
133         Socket *s = SOCKET(u);
134
135         assert(s);
136
137         socket_free_ports(s);
138
139         cgroup_context_done(&s->cgroup_context);
140         exec_context_done(&s->exec_context);
141         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
142         exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
143         s->control_command = NULL;
144
145         socket_unwatch_control_pid(s);
146
147         unit_ref_unset(&s->service);
148
149         free(s->tcp_congestion);
150         s->tcp_congestion = NULL;
151
152         free(s->bind_to_device);
153         s->bind_to_device = NULL;
154
155         free(s->smack);
156         free(s->smack_ip_in);
157         free(s->smack_ip_out);
158
159         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
160 }
161
162 static int socket_arm_timer(Socket *s) {
163         int r;
164
165         assert(s);
166
167         if (s->timeout_usec <= 0) {
168                 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
169                 return 0;
170         }
171
172         if (s->timer_event_source) {
173                 r = sd_event_source_set_time(s->timer_event_source, now(CLOCK_MONOTONIC) + s->timeout_usec);
174                 if (r < 0)
175                         return r;
176
177                 return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT);
178         }
179
180         return sd_event_add_monotonic(UNIT(s)->manager->event, &s->timer_event_source, now(CLOCK_MONOTONIC) + s->timeout_usec, 0, socket_dispatch_timer, s);
181 }
182
183 static int socket_instantiate_service(Socket *s) {
184         _cleanup_free_ char *prefix = NULL;
185         _cleanup_free_ char *name = NULL;
186         int r;
187         Unit *u;
188
189         assert(s);
190
191         /* This fills in s->service if it isn't filled in yet. For
192          * Accept=yes sockets we create the next connection service
193          * here. For Accept=no this is mostly a NOP since the service
194          * is figured out at load time anyway. */
195
196         if (UNIT_DEREF(s->service))
197                 return 0;
198
199         assert(s->accept);
200
201         if (!(prefix = unit_name_to_prefix(UNIT(s)->id)))
202                 return -ENOMEM;
203
204         r = asprintf(&name, "%s@%u.service", prefix, s->n_accepted);
205
206         if (r < 0)
207                 return -ENOMEM;
208
209         r = manager_load_unit(UNIT(s)->manager, name, NULL, NULL, &u);
210
211         if (r < 0)
212                 return r;
213
214 #ifdef HAVE_SYSV_COMPAT
215         if (SERVICE(u)->is_sysv) {
216                 log_error("Using SysV services for socket activation is not supported. Refusing.");
217                 return -ENOENT;
218         }
219 #endif
220
221         u->no_gc = true;
222         unit_ref_set(&s->service, u);
223
224         return unit_add_two_dependencies(UNIT(s), UNIT_BEFORE, UNIT_TRIGGERS, u, false);
225 }
226
227 static bool have_non_accept_socket(Socket *s) {
228         SocketPort *p;
229
230         assert(s);
231
232         if (!s->accept)
233                 return true;
234
235         LIST_FOREACH(port, p, s->ports) {
236
237                 if (p->type != SOCKET_SOCKET)
238                         return true;
239
240                 if (!socket_address_can_accept(&p->address))
241                         return true;
242         }
243
244         return false;
245 }
246
247 static int socket_add_mount_links(Socket *s) {
248         SocketPort *p;
249         int r;
250
251         assert(s);
252
253         LIST_FOREACH(port, p, s->ports) {
254                 const char *path = NULL;
255
256                 if (p->type == SOCKET_SOCKET)
257                         path = socket_address_get_path(&p->address);
258                 else if (p->type == SOCKET_FIFO || p->type == SOCKET_SPECIAL)
259                         path = p->path;
260
261                 if (!path)
262                         continue;
263
264                 r = unit_require_mounts_for(UNIT(s), path);
265                 if (r < 0)
266                         return r;
267         }
268
269         return 0;
270 }
271
272 static int socket_add_device_link(Socket *s) {
273         char *t;
274
275         assert(s);
276
277         if (!s->bind_to_device || streq(s->bind_to_device, "lo"))
278                 return 0;
279
280         t = strappenda("/sys/subsystem/net/devices/", s->bind_to_device);
281         return unit_add_node_link(UNIT(s), t, false);
282 }
283
284 static int socket_add_default_dependencies(Socket *s) {
285         int r;
286         assert(s);
287
288         r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SOCKETS_TARGET, NULL, true);
289         if (r < 0)
290                 return r;
291
292         if (UNIT(s)->manager->running_as == SYSTEMD_SYSTEM) {
293                 r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true);
294                 if (r < 0)
295                         return r;
296         }
297
298         return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
299 }
300
301 _pure_ static bool socket_has_exec(Socket *s) {
302         unsigned i;
303         assert(s);
304
305         for (i = 0; i < _SOCKET_EXEC_COMMAND_MAX; i++)
306                 if (s->exec_command[i])
307                         return true;
308
309         return false;
310 }
311
312 static int socket_add_extras(Socket *s) {
313         Unit *u = UNIT(s);
314         int r;
315
316         assert(s);
317
318         if (have_non_accept_socket(s)) {
319
320                 if (!UNIT_DEREF(s->service)) {
321                         Unit *x;
322
323                         r = unit_load_related_unit(u, ".service", &x);
324                         if (r < 0)
325                                 return r;
326
327                         unit_ref_set(&s->service, x);
328                 }
329
330                 r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(s->service), true);
331                 if (r < 0)
332                         return r;
333         }
334
335         r = socket_add_mount_links(s);
336         if (r < 0)
337                 return r;
338
339         r = socket_add_device_link(s);
340         if (r < 0)
341                 return r;
342
343         r = unit_exec_context_patch_defaults(u, &s->exec_context);
344         if (r < 0)
345                 return r;
346
347         if (socket_has_exec(s)) {
348                 r = unit_add_exec_dependencies(u, &s->exec_context);
349                 if (r < 0)
350                         return r;
351
352                 r = unit_add_default_slice(u);
353                 if (r < 0)
354                         return r;
355         }
356
357         if (u->default_dependencies) {
358                 r = socket_add_default_dependencies(s);
359                 if (r < 0)
360                         return r;
361         }
362
363         return 0;
364 }
365
366 static int socket_verify(Socket *s) {
367         assert(s);
368
369         if (UNIT(s)->load_state != UNIT_LOADED)
370                 return 0;
371
372         if (!s->ports) {
373                 log_error_unit(UNIT(s)->id, "%s lacks Listen setting. Refusing.", UNIT(s)->id);
374                 return -EINVAL;
375         }
376
377         if (s->accept && have_non_accept_socket(s)) {
378                 log_error_unit(UNIT(s)->id, "%s configured for accepting sockets, but sockets are non-accepting. Refusing.",
379                                UNIT(s)->id);
380                 return -EINVAL;
381         }
382
383         if (s->accept && s->max_connections <= 0) {
384                 log_error_unit(UNIT(s)->id, "%s's MaxConnection setting too small. Refusing.", UNIT(s)->id);
385                 return -EINVAL;
386         }
387
388         if (s->accept && UNIT_DEREF(s->service)) {
389                 log_error_unit(UNIT(s)->id, "Explicit service configuration for accepting sockets not supported on %s. Refusing.", UNIT(s)->id);
390                 return -EINVAL;
391         }
392
393         if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
394                 log_error_unit(UNIT(s)->id, "%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
395                 return -EINVAL;
396         }
397
398         return 0;
399 }
400
401 static int socket_load(Unit *u) {
402         Socket *s = SOCKET(u);
403         int r;
404
405         assert(u);
406         assert(u->load_state == UNIT_STUB);
407
408         r = unit_load_fragment_and_dropin(u);
409         if (r < 0)
410                 return r;
411
412         if (u->load_state == UNIT_LOADED) {
413                 /* This is a new unit? Then let's add in some extras */
414                 r = socket_add_extras(s);
415                 if (r < 0)
416                         return r;
417         }
418
419         return socket_verify(s);
420 }
421
422 _const_ static const char* listen_lookup(int family, int type) {
423
424         if (family == AF_NETLINK)
425                 return "ListenNetlink";
426
427         if (type == SOCK_STREAM)
428                 return "ListenStream";
429         else if (type == SOCK_DGRAM)
430                 return "ListenDatagram";
431         else if (type == SOCK_SEQPACKET)
432                 return "ListenSequentialPacket";
433
434         assert_not_reached("Unknown socket type");
435         return NULL;
436 }
437
438 static void socket_dump(Unit *u, FILE *f, const char *prefix) {
439         SocketExecCommand c;
440         Socket *s = SOCKET(u);
441         SocketPort *p;
442         const char *prefix2;
443
444         assert(s);
445         assert(f);
446
447         prefix2 = strappenda(prefix, "\t");
448
449         fprintf(f,
450                 "%sSocket State: %s\n"
451                 "%sResult: %s\n"
452                 "%sBindIPv6Only: %s\n"
453                 "%sBacklog: %u\n"
454                 "%sSocketMode: %04o\n"
455                 "%sDirectoryMode: %04o\n"
456                 "%sKeepAlive: %s\n"
457                 "%sFreeBind: %s\n"
458                 "%sTransparent: %s\n"
459                 "%sBroadcast: %s\n"
460                 "%sPassCredentials: %s\n"
461                 "%sPassSecurity: %s\n"
462                 "%sTCPCongestion: %s\n",
463                 prefix, socket_state_to_string(s->state),
464                 prefix, socket_result_to_string(s->result),
465                 prefix, socket_address_bind_ipv6_only_to_string(s->bind_ipv6_only),
466                 prefix, s->backlog,
467                 prefix, s->socket_mode,
468                 prefix, s->directory_mode,
469                 prefix, yes_no(s->keep_alive),
470                 prefix, yes_no(s->free_bind),
471                 prefix, yes_no(s->transparent),
472                 prefix, yes_no(s->broadcast),
473                 prefix, yes_no(s->pass_cred),
474                 prefix, yes_no(s->pass_sec),
475                 prefix, strna(s->tcp_congestion));
476
477         if (s->control_pid > 0)
478                 fprintf(f,
479                         "%sControl PID: %lu\n",
480                         prefix, (unsigned long) s->control_pid);
481
482         if (s->bind_to_device)
483                 fprintf(f,
484                         "%sBindToDevice: %s\n",
485                         prefix, s->bind_to_device);
486
487         if (s->accept)
488                 fprintf(f,
489                         "%sAccepted: %u\n"
490                         "%sNConnections: %u\n"
491                         "%sMaxConnections: %u\n",
492                         prefix, s->n_accepted,
493                         prefix, s->n_connections,
494                         prefix, s->max_connections);
495
496         if (s->priority >= 0)
497                 fprintf(f,
498                         "%sPriority: %i\n",
499                         prefix, s->priority);
500
501         if (s->receive_buffer > 0)
502                 fprintf(f,
503                         "%sReceiveBuffer: %zu\n",
504                         prefix, s->receive_buffer);
505
506         if (s->send_buffer > 0)
507                 fprintf(f,
508                         "%sSendBuffer: %zu\n",
509                         prefix, s->send_buffer);
510
511         if (s->ip_tos >= 0)
512                 fprintf(f,
513                         "%sIPTOS: %i\n",
514                         prefix, s->ip_tos);
515
516         if (s->ip_ttl >= 0)
517                 fprintf(f,
518                         "%sIPTTL: %i\n",
519                         prefix, s->ip_ttl);
520
521         if (s->pipe_size > 0)
522                 fprintf(f,
523                         "%sPipeSize: %zu\n",
524                         prefix, s->pipe_size);
525
526         if (s->mark >= 0)
527                 fprintf(f,
528                         "%sMark: %i\n",
529                         prefix, s->mark);
530
531         if (s->mq_maxmsg > 0)
532                 fprintf(f,
533                         "%sMessageQueueMaxMessages: %li\n",
534                         prefix, s->mq_maxmsg);
535
536         if (s->mq_msgsize > 0)
537                 fprintf(f,
538                         "%sMessageQueueMessageSize: %li\n",
539                         prefix, s->mq_msgsize);
540
541         if (s->reuse_port)
542                 fprintf(f,
543                         "%sReusePort: %s\n",
544                          prefix, yes_no(s->reuse_port));
545
546         if (s->smack)
547                 fprintf(f,
548                         "%sSmackLabel: %s\n",
549                         prefix, s->smack);
550
551         if (s->smack_ip_in)
552                 fprintf(f,
553                         "%sSmackLabelIPIn: %s\n",
554                         prefix, s->smack_ip_in);
555
556         if (s->smack_ip_out)
557                 fprintf(f,
558                         "%sSmackLabelIPOut: %s\n",
559                         prefix, s->smack_ip_out);
560
561         LIST_FOREACH(port, p, s->ports) {
562
563                 if (p->type == SOCKET_SOCKET) {
564                         const char *t;
565                         int r;
566                         char *k = NULL;
567
568                         if ((r = socket_address_print(&p->address, &k)) < 0)
569                                 t = strerror(-r);
570                         else
571                                 t = k;
572
573                         fprintf(f, "%s%s: %s\n", prefix, listen_lookup(socket_address_family(&p->address), p->address.type), t);
574                         free(k);
575                 } else if (p->type == SOCKET_SPECIAL)
576                         fprintf(f, "%sListenSpecial: %s\n", prefix, p->path);
577                 else if (p->type == SOCKET_MQUEUE)
578                         fprintf(f, "%sListenMessageQueue: %s\n", prefix, p->path);
579                 else
580                         fprintf(f, "%sListenFIFO: %s\n", prefix, p->path);
581         }
582
583         exec_context_dump(&s->exec_context, f, prefix);
584         kill_context_dump(&s->kill_context, f, prefix);
585
586         for (c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
587                 if (!s->exec_command[c])
588                         continue;
589
590                 fprintf(f, "%s-> %s:\n",
591                         prefix, socket_exec_command_to_string(c));
592
593                 exec_command_dump_list(s->exec_command[c], f, prefix2);
594         }
595 }
596
597 static int instance_from_socket(int fd, unsigned nr, char **instance) {
598         socklen_t l;
599         char *r;
600         union {
601                 struct sockaddr sa;
602                 struct sockaddr_un un;
603                 struct sockaddr_in in;
604                 struct sockaddr_in6 in6;
605                 struct sockaddr_storage storage;
606         } local, remote;
607
608         assert(fd >= 0);
609         assert(instance);
610
611         l = sizeof(local);
612         if (getsockname(fd, &local.sa, &l) < 0)
613                 return -errno;
614
615         l = sizeof(remote);
616         if (getpeername(fd, &remote.sa, &l) < 0)
617                 return -errno;
618
619         switch (local.sa.sa_family) {
620
621         case AF_INET: {
622                 uint32_t
623                         a = ntohl(local.in.sin_addr.s_addr),
624                         b = ntohl(remote.in.sin_addr.s_addr);
625
626                 if (asprintf(&r,
627                              "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
628                              nr,
629                              a >> 24, (a >> 16) & 0xFF, (a >> 8) & 0xFF, a & 0xFF,
630                              ntohs(local.in.sin_port),
631                              b >> 24, (b >> 16) & 0xFF, (b >> 8) & 0xFF, b & 0xFF,
632                              ntohs(remote.in.sin_port)) < 0)
633                         return -ENOMEM;
634
635                 break;
636         }
637
638         case AF_INET6: {
639                 static const unsigned char ipv4_prefix[] = {
640                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF
641                 };
642
643                 if (memcmp(&local.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0 &&
644                     memcmp(&remote.in6.sin6_addr, ipv4_prefix, sizeof(ipv4_prefix)) == 0) {
645                         const uint8_t
646                                 *a = local.in6.sin6_addr.s6_addr+12,
647                                 *b = remote.in6.sin6_addr.s6_addr+12;
648
649                         if (asprintf(&r,
650                                      "%u-%u.%u.%u.%u:%u-%u.%u.%u.%u:%u",
651                                      nr,
652                                      a[0], a[1], a[2], a[3],
653                                      ntohs(local.in6.sin6_port),
654                                      b[0], b[1], b[2], b[3],
655                                      ntohs(remote.in6.sin6_port)) < 0)
656                                 return -ENOMEM;
657                 } else {
658                         char a[INET6_ADDRSTRLEN], b[INET6_ADDRSTRLEN];
659
660                         if (asprintf(&r,
661                                      "%u-%s:%u-%s:%u",
662                                      nr,
663                                      inet_ntop(AF_INET6, &local.in6.sin6_addr, a, sizeof(a)),
664                                      ntohs(local.in6.sin6_port),
665                                      inet_ntop(AF_INET6, &remote.in6.sin6_addr, b, sizeof(b)),
666                                      ntohs(remote.in6.sin6_port)) < 0)
667                                 return -ENOMEM;
668                 }
669
670                 break;
671         }
672
673         case AF_UNIX: {
674                 struct ucred ucred;
675                 int k;
676
677                 k = getpeercred(fd, &ucred);
678                 if (k < 0)
679                         return k;
680
681                 if (asprintf(&r,
682                              "%u-%lu-%lu",
683                              nr,
684                              (unsigned long) ucred.pid,
685                              (unsigned long) ucred.uid) < 0)
686                         return -ENOMEM;
687
688                 break;
689         }
690
691         default:
692                 assert_not_reached("Unhandled socket type.");
693         }
694
695         *instance = r;
696         return 0;
697 }
698
699 static void socket_close_fds(Socket *s) {
700         SocketPort *p;
701
702         assert(s);
703
704         LIST_FOREACH(port, p, s->ports) {
705
706                 p->event_source = sd_event_source_unref(p->event_source);
707
708                 if (p->fd < 0)
709                         continue;
710
711                 close_nointr_nofail(p->fd);
712
713                 /* One little note: we should never delete any sockets
714                  * in the file system here! After all some other
715                  * process we spawned might still have a reference of
716                  * this fd and wants to continue to use it. Therefore
717                  * we delete sockets in the file system before we
718                  * create a new one, not after we stopped using
719                  * one! */
720
721                 p->fd = -1;
722         }
723 }
724
725 static void socket_apply_socket_options(Socket *s, int fd) {
726         assert(s);
727         assert(fd >= 0);
728
729         if (s->keep_alive) {
730                 int b = s->keep_alive;
731                 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &b, sizeof(b)) < 0)
732                         log_warning_unit(UNIT(s)->id, "SO_KEEPALIVE failed: %m");
733         }
734
735         if (s->broadcast) {
736                 int one = 1;
737                 if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)) < 0)
738                         log_warning_unit(UNIT(s)->id, "SO_BROADCAST failed: %m");
739         }
740
741         if (s->pass_cred) {
742                 int one = 1;
743                 if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0)
744                         log_warning_unit(UNIT(s)->id, "SO_PASSCRED failed: %m");
745         }
746
747         if (s->pass_sec) {
748                 int one = 1;
749                 if (setsockopt(fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one)) < 0)
750                         log_warning_unit(UNIT(s)->id, "SO_PASSSEC failed: %m");
751         }
752
753         if (s->priority >= 0)
754                 if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &s->priority, sizeof(s->priority)) < 0)
755                         log_warning_unit(UNIT(s)->id, "SO_PRIORITY failed: %m");
756
757         if (s->receive_buffer > 0) {
758                 int value = (int) s->receive_buffer;
759
760                 /* We first try with SO_RCVBUFFORCE, in case we have the perms for that */
761
762                 if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof(value)) < 0)
763                         if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0)
764                                 log_warning_unit(UNIT(s)->id, "SO_RCVBUF failed: %m");
765         }
766
767         if (s->send_buffer > 0) {
768                 int value = (int) s->send_buffer;
769                 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof(value)) < 0)
770                         if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0)
771                                 log_warning_unit(UNIT(s)->id, "SO_SNDBUF failed: %m");
772         }
773
774         if (s->mark >= 0)
775                 if (setsockopt(fd, SOL_SOCKET, SO_MARK, &s->mark, sizeof(s->mark)) < 0)
776                         log_warning_unit(UNIT(s)->id, "SO_MARK failed: %m");
777
778         if (s->ip_tos >= 0)
779                 if (setsockopt(fd, IPPROTO_IP, IP_TOS, &s->ip_tos, sizeof(s->ip_tos)) < 0)
780                         log_warning_unit(UNIT(s)->id, "IP_TOS failed: %m");
781
782         if (s->ip_ttl >= 0) {
783                 int r, x;
784
785                 r = setsockopt(fd, IPPROTO_IP, IP_TTL, &s->ip_ttl, sizeof(s->ip_ttl));
786
787                 if (socket_ipv6_is_supported())
788                         x = setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &s->ip_ttl, sizeof(s->ip_ttl));
789                 else {
790                         x = -1;
791                         errno = EAFNOSUPPORT;
792                 }
793
794                 if (r < 0 && x < 0)
795                         log_warning_unit(UNIT(s)->id,
796                                          "IP_TTL/IPV6_UNICAST_HOPS failed: %m");
797         }
798
799         if (s->tcp_congestion)
800                 if (setsockopt(fd, SOL_TCP, TCP_CONGESTION, s->tcp_congestion, strlen(s->tcp_congestion)+1) < 0)
801                         log_warning_unit(UNIT(s)->id, "TCP_CONGESTION failed: %m");
802
803         if (s->reuse_port) {
804                 int b = s->reuse_port;
805                 if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &b, sizeof(b)) < 0)
806                         log_warning_unit(UNIT(s)->id, "SO_REUSEPORT failed: %m");
807         }
808
809         if (s->smack_ip_in)
810                 if (smack_label_ip_in_fd(fd, s->smack_ip_in) < 0)
811                         log_error_unit(UNIT(s)->id, "smack_label_ip_in_fd: %m");
812
813         if (s->smack_ip_out)
814                 if (smack_label_ip_out_fd(fd, s->smack_ip_out) < 0)
815                         log_error_unit(UNIT(s)->id, "smack_label_ip_out_fd: %m");
816 }
817
818 static void socket_apply_fifo_options(Socket *s, int fd) {
819         assert(s);
820         assert(fd >= 0);
821
822         if (s->pipe_size > 0)
823                 if (fcntl(fd, F_SETPIPE_SZ, s->pipe_size) < 0)
824                         log_warning_unit(UNIT(s)->id,
825                                          "F_SETPIPE_SZ: %m");
826
827         if (s->smack)
828                 if (smack_label_fd(fd, s->smack) < 0)
829                         log_error_unit(UNIT(s)->id, "smack_label_fd: %m");
830 }
831
832 static int fifo_address_create(
833                 const char *path,
834                 mode_t directory_mode,
835                 mode_t socket_mode,
836                 int *_fd) {
837
838         int fd = -1, r = 0;
839         struct stat st;
840         mode_t old_mask;
841
842         assert(path);
843         assert(_fd);
844
845         mkdir_parents_label(path, directory_mode);
846
847         r = label_context_set(path, S_IFIFO);
848         if (r < 0)
849                 goto fail;
850
851         /* Enforce the right access mode for the fifo */
852         old_mask = umask(~ socket_mode);
853
854         /* Include the original umask in our mask */
855         umask(~socket_mode | old_mask);
856
857         r = mkfifo(path, socket_mode);
858         umask(old_mask);
859
860         if (r < 0 && errno != EEXIST) {
861                 r = -errno;
862                 goto fail;
863         }
864
865         if ((fd = open(path, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW)) < 0) {
866                 r = -errno;
867                 goto fail;
868         }
869
870         label_context_clear();
871
872         if (fstat(fd, &st) < 0) {
873                 r = -errno;
874                 goto fail;
875         }
876
877         if (!S_ISFIFO(st.st_mode) ||
878             (st.st_mode & 0777) != (socket_mode & ~old_mask) ||
879             st.st_uid != getuid() ||
880             st.st_gid != getgid()) {
881
882                 r = -EEXIST;
883                 goto fail;
884         }
885
886         *_fd = fd;
887         return 0;
888
889 fail:
890         label_context_clear();
891
892         if (fd >= 0)
893                 close_nointr_nofail(fd);
894
895         return r;
896 }
897
898 static int special_address_create(
899                 const char *path,
900                 int *_fd) {
901
902         int fd = -1, r = 0;
903         struct stat st;
904
905         assert(path);
906         assert(_fd);
907
908         if ((fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW)) < 0) {
909                 r = -errno;
910                 goto fail;
911         }
912
913         if (fstat(fd, &st) < 0) {
914                 r = -errno;
915                 goto fail;
916         }
917
918         /* Check whether this is a /proc, /sys or /dev file or char device */
919         if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
920                 r = -EEXIST;
921                 goto fail;
922         }
923
924         *_fd = fd;
925         return 0;
926
927 fail:
928         if (fd >= 0)
929                 close_nointr_nofail(fd);
930
931         return r;
932 }
933
934 static int mq_address_create(
935                 const char *path,
936                 mode_t mq_mode,
937                 long maxmsg,
938                 long msgsize,
939                 int *_fd) {
940
941         int fd = -1, r = 0;
942         struct stat st;
943         mode_t old_mask;
944         struct mq_attr _attr, *attr = NULL;
945
946         assert(path);
947         assert(_fd);
948
949         if (maxmsg > 0 && msgsize > 0) {
950                 zero(_attr);
951                 _attr.mq_flags = O_NONBLOCK;
952                 _attr.mq_maxmsg = maxmsg;
953                 _attr.mq_msgsize = msgsize;
954                 attr = &_attr;
955         }
956
957         /* Enforce the right access mode for the mq */
958         old_mask = umask(~ mq_mode);
959
960         /* Include the original umask in our mask */
961         umask(~mq_mode | old_mask);
962
963         fd = mq_open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_CREAT, mq_mode, attr);
964         umask(old_mask);
965
966         if (fd < 0) {
967                 r = -errno;
968                 goto fail;
969         }
970
971         if (fstat(fd, &st) < 0) {
972                 r = -errno;
973                 goto fail;
974         }
975
976         if ((st.st_mode & 0777) != (mq_mode & ~old_mask) ||
977             st.st_uid != getuid() ||
978             st.st_gid != getgid()) {
979
980                 r = -EEXIST;
981                 goto fail;
982         }
983
984         *_fd = fd;
985         return 0;
986
987 fail:
988         if (fd >= 0)
989                 close_nointr_nofail(fd);
990
991         return r;
992 }
993
994 static int socket_open_fds(Socket *s) {
995         SocketPort *p;
996         int r;
997         char *label = NULL;
998         bool know_label = false;
999
1000         assert(s);
1001
1002         LIST_FOREACH(port, p, s->ports) {
1003
1004                 if (p->fd >= 0)
1005                         continue;
1006
1007                 if (p->type == SOCKET_SOCKET) {
1008
1009                         if (!know_label) {
1010
1011                                 if ((r = socket_instantiate_service(s)) < 0)
1012                                         return r;
1013
1014                                 if (UNIT_ISSET(s->service) &&
1015                                     SERVICE(UNIT_DEREF(s->service))->exec_command[SERVICE_EXEC_START]) {
1016                                         r = label_get_create_label_from_exe(SERVICE(UNIT_DEREF(s->service))->exec_command[SERVICE_EXEC_START]->path, &label);
1017
1018                                         if (r < 0) {
1019                                                 if (r != -EPERM)
1020                                                         return r;
1021                                         }
1022                                 }
1023
1024                                 know_label = true;
1025                         }
1026
1027                         r = socket_address_listen(
1028                                         &p->address,
1029                                         SOCK_CLOEXEC|SOCK_NONBLOCK,
1030                                         s->backlog,
1031                                         s->bind_ipv6_only,
1032                                         s->bind_to_device,
1033                                         s->free_bind,
1034                                         s->transparent,
1035                                         s->directory_mode,
1036                                         s->socket_mode,
1037                                         label);
1038                         if (r < 0)
1039                                 goto rollback;
1040
1041                         p->fd = r;
1042                         socket_apply_socket_options(s, p->fd);
1043
1044                 } else  if (p->type == SOCKET_SPECIAL) {
1045
1046                         r = special_address_create(
1047                                         p->path,
1048                                         &p->fd);
1049                         if (r < 0)
1050                                 goto rollback;
1051
1052                 } else  if (p->type == SOCKET_FIFO) {
1053
1054                         r = fifo_address_create(
1055                                         p->path,
1056                                         s->directory_mode,
1057                                         s->socket_mode,
1058                                         &p->fd);
1059                         if (r < 0)
1060                                 goto rollback;
1061
1062                         socket_apply_fifo_options(s, p->fd);
1063                 } else if (p->type == SOCKET_MQUEUE) {
1064
1065                         r = mq_address_create(
1066                                         p->path,
1067                                         s->socket_mode,
1068                                         s->mq_maxmsg,
1069                                         s->mq_msgsize,
1070                                         &p->fd);
1071                         if (r < 0)
1072                                 goto rollback;
1073                 } else
1074                         assert_not_reached("Unknown port type");
1075         }
1076
1077         label_free(label);
1078         return 0;
1079
1080 rollback:
1081         socket_close_fds(s);
1082         label_free(label);
1083         return r;
1084 }
1085
1086 static void socket_unwatch_fds(Socket *s) {
1087         SocketPort *p;
1088         int r;
1089
1090         assert(s);
1091
1092         LIST_FOREACH(port, p, s->ports) {
1093                 if (p->fd < 0)
1094                         continue;
1095
1096                 if (p->event_source) {
1097                         r = sd_event_source_set_enabled(p->event_source, SD_EVENT_OFF);
1098                         if (r < 0)
1099                                 log_debug_unit(UNIT(s)->id, "Failed to disable event source.");
1100                 }
1101         }
1102 }
1103
1104 static int socket_watch_fds(Socket *s) {
1105         SocketPort *p;
1106         int r;
1107
1108         assert(s);
1109
1110         LIST_FOREACH(port, p, s->ports) {
1111                 if (p->fd < 0)
1112                         continue;
1113
1114                 if (p->event_source)
1115                         r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
1116                 else
1117                         r = sd_event_add_io(UNIT(s)->manager->event, &p->event_source, p->fd, EPOLLIN, socket_dispatch_io, p);
1118
1119                 if (r < 0) {
1120                         log_warning_unit(UNIT(s)->id, "Failed to watch listening fds: %s", strerror(-r));
1121                         goto fail;
1122                 }
1123         }
1124
1125         return 0;
1126
1127 fail:
1128         socket_unwatch_fds(s);
1129         return r;
1130 }
1131
1132 static void socket_set_state(Socket *s, SocketState state) {
1133         SocketState old_state;
1134         assert(s);
1135
1136         old_state = s->state;
1137         s->state = state;
1138
1139         if (state != SOCKET_START_PRE &&
1140             state != SOCKET_START_POST &&
1141             state != SOCKET_STOP_PRE &&
1142             state != SOCKET_STOP_PRE_SIGTERM &&
1143             state != SOCKET_STOP_PRE_SIGKILL &&
1144             state != SOCKET_STOP_POST &&
1145             state != SOCKET_FINAL_SIGTERM &&
1146             state != SOCKET_FINAL_SIGKILL) {
1147
1148                 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
1149                 socket_unwatch_control_pid(s);
1150                 s->control_command = NULL;
1151                 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
1152         }
1153
1154         if (state != SOCKET_LISTENING)
1155                 socket_unwatch_fds(s);
1156
1157         if (state != SOCKET_START_POST &&
1158             state != SOCKET_LISTENING &&
1159             state != SOCKET_RUNNING &&
1160             state != SOCKET_STOP_PRE &&
1161             state != SOCKET_STOP_PRE_SIGTERM &&
1162             state != SOCKET_STOP_PRE_SIGKILL)
1163                 socket_close_fds(s);
1164
1165         if (state != old_state)
1166                 log_debug_unit(UNIT(s)->id, "%s changed %s -> %s",
1167                                UNIT(s)->id, socket_state_to_string(old_state), socket_state_to_string(state));
1168
1169         unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true);
1170 }
1171
1172 static int socket_coldplug(Unit *u) {
1173         Socket *s = SOCKET(u);
1174         int r;
1175
1176         assert(s);
1177         assert(s->state == SOCKET_DEAD);
1178
1179         if (s->deserialized_state == s->state)
1180                 return 0;
1181
1182         if (s->deserialized_state == SOCKET_START_PRE ||
1183             s->deserialized_state == SOCKET_START_POST ||
1184             s->deserialized_state == SOCKET_STOP_PRE ||
1185             s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
1186             s->deserialized_state == SOCKET_STOP_PRE_SIGKILL ||
1187             s->deserialized_state == SOCKET_STOP_POST ||
1188             s->deserialized_state == SOCKET_FINAL_SIGTERM ||
1189             s->deserialized_state == SOCKET_FINAL_SIGKILL) {
1190
1191                 if (s->control_pid <= 0)
1192                         return -EBADMSG;
1193
1194                 r = unit_watch_pid(UNIT(s), s->control_pid);
1195                 if (r < 0)
1196                         return r;
1197
1198                 r = socket_arm_timer(s);
1199                 if (r < 0)
1200                         return r;
1201         }
1202
1203         if (s->deserialized_state == SOCKET_START_POST ||
1204             s->deserialized_state == SOCKET_LISTENING ||
1205             s->deserialized_state == SOCKET_RUNNING ||
1206             s->deserialized_state == SOCKET_STOP_PRE ||
1207             s->deserialized_state == SOCKET_STOP_PRE_SIGTERM ||
1208             s->deserialized_state == SOCKET_STOP_PRE_SIGKILL) {
1209                 r = socket_open_fds(s);
1210                 if (r < 0)
1211                         return r;
1212         }
1213
1214         if (s->deserialized_state == SOCKET_LISTENING) {
1215                 r = socket_watch_fds(s);
1216                 if (r < 0)
1217                         return r;
1218         }
1219
1220         socket_set_state(s, s->deserialized_state);
1221         return 0;
1222 }
1223
1224 static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
1225         pid_t pid;
1226         int r;
1227         char **argv;
1228
1229         assert(s);
1230         assert(c);
1231         assert(_pid);
1232
1233         unit_realize_cgroup(UNIT(s));
1234
1235         r = unit_setup_exec_runtime(UNIT(s));
1236         if (r < 0)
1237                 goto fail;
1238
1239         r = socket_arm_timer(s);
1240         if (r < 0)
1241                 goto fail;
1242
1243         r = unit_full_printf_strv(UNIT(s), c->argv, &argv);
1244         if (r < 0)
1245                 goto fail;
1246
1247         r = exec_spawn(c,
1248                        argv,
1249                        &s->exec_context,
1250                        NULL, 0,
1251                        UNIT(s)->manager->environment,
1252                        true,
1253                        true,
1254                        true,
1255                        UNIT(s)->manager->confirm_spawn,
1256                        UNIT(s)->manager->cgroup_supported,
1257                        UNIT(s)->cgroup_path,
1258                        UNIT(s)->id,
1259                        0,
1260                        NULL,
1261                        s->exec_runtime,
1262                        &pid);
1263
1264         strv_free(argv);
1265         if (r < 0)
1266                 goto fail;
1267
1268         r = unit_watch_pid(UNIT(s), pid);
1269         if (r < 0)
1270                 /* FIXME: we need to do something here */
1271                 goto fail;
1272
1273         *_pid = pid;
1274
1275         return 0;
1276
1277 fail:
1278         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
1279
1280         return r;
1281 }
1282
1283 static void socket_enter_dead(Socket *s, SocketResult f) {
1284         assert(s);
1285
1286         if (f != SOCKET_SUCCESS)
1287                 s->result = f;
1288
1289         exec_runtime_destroy(s->exec_runtime);
1290         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
1291
1292         socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
1293 }
1294
1295 static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
1296
1297 static void socket_enter_stop_post(Socket *s, SocketResult f) {
1298         int r;
1299         assert(s);
1300
1301         if (f != SOCKET_SUCCESS)
1302                 s->result = f;
1303
1304         socket_unwatch_control_pid(s);
1305
1306         s->control_command_id = SOCKET_EXEC_STOP_POST;
1307
1308         if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_POST])) {
1309                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1310                         goto fail;
1311
1312                 socket_set_state(s, SOCKET_STOP_POST);
1313         } else
1314                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_SUCCESS);
1315
1316         return;
1317
1318 fail:
1319         log_warning_unit(UNIT(s)->id,
1320                          "%s failed to run 'stop-post' task: %s",
1321                          UNIT(s)->id, strerror(-r));
1322         socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
1323 }
1324
1325 static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
1326         int r;
1327
1328         assert(s);
1329
1330         if (f != SOCKET_SUCCESS)
1331                 s->result = f;
1332
1333         r = unit_kill_context(
1334                         UNIT(s),
1335                         &s->kill_context,
1336                         state != SOCKET_STOP_PRE_SIGTERM && state != SOCKET_FINAL_SIGTERM,
1337                         -1,
1338                         s->control_pid,
1339                         false);
1340         if (r < 0)
1341                 goto fail;
1342
1343         if (r > 0) {
1344                 r = socket_arm_timer(s);
1345                 if (r < 0)
1346                         goto fail;
1347
1348                 socket_set_state(s, state);
1349         } else if (state == SOCKET_STOP_PRE_SIGTERM)
1350                 socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_SUCCESS);
1351         else if (state == SOCKET_STOP_PRE_SIGKILL)
1352                 socket_enter_stop_post(s, SOCKET_SUCCESS);
1353         else if (state == SOCKET_FINAL_SIGTERM)
1354                 socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_SUCCESS);
1355         else
1356                 socket_enter_dead(s, SOCKET_SUCCESS);
1357
1358         return;
1359
1360 fail:
1361         log_warning_unit(UNIT(s)->id, "%s failed to kill processes: %s", UNIT(s)->id, strerror(-r));
1362
1363         if (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_STOP_PRE_SIGKILL)
1364                 socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
1365         else
1366                 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1367 }
1368
1369 static void socket_enter_stop_pre(Socket *s, SocketResult f) {
1370         int r;
1371         assert(s);
1372
1373         if (f != SOCKET_SUCCESS)
1374                 s->result = f;
1375
1376         socket_unwatch_control_pid(s);
1377
1378         s->control_command_id = SOCKET_EXEC_STOP_PRE;
1379
1380         if ((s->control_command = s->exec_command[SOCKET_EXEC_STOP_PRE])) {
1381                 if ((r = socket_spawn(s, s->control_command, &s->control_pid)) < 0)
1382                         goto fail;
1383
1384                 socket_set_state(s, SOCKET_STOP_PRE);
1385         } else
1386                 socket_enter_stop_post(s, SOCKET_SUCCESS);
1387
1388         return;
1389
1390 fail:
1391         log_warning_unit(UNIT(s)->id, "%s failed to run 'stop-pre' task: %s", UNIT(s)->id, strerror(-r));
1392         socket_enter_stop_post(s, SOCKET_FAILURE_RESOURCES);
1393 }
1394
1395 static void socket_enter_listening(Socket *s) {
1396         int r;
1397         assert(s);
1398
1399         r = socket_watch_fds(s);
1400         if (r < 0) {
1401                 log_warning_unit(UNIT(s)->id, "%s failed to watch sockets: %s", UNIT(s)->id, strerror(-r));
1402                 goto fail;
1403         }
1404
1405         socket_set_state(s, SOCKET_LISTENING);
1406         return;
1407
1408 fail:
1409         socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1410 }
1411
1412 static void socket_enter_start_post(Socket *s) {
1413         int r;
1414         assert(s);
1415
1416         r = socket_open_fds(s);
1417         if (r < 0) {
1418                 log_warning_unit(UNIT(s)->id, "%s failed to listen on sockets: %s", UNIT(s)->id, strerror(-r));
1419                 goto fail;
1420         }
1421
1422         socket_unwatch_control_pid(s);
1423
1424         s->control_command_id = SOCKET_EXEC_START_POST;
1425
1426         if ((s->control_command = s->exec_command[SOCKET_EXEC_START_POST])) {
1427                 r = socket_spawn(s, s->control_command, &s->control_pid);
1428                 if (r < 0) {
1429                         log_warning_unit(UNIT(s)->id, "%s failed to run 'start-post' task: %s", UNIT(s)->id, strerror(-r));
1430                         goto fail;
1431                 }
1432
1433                 socket_set_state(s, SOCKET_START_POST);
1434         } else
1435                 socket_enter_listening(s);
1436
1437         return;
1438
1439 fail:
1440         socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1441 }
1442
1443 static void socket_enter_start_pre(Socket *s) {
1444         int r;
1445         assert(s);
1446
1447         socket_unwatch_control_pid(s);
1448
1449         s->control_command_id = SOCKET_EXEC_START_PRE;
1450
1451         if ((s->control_command = s->exec_command[SOCKET_EXEC_START_PRE])) {
1452                 r = socket_spawn(s, s->control_command, &s->control_pid);
1453                 if (r < 0)
1454                         goto fail;
1455
1456                 socket_set_state(s, SOCKET_START_PRE);
1457         } else
1458                 socket_enter_start_post(s);
1459
1460         return;
1461
1462 fail:
1463         log_warning_unit(UNIT(s)->id, "%s failed to run 'start-pre' task: %s", UNIT(s)->id, strerror(-r));
1464         socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1465 }
1466
1467 static void socket_enter_running(Socket *s, int cfd) {
1468         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1469         int r;
1470
1471         assert(s);
1472
1473         /* We don't take connections anymore if we are supposed to
1474          * shut down anyway */
1475         if (unit_stop_pending(UNIT(s))) {
1476
1477                 log_debug_unit(UNIT(s)->id, "Suppressing connection request on %s since unit stop is scheduled.", UNIT(s)->id);
1478
1479                 if (cfd >= 0)
1480                         close_nointr_nofail(cfd);
1481                 else  {
1482                         /* Flush all sockets by closing and reopening them */
1483                         socket_close_fds(s);
1484
1485                         r = socket_open_fds(s);
1486                         if (r < 0) {
1487                                 log_warning_unit(UNIT(s)->id, "%s failed to listen on sockets: %s", UNIT(s)->id, strerror(-r));
1488                                 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1489                                 return;
1490                         }
1491
1492                         r = socket_watch_fds(s);
1493                         if (r < 0) {
1494                                 log_warning_unit(UNIT(s)->id, "%s failed to watch sockets: %s", UNIT(s)->id, strerror(-r));
1495                                 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1496                         }
1497                 }
1498
1499                 return;
1500         }
1501
1502         if (cfd < 0) {
1503                 Iterator i;
1504                 Unit *other;
1505                 bool pending = false;
1506
1507                 /* If there's already a start pending don't bother to
1508                  * do anything */
1509                 SET_FOREACH(other, UNIT(s)->dependencies[UNIT_TRIGGERS], i)
1510                         if (unit_active_or_pending(other)) {
1511                                 pending = true;
1512                                 break;
1513                         }
1514
1515                 if (!pending) {
1516                         r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, true, &error, NULL);
1517                         if (r < 0)
1518                                 goto fail;
1519                 }
1520
1521                 socket_set_state(s, SOCKET_RUNNING);
1522         } else {
1523                 _cleanup_free_ char *prefix = NULL, *instance = NULL, *name = NULL;
1524                 Service *service;
1525
1526                 if (s->n_connections >= s->max_connections) {
1527                         log_warning_unit(UNIT(s)->id, "%s: Too many incoming connections (%u)", UNIT(s)->id, s->n_connections);
1528                         close_nointr_nofail(cfd);
1529                         return;
1530                 }
1531
1532                 r = socket_instantiate_service(s);
1533                 if (r < 0)
1534                         goto fail;
1535
1536                 r = instance_from_socket(cfd, s->n_accepted, &instance);
1537                 if (r < 0) {
1538                         if (r != -ENOTCONN)
1539                                 goto fail;
1540
1541                         /* ENOTCONN is legitimate if TCP RST was received.
1542                          * This connection is over, but the socket unit lives on. */
1543                         close_nointr_nofail(cfd);
1544                         return;
1545                 }
1546
1547                 prefix = unit_name_to_prefix(UNIT(s)->id);
1548                 if (!prefix) {
1549                         r = -ENOMEM;
1550                         goto fail;
1551                 }
1552
1553                 name = unit_name_build(prefix, instance, ".service");
1554                 if (!name) {
1555                         r = -ENOMEM;
1556                         goto fail;
1557                 }
1558
1559                 r = unit_add_name(UNIT_DEREF(s->service), name);
1560                 if (r < 0)
1561                         goto fail;
1562
1563                 service = SERVICE(UNIT_DEREF(s->service));
1564                 unit_ref_unset(&s->service);
1565                 s->n_accepted ++;
1566
1567                 UNIT(service)->no_gc = false;
1568
1569                 unit_choose_id(UNIT(service), name);
1570
1571                 r = service_set_socket_fd(service, cfd, s);
1572                 if (r < 0)
1573                         goto fail;
1574
1575                 cfd = -1;
1576                 s->n_connections ++;
1577
1578                 r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT(service), JOB_REPLACE, true, &error, NULL);
1579                 if (r < 0)
1580                         goto fail;
1581
1582                 /* Notify clients about changed counters */
1583                 unit_add_to_dbus_queue(UNIT(s));
1584         }
1585
1586         return;
1587
1588 fail:
1589         log_warning_unit(UNIT(s)->id, "%s failed to queue service startup job (Maybe the service file is missing or not a %s unit?): %s",
1590                          UNIT(s)->id, cfd >= 0 ? "template" : "non-template",
1591                          bus_error_message(&error, r));
1592
1593         socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1594
1595         if (cfd >= 0)
1596                 close_nointr_nofail(cfd);
1597 }
1598
1599 static void socket_run_next(Socket *s) {
1600         int r;
1601
1602         assert(s);
1603         assert(s->control_command);
1604         assert(s->control_command->command_next);
1605
1606         socket_unwatch_control_pid(s);
1607
1608         s->control_command = s->control_command->command_next;
1609
1610         r = socket_spawn(s, s->control_command, &s->control_pid);
1611         if (r < 0)
1612                 goto fail;
1613
1614         return;
1615
1616 fail:
1617         log_warning_unit(UNIT(s)->id, "%s failed to run next task: %s", UNIT(s)->id, strerror(-r));
1618
1619         if (s->state == SOCKET_START_POST)
1620                 socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES);
1621         else if (s->state == SOCKET_STOP_POST)
1622                 socket_enter_dead(s, SOCKET_FAILURE_RESOURCES);
1623         else
1624                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
1625 }
1626
1627 static int socket_start(Unit *u) {
1628         Socket *s = SOCKET(u);
1629
1630         assert(s);
1631
1632         /* We cannot fulfill this request right now, try again later
1633          * please! */
1634         if (s->state == SOCKET_STOP_PRE ||
1635             s->state == SOCKET_STOP_PRE_SIGKILL ||
1636             s->state == SOCKET_STOP_PRE_SIGTERM ||
1637             s->state == SOCKET_STOP_POST ||
1638             s->state == SOCKET_FINAL_SIGTERM ||
1639             s->state == SOCKET_FINAL_SIGKILL)
1640                 return -EAGAIN;
1641
1642         if (s->state == SOCKET_START_PRE ||
1643             s->state == SOCKET_START_POST)
1644                 return 0;
1645
1646         /* Cannot run this without the service being around */
1647         if (UNIT_ISSET(s->service)) {
1648                 Service *service;
1649
1650                 service = SERVICE(UNIT_DEREF(s->service));
1651
1652                 if (UNIT(service)->load_state != UNIT_LOADED) {
1653                         log_error_unit(u->id, "Socket service %s not loaded, refusing.", UNIT(service)->id);
1654                         return -ENOENT;
1655                 }
1656
1657                 /* If the service is already active we cannot start the
1658                  * socket */
1659                 if (service->state != SERVICE_DEAD &&
1660                     service->state != SERVICE_FAILED &&
1661                     service->state != SERVICE_AUTO_RESTART) {
1662                         log_error_unit(u->id, "Socket service %s already active, refusing.", UNIT(service)->id);
1663                         return -EBUSY;
1664                 }
1665
1666 #ifdef HAVE_SYSV_COMPAT
1667                 if (service->is_sysv) {
1668                         log_error_unit(u->id,
1669                                        "Using SysV services for socket activation is not supported. Refusing.");
1670                         return -ENOENT;
1671                 }
1672 #endif
1673         }
1674
1675         assert(s->state == SOCKET_DEAD || s->state == SOCKET_FAILED);
1676
1677         s->result = SOCKET_SUCCESS;
1678         socket_enter_start_pre(s);
1679
1680         return 0;
1681 }
1682
1683 static int socket_stop(Unit *u) {
1684         Socket *s = SOCKET(u);
1685
1686         assert(s);
1687
1688         /* Already on it */
1689         if (s->state == SOCKET_STOP_PRE ||
1690             s->state == SOCKET_STOP_PRE_SIGTERM ||
1691             s->state == SOCKET_STOP_PRE_SIGKILL ||
1692             s->state == SOCKET_STOP_POST ||
1693             s->state == SOCKET_FINAL_SIGTERM ||
1694             s->state == SOCKET_FINAL_SIGKILL)
1695                 return 0;
1696
1697         /* If there's already something running we go directly into
1698          * kill mode. */
1699         if (s->state == SOCKET_START_PRE ||
1700             s->state == SOCKET_START_POST) {
1701                 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
1702                 return -EAGAIN;
1703         }
1704
1705         assert(s->state == SOCKET_LISTENING || s->state == SOCKET_RUNNING);
1706
1707         socket_enter_stop_pre(s, SOCKET_SUCCESS);
1708         return 0;
1709 }
1710
1711 static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
1712         Socket *s = SOCKET(u);
1713         SocketPort *p;
1714         int r;
1715
1716         assert(u);
1717         assert(f);
1718         assert(fds);
1719
1720         unit_serialize_item(u, f, "state", socket_state_to_string(s->state));
1721         unit_serialize_item(u, f, "result", socket_result_to_string(s->result));
1722         unit_serialize_item_format(u, f, "n-accepted", "%u", s->n_accepted);
1723
1724         if (s->control_pid > 0)
1725                 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid);
1726
1727         if (s->control_command_id >= 0)
1728                 unit_serialize_item(u, f, "control-command", socket_exec_command_to_string(s->control_command_id));
1729
1730         LIST_FOREACH(port, p, s->ports) {
1731                 int copy;
1732
1733                 if (p->fd < 0)
1734                         continue;
1735
1736                 copy = fdset_put_dup(fds, p->fd);
1737                 if (copy < 0)
1738                         return copy;
1739
1740                 if (p->type == SOCKET_SOCKET) {
1741                         _cleanup_free_ char *t = NULL;
1742
1743                         r = socket_address_print(&p->address, &t);
1744                         if (r < 0)
1745                                 return r;
1746
1747                         if (socket_address_family(&p->address) == AF_NETLINK)
1748                                 unit_serialize_item_format(u, f, "netlink", "%i %s", copy, t);
1749                         else
1750                                 unit_serialize_item_format(u, f, "socket", "%i %i %s", copy, p->address.type, t);
1751
1752                 } else if (p->type == SOCKET_SPECIAL)
1753                         unit_serialize_item_format(u, f, "special", "%i %s", copy, p->path);
1754                 else if (p->type == SOCKET_MQUEUE)
1755                         unit_serialize_item_format(u, f, "mqueue", "%i %s", copy, p->path);
1756                 else {
1757                         assert(p->type == SOCKET_FIFO);
1758                         unit_serialize_item_format(u, f, "fifo", "%i %s", copy, p->path);
1759                 }
1760         }
1761
1762         return 0;
1763 }
1764
1765 static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1766         Socket *s = SOCKET(u);
1767
1768         assert(u);
1769         assert(key);
1770         assert(value);
1771
1772         if (streq(key, "state")) {
1773                 SocketState state;
1774
1775                 state = socket_state_from_string(value);
1776                 if (state < 0)
1777                         log_debug_unit(u->id, "Failed to parse state value %s", value);
1778                 else
1779                         s->deserialized_state = state;
1780         } else if (streq(key, "result")) {
1781                 SocketResult f;
1782
1783                 f = socket_result_from_string(value);
1784                 if (f < 0)
1785                         log_debug_unit(u->id, "Failed to parse result value %s", value);
1786                 else if (f != SOCKET_SUCCESS)
1787                         s->result = f;
1788
1789         } else if (streq(key, "n-accepted")) {
1790                 unsigned k;
1791
1792                 if (safe_atou(value, &k) < 0)
1793                         log_debug_unit(u->id, "Failed to parse n-accepted value %s", value);
1794                 else
1795                         s->n_accepted += k;
1796         } else if (streq(key, "control-pid")) {
1797                 pid_t pid;
1798
1799                 if (parse_pid(value, &pid) < 0)
1800                         log_debug_unit(u->id, "Failed to parse control-pid value %s", value);
1801                 else
1802                         s->control_pid = pid;
1803         } else if (streq(key, "control-command")) {
1804                 SocketExecCommand id;
1805
1806                 id = socket_exec_command_from_string(value);
1807                 if (id < 0)
1808                         log_debug_unit(u->id, "Failed to parse exec-command value %s", value);
1809                 else {
1810                         s->control_command_id = id;
1811                         s->control_command = s->exec_command[id];
1812                 }
1813         } else if (streq(key, "fifo")) {
1814                 int fd, skip = 0;
1815                 SocketPort *p;
1816
1817                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1818                         log_debug_unit(u->id, "Failed to parse fifo value %s", value);
1819                 else {
1820
1821                         LIST_FOREACH(port, p, s->ports)
1822                                 if (p->type == SOCKET_FIFO &&
1823                                     streq_ptr(p->path, value+skip))
1824                                         break;
1825
1826                         if (p) {
1827                                 if (p->fd >= 0)
1828                                         close_nointr_nofail(p->fd);
1829                                 p->fd = fdset_remove(fds, fd);
1830                         }
1831                 }
1832
1833         } else if (streq(key, "special")) {
1834                 int fd, skip = 0;
1835                 SocketPort *p;
1836
1837                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1838                         log_debug_unit(u->id, "Failed to parse special value %s", value);
1839                 else {
1840
1841                         LIST_FOREACH(port, p, s->ports)
1842                                 if (p->type == SOCKET_SPECIAL &&
1843                                     streq_ptr(p->path, value+skip))
1844                                         break;
1845
1846                         if (p) {
1847                                 if (p->fd >= 0)
1848                                         close_nointr_nofail(p->fd);
1849                                 p->fd = fdset_remove(fds, fd);
1850                         }
1851                 }
1852
1853         } else if (streq(key, "mqueue")) {
1854                 int fd, skip = 0;
1855                 SocketPort *p;
1856
1857                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1858                         log_debug_unit(u->id, "Failed to parse mqueue value %s", value);
1859                 else {
1860
1861                         LIST_FOREACH(port, p, s->ports)
1862                                 if (p->type == SOCKET_MQUEUE &&
1863                                     streq_ptr(p->path, value+skip))
1864                                         break;
1865
1866                         if (p) {
1867                                 if (p->fd >= 0)
1868                                         close_nointr_nofail(p->fd);
1869                                 p->fd = fdset_remove(fds, fd);
1870                         }
1871                 }
1872
1873         } else if (streq(key, "socket")) {
1874                 int fd, type, skip = 0;
1875                 SocketPort *p;
1876
1877                 if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd))
1878                         log_debug_unit(u->id, "Failed to parse socket value %s", value);
1879                 else {
1880
1881                         LIST_FOREACH(port, p, s->ports)
1882                                 if (socket_address_is(&p->address, value+skip, type))
1883                                         break;
1884
1885                         if (p) {
1886                                 if (p->fd >= 0)
1887                                         close_nointr_nofail(p->fd);
1888                                 p->fd = fdset_remove(fds, fd);
1889                         }
1890                 }
1891
1892         } else if (streq(key, "netlink")) {
1893                 int fd, skip = 0;
1894                 SocketPort *p;
1895
1896                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
1897                         log_debug_unit(u->id, "Failed to parse socket value %s", value);
1898                 else {
1899
1900                         LIST_FOREACH(port, p, s->ports)
1901                                 if (socket_address_is_netlink(&p->address, value+skip))
1902                                         break;
1903
1904                         if (p) {
1905                                 if (p->fd >= 0)
1906                                         close_nointr_nofail(p->fd);
1907                                 p->fd = fdset_remove(fds, fd);
1908                         }
1909                 }
1910         } else
1911                 log_debug_unit(UNIT(s)->id, "Unknown serialization key '%s'", key);
1912
1913         return 0;
1914 }
1915
1916 static int socket_distribute_fds(Unit *u, FDSet *fds) {
1917         Socket *s = SOCKET(u);
1918         SocketPort *p;
1919
1920         assert(u);
1921
1922         LIST_FOREACH(port, p, s->ports) {
1923                 Iterator i;
1924                 int fd;
1925
1926                 if (p->type != SOCKET_SOCKET)
1927                         continue;
1928
1929                 if (p->fd >= 0)
1930                         continue;
1931
1932                 FDSET_FOREACH(fd, fds, i) {
1933                         if (socket_address_matches_fd(&p->address, fd)) {
1934                                 p->fd = fdset_remove(fds, fd);
1935                                 s->deserialized_state = SOCKET_LISTENING;
1936                                 break;
1937                         }
1938                 }
1939         }
1940
1941         return 0;
1942 }
1943
1944 _pure_ static UnitActiveState socket_active_state(Unit *u) {
1945         assert(u);
1946
1947         return state_translation_table[SOCKET(u)->state];
1948 }
1949
1950 _pure_ static const char *socket_sub_state_to_string(Unit *u) {
1951         assert(u);
1952
1953         return socket_state_to_string(SOCKET(u)->state);
1954 }
1955
1956 const char* socket_port_type_to_string(SocketPort *p) {
1957
1958         assert(p);
1959
1960         switch (p->type) {
1961
1962         case SOCKET_SOCKET:
1963
1964                 switch (p->address.type) {
1965
1966                 case SOCK_STREAM:
1967                         return "Stream";
1968
1969                 case SOCK_DGRAM:
1970                         return "Datagram";
1971
1972                 case SOCK_SEQPACKET:
1973                         return "SequentialPacket";
1974
1975                 case SOCK_RAW:
1976                         if (socket_address_family(&p->address) == AF_NETLINK)
1977                                 return "Netlink";
1978
1979                 default:
1980                         return NULL;
1981                 }
1982
1983         case SOCKET_SPECIAL:
1984                 return "Special";
1985
1986         case SOCKET_MQUEUE:
1987                 return "MessageQueue";
1988
1989         case SOCKET_FIFO:
1990                 return "FIFO";
1991
1992         default:
1993                 return NULL;
1994         }
1995 }
1996
1997 _pure_ static bool socket_check_gc(Unit *u) {
1998         Socket *s = SOCKET(u);
1999
2000         assert(u);
2001
2002         return s->n_connections > 0;
2003 }
2004
2005 static int socket_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
2006         SocketPort *p = userdata;
2007         int cfd = -1;
2008
2009         assert(p);
2010         assert(fd >= 0);
2011
2012         if (p->socket->state != SOCKET_LISTENING)
2013                 return 0;
2014
2015         log_debug_unit(UNIT(p->socket)->id, "Incoming traffic on %s", UNIT(p->socket)->id);
2016
2017         if (revents != EPOLLIN) {
2018
2019                 if (revents & EPOLLHUP)
2020                         log_error_unit(UNIT(p->socket)->id, "%s: Got POLLHUP on a listening socket. The service probably invoked shutdown() on it, and should better not do that.",
2021                                        UNIT(p->socket)->id);
2022                 else
2023                         log_error_unit(UNIT(p->socket)->id, "%s: Got unexpected poll event (0x%x) on socket.",
2024                                        UNIT(p->socket)->id, revents);
2025
2026                 goto fail;
2027         }
2028
2029         if (p->socket->accept &&
2030             p->type == SOCKET_SOCKET &&
2031             socket_address_can_accept(&p->address)) {
2032
2033                 for (;;) {
2034
2035                         cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK);
2036                         if (cfd < 0) {
2037
2038                                 if (errno == EINTR)
2039                                         continue;
2040
2041                                 log_error_unit(UNIT(p->socket)->id,
2042                                                "Failed to accept socket: %m");
2043                                 goto fail;
2044                         }
2045
2046                         break;
2047                 }
2048
2049                 socket_apply_socket_options(p->socket, cfd);
2050         }
2051
2052         socket_enter_running(p->socket, cfd);
2053         return 0;
2054
2055 fail:
2056         socket_enter_stop_pre(p->socket, SOCKET_FAILURE_RESOURCES);
2057         return 0;
2058 }
2059
2060 static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
2061         Socket *s = SOCKET(u);
2062         SocketResult f;
2063
2064         assert(s);
2065         assert(pid >= 0);
2066
2067         if (pid != s->control_pid)
2068                 return;
2069
2070         s->control_pid = 0;
2071
2072         if (is_clean_exit(code, status, NULL))
2073                 f = SOCKET_SUCCESS;
2074         else if (code == CLD_EXITED)
2075                 f = SOCKET_FAILURE_EXIT_CODE;
2076         else if (code == CLD_KILLED)
2077                 f = SOCKET_FAILURE_SIGNAL;
2078         else if (code == CLD_DUMPED)
2079                 f = SOCKET_FAILURE_CORE_DUMP;
2080         else
2081                 assert_not_reached("Unknown code");
2082
2083         if (s->control_command) {
2084                 exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
2085
2086                 if (s->control_command->ignore)
2087                         f = SOCKET_SUCCESS;
2088         }
2089
2090         log_full_unit(f == SOCKET_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
2091                       u->id,
2092                       "%s control process exited, code=%s status=%i",
2093                       u->id, sigchld_code_to_string(code), status);
2094
2095         if (f != SOCKET_SUCCESS)
2096                 s->result = f;
2097
2098         if (s->control_command &&
2099             s->control_command->command_next &&
2100             f == SOCKET_SUCCESS) {
2101
2102                 log_debug_unit(u->id,
2103                                "%s running next command for state %s",
2104                                u->id, socket_state_to_string(s->state));
2105                 socket_run_next(s);
2106         } else {
2107                 s->control_command = NULL;
2108                 s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
2109
2110                 /* No further commands for this step, so let's figure
2111                  * out what to do next */
2112
2113                 log_debug_unit(u->id,
2114                                "%s got final SIGCHLD for state %s",
2115                                u->id, socket_state_to_string(s->state));
2116
2117                 switch (s->state) {
2118
2119                 case SOCKET_START_PRE:
2120                         if (f == SOCKET_SUCCESS)
2121                                 socket_enter_start_post(s);
2122                         else
2123                                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, f);
2124                         break;
2125
2126                 case SOCKET_START_POST:
2127                         if (f == SOCKET_SUCCESS)
2128                                 socket_enter_listening(s);
2129                         else
2130                                 socket_enter_stop_pre(s, f);
2131                         break;
2132
2133                 case SOCKET_STOP_PRE:
2134                 case SOCKET_STOP_PRE_SIGTERM:
2135                 case SOCKET_STOP_PRE_SIGKILL:
2136                         socket_enter_stop_post(s, f);
2137                         break;
2138
2139                 case SOCKET_STOP_POST:
2140                 case SOCKET_FINAL_SIGTERM:
2141                 case SOCKET_FINAL_SIGKILL:
2142                         socket_enter_dead(s, f);
2143                         break;
2144
2145                 default:
2146                         assert_not_reached("Uh, control process died at wrong time.");
2147                 }
2148         }
2149
2150         /* Notify clients about changed exit status */
2151         unit_add_to_dbus_queue(u);
2152 }
2153
2154 static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
2155         Socket *s = SOCKET(userdata);
2156
2157         assert(s);
2158         assert(s->timer_event_source == source);
2159
2160         switch (s->state) {
2161
2162         case SOCKET_START_PRE:
2163                 log_warning_unit(UNIT(s)->id,
2164                                  "%s starting timed out. Terminating.", UNIT(s)->id);
2165                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2166                 break;
2167
2168         case SOCKET_START_POST:
2169                 log_warning_unit(UNIT(s)->id,
2170                                  "%s starting timed out. Stopping.", UNIT(s)->id);
2171                 socket_enter_stop_pre(s, SOCKET_FAILURE_TIMEOUT);
2172                 break;
2173
2174         case SOCKET_STOP_PRE:
2175                 log_warning_unit(UNIT(s)->id,
2176                                  "%s stopping timed out. Terminating.", UNIT(s)->id);
2177                 socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2178                 break;
2179
2180         case SOCKET_STOP_PRE_SIGTERM:
2181                 if (s->kill_context.send_sigkill) {
2182                         log_warning_unit(UNIT(s)->id,
2183                                          "%s stopping timed out. Killing.", UNIT(s)->id);
2184                         socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
2185                 } else {
2186                         log_warning_unit(UNIT(s)->id,
2187                                          "%s stopping timed out. Skipping SIGKILL. Ignoring.",
2188                                          UNIT(s)->id);
2189                         socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
2190                 }
2191                 break;
2192
2193         case SOCKET_STOP_PRE_SIGKILL:
2194                 log_warning_unit(UNIT(s)->id,
2195                                  "%s still around after SIGKILL. Ignoring.", UNIT(s)->id);
2196                 socket_enter_stop_post(s, SOCKET_FAILURE_TIMEOUT);
2197                 break;
2198
2199         case SOCKET_STOP_POST:
2200                 log_warning_unit(UNIT(s)->id,
2201                                  "%s stopping timed out (2). Terminating.", UNIT(s)->id);
2202                 socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_TIMEOUT);
2203                 break;
2204
2205         case SOCKET_FINAL_SIGTERM:
2206                 if (s->kill_context.send_sigkill) {
2207                         log_warning_unit(UNIT(s)->id,
2208                                          "%s stopping timed out (2). Killing.", UNIT(s)->id);
2209                         socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
2210                 } else {
2211                         log_warning_unit(UNIT(s)->id,
2212                                          "%s stopping timed out (2). Skipping SIGKILL. Ignoring.",
2213                                          UNIT(s)->id);
2214                         socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
2215                 }
2216                 break;
2217
2218         case SOCKET_FINAL_SIGKILL:
2219                 log_warning_unit(UNIT(s)->id,
2220                                  "%s still around after SIGKILL (2). Entering failed mode.",
2221                                  UNIT(s)->id);
2222                 socket_enter_dead(s, SOCKET_FAILURE_TIMEOUT);
2223                 break;
2224
2225         default:
2226                 assert_not_reached("Timeout at wrong time.");
2227         }
2228
2229         return 0;
2230 }
2231
2232 int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
2233         int *rfds;
2234         unsigned rn_fds, k;
2235         SocketPort *p;
2236
2237         assert(s);
2238         assert(fds);
2239         assert(n_fds);
2240
2241         /* Called from the service code for requesting our fds */
2242
2243         rn_fds = 0;
2244         LIST_FOREACH(port, p, s->ports)
2245                 if (p->fd >= 0)
2246                         rn_fds++;
2247
2248         if (rn_fds <= 0) {
2249                 *fds = NULL;
2250                 *n_fds = 0;
2251                 return 0;
2252         }
2253
2254         if (!(rfds = new(int, rn_fds)))
2255                 return -ENOMEM;
2256
2257         k = 0;
2258         LIST_FOREACH(port, p, s->ports)
2259                 if (p->fd >= 0)
2260                         rfds[k++] = p->fd;
2261
2262         assert(k == rn_fds);
2263
2264         *fds = rfds;
2265         *n_fds = rn_fds;
2266
2267         return 0;
2268 }
2269
2270 static void socket_reset_failed(Unit *u) {
2271         Socket *s = SOCKET(u);
2272
2273         assert(s);
2274
2275         if (s->state == SOCKET_FAILED)
2276                 socket_set_state(s, SOCKET_DEAD);
2277
2278         s->result = SOCKET_SUCCESS;
2279 }
2280
2281 static void socket_notify_service_dead(Socket *s, bool failed_permanent) {
2282         assert(s);
2283
2284         /* The service is dead. Dang!
2285          *
2286          * This is strictly for one-instance-for-all-connections
2287          * services. */
2288
2289         if (s->state == SOCKET_RUNNING) {
2290                 log_debug_unit(UNIT(s)->id, "%s got notified about service death (failed permanently: %s)", UNIT(s)->id, yes_no(failed_permanent));
2291                 if (failed_permanent)
2292                         socket_enter_stop_pre(s, SOCKET_FAILURE_SERVICE_FAILED_PERMANENT);
2293                 else
2294                         socket_enter_listening(s);
2295         }
2296 }
2297
2298 void socket_connection_unref(Socket *s) {
2299         assert(s);
2300
2301         /* The service is dead. Yay!
2302          *
2303          * This is strictly for one-instance-per-connection
2304          * services. */
2305
2306         assert(s->n_connections > 0);
2307         s->n_connections--;
2308
2309         log_debug_unit(UNIT(s)->id, "%s: One connection closed, %u left.", UNIT(s)->id, s->n_connections);
2310 }
2311
2312 static void socket_trigger_notify(Unit *u, Unit *other) {
2313         Socket *s = SOCKET(u);
2314         Service *se;
2315
2316         assert(u);
2317         assert(other);
2318
2319         /* Don't propagate state changes from the service if we are
2320            already down or accepting connections */
2321         if ((s->state !=  SOCKET_RUNNING &&
2322             s->state != SOCKET_LISTENING) ||
2323             s->accept)
2324                 return;
2325
2326         if (other->load_state != UNIT_LOADED ||
2327             other->type != UNIT_SERVICE)
2328                 return;
2329
2330         se = SERVICE(other);
2331
2332         if (se->state == SERVICE_FAILED)
2333                 socket_notify_service_dead(s, se->result == SERVICE_FAILURE_START_LIMIT);
2334
2335         if (se->state == SERVICE_DEAD ||
2336             se->state == SERVICE_STOP ||
2337             se->state == SERVICE_STOP_SIGTERM ||
2338             se->state == SERVICE_STOP_SIGKILL ||
2339             se->state == SERVICE_STOP_POST ||
2340             se->state == SERVICE_FINAL_SIGTERM ||
2341             se->state == SERVICE_FINAL_SIGKILL ||
2342             se->state == SERVICE_AUTO_RESTART)
2343                 socket_notify_service_dead(s, false);
2344
2345         if (se->state == SERVICE_RUNNING)
2346                 socket_set_state(s, SOCKET_RUNNING);
2347 }
2348
2349 static int socket_kill(Unit *u, KillWho who, int signo, sd_bus_error *error) {
2350         return unit_kill_common(u, who, signo, -1, SOCKET(u)->control_pid, error);
2351 }
2352
2353 static int socket_get_timeout(Unit *u, uint64_t *timeout) {
2354         Socket *s = SOCKET(u);
2355         int r;
2356
2357         if (!s->timer_event_source)
2358                 return 0;
2359
2360         r = sd_event_source_get_time(s->timer_event_source, timeout);
2361         if (r < 0)
2362                 return r;
2363
2364         return 1;
2365 }
2366
2367 static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
2368         [SOCKET_DEAD] = "dead",
2369         [SOCKET_START_PRE] = "start-pre",
2370         [SOCKET_START_POST] = "start-post",
2371         [SOCKET_LISTENING] = "listening",
2372         [SOCKET_RUNNING] = "running",
2373         [SOCKET_STOP_PRE] = "stop-pre",
2374         [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
2375         [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
2376         [SOCKET_STOP_POST] = "stop-post",
2377         [SOCKET_FINAL_SIGTERM] = "final-sigterm",
2378         [SOCKET_FINAL_SIGKILL] = "final-sigkill",
2379         [SOCKET_FAILED] = "failed"
2380 };
2381
2382 DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
2383
2384 static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = {
2385         [SOCKET_EXEC_START_PRE] = "StartPre",
2386         [SOCKET_EXEC_START_POST] = "StartPost",
2387         [SOCKET_EXEC_STOP_PRE] = "StopPre",
2388         [SOCKET_EXEC_STOP_POST] = "StopPost"
2389 };
2390
2391 DEFINE_STRING_TABLE_LOOKUP(socket_exec_command, SocketExecCommand);
2392
2393 static const char* const socket_result_table[_SOCKET_RESULT_MAX] = {
2394         [SOCKET_SUCCESS] = "success",
2395         [SOCKET_FAILURE_RESOURCES] = "resources",
2396         [SOCKET_FAILURE_TIMEOUT] = "timeout",
2397         [SOCKET_FAILURE_EXIT_CODE] = "exit-code",
2398         [SOCKET_FAILURE_SIGNAL] = "signal",
2399         [SOCKET_FAILURE_CORE_DUMP] = "core-dump",
2400         [SOCKET_FAILURE_SERVICE_FAILED_PERMANENT] = "service-failed-permanent"
2401 };
2402
2403 DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
2404
2405 const UnitVTable socket_vtable = {
2406         .object_size = sizeof(Socket),
2407         .exec_context_offset = offsetof(Socket, exec_context),
2408         .cgroup_context_offset = offsetof(Socket, cgroup_context),
2409         .kill_context_offset = offsetof(Socket, kill_context),
2410         .exec_runtime_offset = offsetof(Socket, exec_runtime),
2411
2412         .sections =
2413                 "Unit\0"
2414                 "Socket\0"
2415                 "Install\0",
2416         .private_section = "Socket",
2417
2418         .init = socket_init,
2419         .done = socket_done,
2420         .load = socket_load,
2421
2422         .coldplug = socket_coldplug,
2423
2424         .dump = socket_dump,
2425
2426         .start = socket_start,
2427         .stop = socket_stop,
2428
2429         .kill = socket_kill,
2430
2431         .get_timeout = socket_get_timeout,
2432
2433         .serialize = socket_serialize,
2434         .deserialize_item = socket_deserialize_item,
2435         .distribute_fds = socket_distribute_fds,
2436
2437         .active_state = socket_active_state,
2438         .sub_state_to_string = socket_sub_state_to_string,
2439
2440         .check_gc = socket_check_gc,
2441
2442         .sigchld_event = socket_sigchld_event,
2443
2444         .trigger_notify = socket_trigger_notify,
2445
2446         .reset_failed = socket_reset_failed,
2447
2448         .bus_interface = "org.freedesktop.systemd1.Socket",
2449         .bus_vtable = bus_socket_vtable,
2450         .bus_set_property = bus_socket_set_property,
2451         .bus_commit_properties = bus_socket_commit_properties,
2452
2453         .status_message_formats = {
2454                 /*.starting_stopping = {
2455                         [0] = "Starting socket %s...",
2456                         [1] = "Stopping socket %s...",
2457                 },*/
2458                 .finished_start_job = {
2459                         [JOB_DONE]       = "Listening on %s.",
2460                         [JOB_FAILED]     = "Failed to listen on %s.",
2461                         [JOB_DEPENDENCY] = "Dependency failed for %s.",
2462                         [JOB_TIMEOUT]    = "Timed out starting %s.",
2463                 },
2464                 .finished_stop_job = {
2465                         [JOB_DONE]       = "Closed %s.",
2466                         [JOB_FAILED]     = "Failed stopping %s.",
2467                         [JOB_TIMEOUT]    = "Timed out stopping %s.",
2468                 },
2469         },
2470 };