_cleanup_free_ char *l = NULL;
if (access("/sys/module/ipv6", F_OK) != 0)
- return 0;
+ return false;
/* If we can't check "disable" parameter, assume enabled */
if (read_one_line_file("/sys/module/ipv6/parameters/disable", &l) < 0)
- return 1;
+ return true;
/* If module was loaded with disable=1 no IPv6 available */
return l[0] == '0';
r = getnameinfo(&sa->sa, salen, host, sizeof(host), NULL, 0,
NI_IDN|NI_IDN_USE_STD3_ASCII_RULES);
if (r != 0) {
- _cleanup_free_ char *sockname = NULL;
int saved_errno = errno;
- r = sockaddr_pretty(&sa->sa, salen, true, &sockname);
+ r = sockaddr_pretty(&sa->sa, salen, true, &ret);
if (r < 0)
- log_error("sockadd_pretty() failed: %s", strerror(-r));
- else
- log_error("getnameinfo(%s) failed: %s", sockname, strerror(-r));
- return -saved_errno;
- }
+ return log_error_errno(r, "sockadd_pretty() failed: %m");
- ret = strdup(host);
- if (!ret)
- return log_oom();
+ log_debug_errno(saved_errno, "getnameinfo(%s) failed: %m", ret);
+ } else {
+ ret = strdup(host);
+ if (!ret)
+ return log_oom();
+ }
*_ret = ret;
return 0;
assert(fd >= 0);
assert(ret);
- if (getsockname(fd, &sa.sa, &salen) < 0) {
- log_error("getsockname(%d) failed: %m", fd);
- return -errno;
- }
+ if (getsockname(fd, &sa.sa, &salen) < 0)
+ return log_error_errno(errno, "getsockname(%d) failed: %m", fd);
return socknameinfo_pretty(&sa, salen, ret);
}
};
DEFINE_STRING_TABLE_LOOKUP(socket_address_bind_ipv6_only, SocketAddressBindIPv6Only);
+
+bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b) {
+ assert(a);
+ assert(b);
+
+ if (a->sa.sa_family != b->sa.sa_family)
+ return false;
+
+ if (a->sa.sa_family == AF_INET)
+ return a->in.sin_addr.s_addr == b->in.sin_addr.s_addr;
+
+ if (a->sa.sa_family == AF_INET6)
+ return memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof(a->in6.sin6_addr)) == 0;
+
+ return false;
+}
+
+char* ether_addr_to_string(const struct ether_addr *addr, char buffer[ETHER_ADDR_TO_STRING_MAX]) {
+ assert(addr);
+ assert(buffer);
+
+ /* Like ether_ntoa() but uses %02x instead of %x to print
+ * ethernet addresses, which makes them look less funny. Also,
+ * doesn't use a static buffer. */
+
+ sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x",
+ addr->ether_addr_octet[0],
+ addr->ether_addr_octet[1],
+ addr->ether_addr_octet[2],
+ addr->ether_addr_octet[3],
+ addr->ether_addr_octet[4],
+ addr->ether_addr_octet[5]);
+
+ return buffer;
+}