#include "string-table.h"
#include "string-util.h"
#include "strv.h"
+#include "sysctl-util.h"
#include "user-util.h"
#include "utf8.h"
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;
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);
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);
test_send_nodata_nofd();
test_send_emptydata();
test_flush_accept();
+ test_ipv6_enabled();
return 0;
}