From 83e03c4fc23dae0cbb3fd4e7c2f9ef533fc26160 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 5 Mar 2021 20:37:24 +0100 Subject: [PATCH] socket-util: add helper for checking if IPv6 is enabled --- src/basic/socket-util.c | 26 ++++++++++++++++++++++++++ src/basic/socket-util.h | 1 + src/test/test-socket-util.c | 6 ++++++ 3 files changed, 33 insertions(+) diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 315a99c3fa..4899c17589 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -31,6 +31,7 @@ #include "string-table.h" #include "string-util.h" #include "strv.h" +#include "sysctl-util.h" #include "user-util.h" #include "utf8.h" @@ -296,6 +297,31 @@ bool socket_ipv6_is_supported(void) { return cached; } +bool socket_ipv6_is_enabled(void) { + _cleanup_free_ char *v; + int r; + + /* Much like socket_ipv6_is_supported(), but also checks that the sysctl that disables IPv6 on all + * interfaces isn't turned on */ + + if (!socket_ipv6_is_supported()) + return false; + + r = sysctl_read_ip_property(AF_INET6, "all", "disable_ipv6", &v); + if (r < 0) { + log_debug_errno(r, "Unexpected error reading 'net.ipv6.conf.all.disable_ipv6' sysctl: %m"); + return true; + } + + r = parse_boolean(v); + if (r < 0) { + log_debug_errno(r, "Failed to pare 'net.ipv6.conf.all.disable_ipv6' sysctl: %m"); + return true; + } + + return !r; +} + bool socket_address_matches_fd(const SocketAddress *a, int fd) { SocketAddress b; socklen_t solen; diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 2c98283cd3..507a599d7c 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -101,6 +101,7 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_ const char* socket_address_get_path(const SocketAddress *a); bool socket_ipv6_is_supported(void); +bool socket_ipv6_is_enabled(void); int sockaddr_port(const struct sockaddr *_sa, unsigned *port); const union in_addr_union *sockaddr_in_addr(const struct sockaddr *sa); diff --git a/src/test/test-socket-util.c b/src/test/test-socket-util.c index 4ff7d714f8..584253c2fc 100644 --- a/src/test/test-socket-util.c +++ b/src/test/test-socket-util.c @@ -504,6 +504,11 @@ static void test_flush_accept(void) { assert_se(flush_accept(listen_seqpacket) >= 0); } +static void test_ipv6_enabled(void) { + log_info("IPv6 supported: %s", yes_no(socket_ipv6_is_supported())); + log_info("IPv6 enabled: %s", yes_no(socket_ipv6_is_enabled())); +} + int main(int argc, char *argv[]) { test_setup_logging(LOG_DEBUG); @@ -519,6 +524,7 @@ int main(int argc, char *argv[]) { test_send_nodata_nofd(); test_send_emptydata(); test_flush_accept(); + test_ipv6_enabled(); return 0; }