summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrey Borzenkov <arvidjaar@gmail.com>2010-10-27 21:40:31 +0400
committerLennart Poettering <lennart@poettering.net>2010-10-28 00:37:57 +0200
commitf89f1e8f836c8e646e0f95ab808ce20cab6ac114 (patch)
tree7815094d49bb83ce44911a891802e6603569c172 /src
parent6c5d4a999c81fdda964de216d446da673cdbd0e2 (diff)
socket: fix IPv6 availability detection
If IPv6 is loaded with disable=1, any IPv6 functionality is completely disabled until the ipv6 module is reloaded. Do not assume IPv6 is available just because the module is present. Fixes startup error: Oct 27 20:58:02 cooker kernel: IPv6: Loaded, but administratively disabled, reboot required to enable Oct 27 20:58:02 cooker kernel: systemd[1]: Set hostname to <cooker>. Oct 27 20:58:02 cooker kernel: systemd[1]: Netlink failure for request 2: Operation not supported Oct 27 20:58:02 cooker kernel: systemd[1]: Failed to configure loopback device: Operation not supported
Diffstat (limited to 'src')
-rw-r--r--src/socket-util.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/socket-util.c b/src/socket-util.c
index a2fa13e594..9b4a1b3b48 100644
--- a/src/socket-util.c
+++ b/src/socket-util.c
@@ -506,7 +506,21 @@ bool socket_address_needs_mount(const SocketAddress *a, const char *prefix) {
}
bool socket_ipv6_is_supported(void) {
- return access("/sys/module/ipv6", F_OK) == 0;
+ char *l = 0;
+ bool enabled;
+
+ if (access("/sys/module/ipv6", F_OK) != 0)
+ return 0;
+
+ /* If we can't check "disable" parameter, assume enabled */
+ if (read_one_line_file("/sys/module/ipv6/parameters/disable", &l) < 0)
+ return 1;
+
+ /* If module was loaded with disable=1 no IPv6 available */
+ enabled = l[0] == '0';
+ free(l);
+
+ return enabled;
}
static const char* const socket_address_bind_ipv6_only_table[_SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX] = {