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