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