Blame SOURCES/0540-socket-util-socket_address_parse-should-not-log-erro.patch

17b0f1
From b2dfc6d1b697da2e649b04ad0b8c3aef7a7d4d88 Mon Sep 17 00:00:00 2001
17b0f1
From: Lennart Poettering <lennart@poettering.net>
17b0f1
Date: Fri, 15 May 2015 20:15:59 +0200
17b0f1
Subject: [PATCH] socket-util: socket_address_parse() should not log errors on
17b0f1
 its own
17b0f1
17b0f1
Given that socket_address_parse() is mostly a "library" call it
17b0f1
shouldn't log on its own, but leave that to its caller.
17b0f1
17b0f1
This patch removes logging from the call in case IPv6 is not available
17b0f1
but and IPv6 address shall be parsed. Instead a new call
17b0f1
socket_address_parse_and_warn() is introduced which first invokes
17b0f1
socket_address_parse() and then logs if necessary.
17b0f1
17b0f1
This should fix "make check" on ipv6-less kernels:
17b0f1
17b0f1
http://lists.freedesktop.org/archives/systemd-devel/2015-April/031385.html
17b0f1
(cherry picked from commit 7693146dee53a2b0f524e977188347166bf454ca)
17b0f1
17b0f1
Related: #1497639
17b0f1
---
17b0f1
 src/core/load-fragment.c |  2 +-
17b0f1
 src/shared/socket-util.c | 29 +++++++++++++++++++----------
17b0f1
 src/shared/socket-util.h |  1 +
17b0f1
 3 files changed, 21 insertions(+), 11 deletions(-)
17b0f1
17b0f1
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
17b0f1
index 58e44b89b2..0c0fa0f506 100644
17b0f1
--- a/src/core/load-fragment.c
17b0f1
+++ b/src/core/load-fragment.c
17b0f1
@@ -365,7 +365,7 @@ int config_parse_socket_listen(const char *unit,
17b0f1
                         log_syntax(unit, LOG_ERR, filename, line, -r,
17b0f1
                                    "Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r));
17b0f1
 
17b0f1
-                r = socket_address_parse(&p->address, k ? k : rvalue);
17b0f1
+                r = socket_address_parse_and_warn(&p->address, k ? k : rvalue);
17b0f1
                 if (r < 0) {
17b0f1
                         if (r != -EAFNOSUPPORT)
17b0f1
                                 log_syntax(unit, LOG_ERR, filename, line, -r,
17b0f1
diff --git a/src/shared/socket-util.c b/src/shared/socket-util.c
17b0f1
index baab6353e1..b14e368176 100644
17b0f1
--- a/src/shared/socket-util.c
17b0f1
+++ b/src/shared/socket-util.c
17b0f1
@@ -55,11 +55,6 @@ int socket_address_parse(SocketAddress *a, const char *s) {
17b0f1
         if (*s == '[') {
17b0f1
                 /* IPv6 in [x:.....:z]:p notation */
17b0f1
 
17b0f1
-                if (!socket_ipv6_is_supported()) {
17b0f1
-                        log_warning("Binding to IPv6 address not available since kernel does not support IPv6.");
17b0f1
-                        return -EAFNOSUPPORT;
17b0f1
-                }
17b0f1
-
17b0f1
                 e = strchr(s+1, ']');
17b0f1
                 if (!e)
17b0f1
                         return -EINVAL;
17b0f1
@@ -144,11 +139,6 @@ int socket_address_parse(SocketAddress *a, const char *s) {
17b0f1
                                 if (idx == 0)
17b0f1
                                         return -EINVAL;
17b0f1
 
17b0f1
-                                if (!socket_ipv6_is_supported()) {
17b0f1
-                                        log_warning("Binding to interface is not available since kernel does not support IPv6.");
17b0f1
-                                        return -EAFNOSUPPORT;
17b0f1
-                                }
17b0f1
-
17b0f1
                                 a->sockaddr.in6.sin6_family = AF_INET6;
17b0f1
                                 a->sockaddr.in6.sin6_port = htons((uint16_t) u);
17b0f1
                                 a->sockaddr.in6.sin6_scope_id = idx;
17b0f1
@@ -182,6 +172,25 @@ int socket_address_parse(SocketAddress *a, const char *s) {
17b0f1
         return 0;
17b0f1
 }
17b0f1
 
17b0f1
+int socket_address_parse_and_warn(SocketAddress *a, const char *s) {
17b0f1
+        SocketAddress b;
17b0f1
+        int r;
17b0f1
+
17b0f1
+        /* Similar to socket_address_parse() but warns for IPv6 sockets when we don't support them. */
17b0f1
+
17b0f1
+        r = socket_address_parse(&b, s);
17b0f1
+        if (r < 0)
17b0f1
+                return r;
17b0f1
+
17b0f1
+        if (!socket_ipv6_is_supported() && b.sockaddr.sa.sa_family == AF_INET6) {
17b0f1
+                log_warning("Binding to IPv6 address not available since kernel does not support IPv6.");
17b0f1
+                return -EAFNOSUPPORT;
17b0f1
+        }
17b0f1
+
17b0f1
+        *a = b;
17b0f1
+        return 0;
17b0f1
+}
17b0f1
+
17b0f1
 int socket_address_parse_netlink(SocketAddress *a, const char *s) {
17b0f1
         int family;
17b0f1
         unsigned group = 0;
17b0f1
diff --git a/src/shared/socket-util.h b/src/shared/socket-util.h
17b0f1
index 6bfb677fb5..9200ce8822 100644
17b0f1
--- a/src/shared/socket-util.h
17b0f1
+++ b/src/shared/socket-util.h
17b0f1
@@ -67,6 +67,7 @@ typedef enum SocketAddressBindIPv6Only {
17b0f1
 #define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
17b0f1
 
17b0f1
 int socket_address_parse(SocketAddress *a, const char *s);
17b0f1
+int socket_address_parse_and_warn(SocketAddress *a, const char *s);
17b0f1
 int socket_address_parse_netlink(SocketAddress *a, const char *s);
17b0f1
 int socket_address_print(const SocketAddress *a, char **p);
17b0f1
 int socket_address_verify(const SocketAddress *a) _pure_;