diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/journal-importer.c | 3 | ||||
-rw-r--r-- | src/basic/parse-util.c | 1 | ||||
-rw-r--r-- | src/basic/rm-rf.c | 7 | ||||
-rw-r--r-- | src/core/busname.c | 4 | ||||
-rw-r--r-- | src/journal/journald-native.c | 2 | ||||
-rw-r--r-- | src/libsystemd-network/sd-lldp.c | 1 | ||||
-rw-r--r-- | src/machine/machinectl.c | 1 | ||||
-rw-r--r-- | src/network/networkd-network.c | 2 | ||||
-rw-r--r-- | src/resolve/resolved-gperf.gperf | 1 | ||||
-rw-r--r-- | src/resolve/resolved-link.c | 17 | ||||
-rw-r--r-- | src/resolve/resolved-llmnr.c | 194 | ||||
-rw-r--r-- | src/resolve/resolved-manager.c | 8 | ||||
-rw-r--r-- | src/resolve/resolved-mdns.c | 102 | ||||
-rw-r--r-- | src/resolve/resolved.conf.in | 1 | ||||
-rw-r--r-- | src/shared/base-filesystem.c | 2 | ||||
-rw-r--r-- | src/shared/pager.c | 4 | ||||
-rw-r--r-- | src/sulogin-shell/.gitignore | 1 | ||||
-rwxr-xr-x | src/sulogin-shell/systemd-sulogin-shell.in | 14 | ||||
-rw-r--r-- | src/systemctl/systemctl.c | 1 | ||||
-rw-r--r-- | src/systemd/sd-event.h | 2 | ||||
-rw-r--r-- | src/sysv-generator/sysv-generator.c | 3 | ||||
-rw-r--r-- | src/test/test-sizeof.c | 14 |
22 files changed, 273 insertions, 112 deletions
diff --git a/src/basic/journal-importer.c b/src/basic/journal-importer.c index d25fd358e8..66119d2de1 100644 --- a/src/basic/journal-importer.c +++ b/src/basic/journal-importer.c @@ -24,6 +24,7 @@ #include "fd-util.h" #include "parse-util.h" #include "string-util.h" +#include "unaligned.h" enum { IMPORTER_STATE_LINE = 0, /* waiting to read, or reading line */ @@ -203,7 +204,7 @@ static int get_data_size(JournalImporter *imp) { if (r <= 0) return r; - imp->data_size = le64toh( *(uint64_t *) data ); + imp->data_size = unaligned_read_le64(data); if (imp->data_size > DATA_SIZE_MAX) { log_error("Stream declares field with size %zu > DATA_SIZE_MAX = %u", imp->data_size, DATA_SIZE_MAX); diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index 6e58ced6f5..d86700736d 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -23,7 +23,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <xlocale.h> #include "alloc-util.h" #include "extract-word.h" diff --git a/src/basic/rm-rf.c b/src/basic/rm-rf.c index 08497af729..bdaca264ff 100644 --- a/src/basic/rm-rf.c +++ b/src/basic/rm-rf.c @@ -187,6 +187,13 @@ int rm_rf(const char *path, RemoveFlags flags) { return -EPERM; } + /* Another safe-check. Removing "/path/.." could easily remove entire root as well. + * It's especially easy to do using globs in tmpfiles, like "/path/.*", which the glob() + * function expands to both "/path/." and "/path/..". + * Return -EINVAL to be consistent with rmdir("/path/."). */ + if (endswith(path, "/..") || endswith(path, "/../")) + return -EINVAL; + if ((flags & (REMOVE_SUBVOLUME|REMOVE_ROOT|REMOVE_PHYSICAL)) == (REMOVE_SUBVOLUME|REMOVE_ROOT|REMOVE_PHYSICAL)) { /* Try to remove as subvolume first */ r = btrfs_subvol_remove(path, BTRFS_REMOVE_RECURSIVE|BTRFS_REMOVE_QUOTA); diff --git a/src/core/busname.c b/src/core/busname.c index 88b758eecb..955f6f88d8 100644 --- a/src/core/busname.c +++ b/src/core/busname.c @@ -764,7 +764,7 @@ static int busname_peek_message(BusName *n) { struct kdbus_item *d; struct kdbus_msg *k; size_t start, ps, sz, delta; - void *p = NULL; + void *p = MAP_FAILED; pid_t pid = 0; int r; @@ -825,7 +825,7 @@ static int busname_peek_message(BusName *n) { r = 0; finish: - if (p) + if (p != MAP_FAILED) (void) munmap(p, sz); cmd_free.offset = cmd_recv.msg.offset; diff --git a/src/journal/journald-native.c b/src/journal/journald-native.c index 3c03b83754..c9bf3832c7 100644 --- a/src/journal/journald-native.c +++ b/src/journal/journald-native.c @@ -279,7 +279,7 @@ void server_process_native_message( if (message) { if (s->forward_to_syslog) - server_forward_syslog(s, priority, identifier, message, ucred, tv); + server_forward_syslog(s, syslog_fixup_facility(priority), identifier, message, ucred, tv); if (s->forward_to_kmsg) server_forward_kmsg(s, priority, identifier, message, ucred); diff --git a/src/libsystemd-network/sd-lldp.c b/src/libsystemd-network/sd-lldp.c index 0702241506..39ddb2461a 100644 --- a/src/libsystemd-network/sd-lldp.c +++ b/src/libsystemd-network/sd-lldp.c @@ -19,6 +19,7 @@ ***/ #include <arpa/inet.h> +#include <linux/sockios.h> #include "sd-lldp.h" diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 28384286fb..3031ed5def 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -340,6 +340,7 @@ static int list_machines(int argc, char *argv[], void *userdata) { printf("No machines.\n"); } + r = 0; out: clean_machine_info(machines, n_machines); return r; diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index ab372568de..fac42d8478 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -428,7 +428,7 @@ int network_apply(Network *network, Link *link) { if (network->ipv4ll_route) { Route *route; - r = route_new_static(network, "Network", 0, &route); + r = route_new_static(network, NULL, 0, &route); if (r < 0) return r; diff --git a/src/resolve/resolved-gperf.gperf b/src/resolve/resolved-gperf.gperf index 446f85cdf4..5153563b99 100644 --- a/src/resolve/resolved-gperf.gperf +++ b/src/resolve/resolved-gperf.gperf @@ -18,6 +18,7 @@ Resolve.DNS, config_parse_dns_servers, DNS_SERVER_SYSTEM, Resolve.FallbackDNS, config_parse_dns_servers, DNS_SERVER_FALLBACK, 0 Resolve.Domains, config_parse_search_domains, 0, 0 Resolve.LLMNR, config_parse_resolve_support, 0, offsetof(Manager, llmnr_support) +Resolve.MulticastDNS, config_parse_resolve_support, 0, offsetof(Manager, mdns_support) Resolve.DNSSEC, config_parse_dnssec_mode, 0, offsetof(Manager, dnssec_mode) Resolve.Cache, config_parse_bool, 0, offsetof(Manager, enable_cache) Resolve.DNSStubListener, config_parse_dns_stub_listener_mode, 0, offsetof(Manager, dns_stub_listener_mode) diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index 3f7f9035cf..d06096f3f2 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -28,6 +28,8 @@ #include "mkdir.h" #include "parse-util.h" #include "resolved-link.h" +#include "resolved-llmnr.h" +#include "resolved-mdns.h" #include "string-util.h" #include "strv.h" @@ -523,10 +525,25 @@ static void link_read_settings(Link *l) { } int link_update(Link *l) { + int r; + assert(l); link_read_settings(l); link_load_user(l); + + if (l->llmnr_support != RESOLVE_SUPPORT_NO) { + r = manager_llmnr_start(l->manager); + if (r < 0) + return r; + } + + if (l->mdns_support != RESOLVE_SUPPORT_NO) { + r = manager_mdns_start(l->manager); + if (r < 0) + return r; + } + link_allocate_scopes(l); link_add_rrs(l, false); diff --git a/src/resolve/resolved-llmnr.c b/src/resolve/resolved-llmnr.c index 3516af58ee..29396e9973 100644 --- a/src/resolve/resolved-llmnr.c +++ b/src/resolve/resolved-llmnr.c @@ -77,7 +77,7 @@ int manager_llmnr_start(Manager *m) { return 0; eaddrinuse: - log_warning("There appears to be another LLMNR responder running. Turning off LLMNR support."); + log_warning("Another LLMNR responder prohibits binding the socket to the same port. Turning off LLMNR support."); m->llmnr_support = RESOLVE_SUPPORT_NO; manager_llmnr_stop(m); @@ -136,56 +136,75 @@ int manager_llmnr_ipv4_udp_fd(Manager *m) { m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (m->llmnr_ipv4_udp_fd < 0) - return -errno; + return log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to create socket: %m"); /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */ r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_TTL: %m"); goto fail; } r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_MULTICAST_TTL: %m"); goto fail; } r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one)); if (r < 0) { - r = -errno; - goto fail; - } - - r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_MULTICAST_LOOP: %m"); goto fail; } r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_PKTINFO: %m"); goto fail; } r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_RECVTTL: %m"); goto fail; } /* Disable Don't-Fragment bit in the IP header */ r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_MTU_DISCOVER: %m"); goto fail; } + /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */ r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in)); if (r < 0) { - r = -errno; - goto fail; + if (errno != EADDRINUSE) { + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to bind socket: %m"); + goto fail; + } + + log_warning("LLMNR-IPv4(UDP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers."); + + /* try again with SO_REUSEADDR */ + r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } + + r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to bind socket: %m"); + goto fail; + } + } else { + /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */ + r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } } r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m); @@ -216,55 +235,74 @@ int manager_llmnr_ipv6_udp_fd(Manager *m) { m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (m->llmnr_ipv6_udp_fd < 0) - return -errno; + return log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to create socket: %m"); r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_UNICAST_HOPS: %m"); goto fail; } /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */ r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_MULTICAST_HOPS: %m"); goto fail; } r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_MULTICAST_LOOP: %m"); goto fail; } r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)); if (r < 0) { - r = -errno; - goto fail; - } - - r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_V6ONLY: %m"); goto fail; } r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_RECVPKTINFO: %m"); goto fail; } r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_RECVHOPLIMIT: %m"); goto fail; } + /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */ r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6)); if (r < 0) { - r = -errno; - goto fail; + if (errno != EADDRINUSE) { + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to bind socket: %m"); + goto fail; + } + + log_warning("LLMNR-IPv6(UDP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers."); + + /* try again with SO_REUSEADDR */ + r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } + + r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to bind socket: %m"); + goto fail; + } + } else { + /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */ + r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } } r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m); @@ -338,49 +376,68 @@ int manager_llmnr_ipv4_tcp_fd(Manager *m) { m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (m->llmnr_ipv4_tcp_fd < 0) - return -errno; + return log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to create socket: %m"); /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */ r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one)); if (r < 0) { - r = -errno; - goto fail; - } - - r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_TTL: %m"); goto fail; } r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_PKTINFO: %m"); goto fail; } r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_RECVTTL: %m"); goto fail; } /* Disable Don't-Fragment bit in the IP header */ r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_MTU_DISCOVER: %m"); goto fail; } + /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */ r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in)); if (r < 0) { - r = -errno; - goto fail; + if (errno != EADDRINUSE) { + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to bind socket: %m"); + goto fail; + } + + log_warning("LLMNR-IPv4(TCP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers."); + + /* try again with SO_REUSEADDR */ + r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } + + r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to bind socket: %m"); + goto fail; + } + } else { + /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */ + r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } } r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to listen the stream: %m"); goto fail; } @@ -412,48 +469,67 @@ int manager_llmnr_ipv6_tcp_fd(Manager *m) { m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (m->llmnr_ipv6_tcp_fd < 0) - return -errno; + return log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to create socket: %m"); /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */ r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_UNICAST_HOPS: %m"); goto fail; } r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)); if (r < 0) { - r = -errno; - goto fail; - } - - r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_V6ONLY: %m"); goto fail; } r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_RECVPKTINFO: %m"); goto fail; } r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_RECVHOPLIMIT: %m"); goto fail; } + /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */ r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6)); if (r < 0) { - r = -errno; - goto fail; + if (errno != EADDRINUSE) { + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to bind socket: %m"); + goto fail; + } + + log_warning("LLMNR-IPv6(TCP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers."); + + /* try again with SO_REUSEADDR */ + r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } + + r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to bind socket: %m"); + goto fail; + } + } else { + /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */ + r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set SO_REUSEADDR: %m"); + goto fail; + } } r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to listen the stream: %m"); goto fail; } diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index c4e4409fe3..9db8b8f616 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -612,14 +612,6 @@ int manager_start(Manager *m) { if (r < 0) return r; - r = manager_llmnr_start(m); - if (r < 0) - return r; - - r = manager_mdns_start(m); - if (r < 0) - return r; - return 0; } diff --git a/src/resolve/resolved-mdns.c b/src/resolve/resolved-mdns.c index c40e8f75f0..415dc1a532 100644 --- a/src/resolve/resolved-mdns.c +++ b/src/resolve/resolved-mdns.c @@ -60,7 +60,7 @@ int manager_mdns_start(Manager *m) { return 0; eaddrinuse: - log_warning("There appears to be another mDNS responder running. Turning off mDNS support."); + log_warning("Another mDNS responder prohibits binding the socket to the same port. Turning off mDNS support."); m->mdns_support = RESOLVE_SUPPORT_NO; manager_mdns_stop(m); @@ -217,55 +217,75 @@ int manager_mdns_ipv4_fd(Manager *m) { m->mdns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (m->mdns_ipv4_fd < 0) - return -errno; + return log_error_errno(errno, "mDNS-IPv4: Failed to create socket: %m"); r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_TTL: %m"); goto fail; } r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_MULTICAST_TTL: %m"); goto fail; } r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one)); if (r < 0) { - r = -errno; - goto fail; - } - - r = setsockopt(m->mdns_ipv4_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_MULTICAST_LOOP: %m"); goto fail; } r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_PKTINFO: %m"); goto fail; } r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_RECVTTL: %m"); goto fail; } /* Disable Don't-Fragment bit in the IP header */ r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_MTU_DISCOVER: %m"); goto fail; } + /* See the section 15.1 of RFC6762 */ + /* first try to bind without SO_REUSEADDR to detect another mDNS responder */ r = bind(m->mdns_ipv4_fd, &sa.sa, sizeof(sa.in)); if (r < 0) { - r = -errno; - goto fail; + if (errno != EADDRINUSE) { + r = log_error_errno(errno, "mDNS-IPv4: Failed to bind socket: %m"); + goto fail; + } + + log_warning("mDNS-IPv4: There appears to be another mDNS responder running, or previously systemd-resolved crashed with some outstanding transfers."); + + /* try again with SO_REUSEADDR */ + r = setsockopt(m->mdns_ipv4_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "mDNS-IPv4: Failed to set SO_REUSEADDR: %m"); + goto fail; + } + + r = bind(m->mdns_ipv4_fd, &sa.sa, sizeof(sa.in)); + if (r < 0) { + r = log_error_errno(errno, "mDNS-IPv4: Failed to bind socket: %m"); + goto fail; + } + } else { + /* enable SO_REUSEADDR for the case that the user really wants multiple mDNS responders */ + r = setsockopt(m->mdns_ipv4_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "mDNS-IPv4: Failed to set SO_REUSEADDR: %m"); + goto fail; + } } r = sd_event_add_io(m->event, &m->mdns_ipv4_event_source, m->mdns_ipv4_fd, EPOLLIN, on_mdns_packet, m); @@ -294,55 +314,75 @@ int manager_mdns_ipv6_fd(Manager *m) { m->mdns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (m->mdns_ipv6_fd < 0) - return -errno; + return log_error_errno(errno, "mDNS-IPv6: Failed to create socket: %m"); r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_UNICAST_HOPS: %m"); goto fail; } /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */ r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_MULTICAST_HOPS: %m"); goto fail; } r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_MULTICAST_LOOP: %m"); goto fail; } r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)); if (r < 0) { - r = -errno; - goto fail; - } - - r = setsockopt(m->mdns_ipv6_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); - if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_V6ONLY: %m"); goto fail; } r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_RECVPKTINFO: %m"); goto fail; } r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one)); if (r < 0) { - r = -errno; + r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_RECVHOPLIMIT: %m"); goto fail; } + /* See the section 15.1 of RFC6762 */ + /* first try to bind without SO_REUSEADDR to detect another mDNS responder */ r = bind(m->mdns_ipv6_fd, &sa.sa, sizeof(sa.in6)); if (r < 0) { - r = -errno; - goto fail; + if (errno != EADDRINUSE) { + r = log_error_errno(errno, "mDNS-IPv6: Failed to bind socket: %m"); + goto fail; + } + + log_warning("mDNS-IPv6: There appears to be another mDNS responder running, or previously systemd-resolved crashed with some outstanding transfers."); + + /* try again with SO_REUSEADDR */ + r = setsockopt(m->mdns_ipv6_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "mDNS-IPv6: Failed to set SO_REUSEADDR: %m"); + goto fail; + } + + r = bind(m->mdns_ipv6_fd, &sa.sa, sizeof(sa.in6)); + if (r < 0) { + r = log_error_errno(errno, "mDNS-IPv6: Failed to bind socket: %m"); + goto fail; + } + } else { + /* enable SO_REUSEADDR for the case that the user really wants multiple mDNS responders */ + r = setsockopt(m->mdns_ipv6_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + if (r < 0) { + r = log_error_errno(errno, "mDNS-IPv6: Failed to set SO_REUSEADDR: %m"); + goto fail; + } } r = sd_event_add_io(m->event, &m->mdns_ipv6_event_source, m->mdns_ipv6_fd, EPOLLIN, on_mdns_packet, m); diff --git a/src/resolve/resolved.conf.in b/src/resolve/resolved.conf.in index 60afa151e3..e6b20620e2 100644 --- a/src/resolve/resolved.conf.in +++ b/src/resolve/resolved.conf.in @@ -16,6 +16,7 @@ #FallbackDNS=@DNS_SERVERS@ #Domains= #LLMNR=yes +#MulticastDNS=yes #DNSSEC=@DEFAULT_DNSSEC_MODE@ #Cache=yes #DNSStubListener=udp diff --git a/src/shared/base-filesystem.c b/src/shared/base-filesystem.c index 127cbe44e3..f2d8bcf6e3 100644 --- a/src/shared/base-filesystem.c +++ b/src/shared/base-filesystem.c @@ -117,6 +117,8 @@ int base_filesystem_create(const char *root, uid_t uid, gid_t gid) { if (!table[i].ignore_failure) return -errno; + + continue; } if (uid != UID_INVALID || gid != UID_INVALID) { diff --git a/src/shared/pager.c b/src/shared/pager.c index f00ba9e1e7..c1480a718b 100644 --- a/src/shared/pager.c +++ b/src/shared/pager.c @@ -161,8 +161,8 @@ void pager_close(void) { return; /* Inform pager that we are done */ - stdout = safe_fclose(stdout); - stderr = safe_fclose(stderr); + safe_fclose(stdout); + safe_fclose(stderr); (void) kill(pager_pid, SIGCONT); (void) wait_for_terminate(pager_pid, NULL); diff --git a/src/sulogin-shell/.gitignore b/src/sulogin-shell/.gitignore new file mode 100644 index 0000000000..01a315524b --- /dev/null +++ b/src/sulogin-shell/.gitignore @@ -0,0 +1 @@ +systemd-sulogin-shell diff --git a/src/sulogin-shell/systemd-sulogin-shell.in b/src/sulogin-shell/systemd-sulogin-shell.in new file mode 100755 index 0000000000..d4f32af5f9 --- /dev/null +++ b/src/sulogin-shell/systemd-sulogin-shell.in @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ -x /bin/plymouth ]; then + /bin/plymouth --wait quit +fi + +cat <<EOF +You are in $1 mode. After logging in, type "journalctl -xb" to view +system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to +boot into default mode. +EOF + +@SULOGIN@ +@SYSTEMCTL@ --job-mode=fail --no-block default diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index d78e56d777..cb9ca9ae1e 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -1780,6 +1780,7 @@ static int list_dependencies_one( STRV_FOREACH(c, deps) { if (strv_contains(*units, *c)) { if (!arg_plain) { + printf(" "); r = list_dependencies_print("...", level + 1, (branches << 1) | (c[1] == NULL ? 0 : 1), 1); if (r < 0) return r; diff --git a/src/systemd/sd-event.h b/src/systemd/sd-event.h index cc26b7df55..f8cb895660 100644 --- a/src/systemd/sd-event.h +++ b/src/systemd/sd-event.h @@ -69,7 +69,7 @@ typedef int (*sd_event_handler_t)(sd_event_source *s, void *userdata); typedef int (*sd_event_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata); typedef int (*sd_event_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata); typedef int (*sd_event_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata); -#if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED +#if defined _GNU_SOURCE || _POSIX_C_SOURCE >= 199309L typedef int (*sd_event_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata); #else typedef void* sd_event_child_handler_t; diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index 9fde9b1884..9828078443 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -389,6 +389,9 @@ static int handle_provides(SysvStub *s, unsigned line, const char *full_text, co r = strv_extend(&s->before, SPECIAL_NETWORK_TARGET); if (r < 0) return log_oom(); + r = strv_extend(&s->wants, SPECIAL_NETWORK_TARGET); + if (r < 0) + return log_oom(); } break; diff --git a/src/test/test-sizeof.c b/src/test/test-sizeof.c index 8f99a13772..36389b7710 100644 --- a/src/test/test-sizeof.c +++ b/src/test/test-sizeof.c @@ -17,7 +17,8 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ -#include "log.h" +#include <stdio.h> + #include "time-util.h" /* Print information about various types. Useful when diagnosing @@ -26,10 +27,10 @@ #pragma GCC diagnostic ignored "-Wtype-limits" #define info(t) \ - log_info("%s → %zu bits%s", STRINGIFY(t), \ - sizeof(t)*CHAR_BIT, \ - strstr(STRINGIFY(t), "signed") ? "" : \ - ((t)-1 < (t)0 ? ", signed" : ", unsigned")); + printf("%s → %zu bits%s\n", STRINGIFY(t), \ + sizeof(t)*CHAR_BIT, \ + strstr(STRINGIFY(t), "signed") ? "" : \ + ((t)-1 < (t)0 ? ", signed" : ", unsigned")); int main(void) { info(char); @@ -39,6 +40,8 @@ int main(void) { info(unsigned); info(long unsigned); info(long long unsigned); + info(__syscall_ulong_t); + info(__syscall_slong_t); info(float); info(double); @@ -48,6 +51,7 @@ int main(void) { info(ssize_t); info(time_t); info(usec_t); + info(__time_t); return 0; } |