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