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