X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fsocket-util.c;h=c6f64876be4485f6a9c2b4aab41b04b2a094563d;hp=0a0726d87ddfb4eca9034f2fa30f8c1e69b56b5c;hb=c532d8a00cacacc6775effb7aadca680b1d39ccd;hpb=b31f535c9a7af9b5f5c4f5d4e52be9159af72127 diff --git a/src/shared/socket-util.c b/src/shared/socket-util.c index 0a0726d87..c6f64876b 100644 --- a/src/shared/socket-util.c +++ b/src/shared/socket-util.c @@ -426,11 +426,11 @@ bool socket_ipv6_is_supported(void) { _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'; @@ -633,20 +633,18 @@ int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret) 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; @@ -659,10 +657,8 @@ int getnameinfo_pretty(int fd, char **ret) { 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); } @@ -711,3 +707,38 @@ static const char* const socket_address_bind_ipv6_only_table[_SOCKET_ADDRESS_BIN }; 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; +}