void sk_getaddr(SockAddr addr, char *buf, int buflen)
{
-
+ /* XXX not clear what we should return for Unix-domain sockets; let's
+ * hope the question never arises */
+ assert(addr->superfamily != UNIX);
if (addr->superfamily == UNRESOLVED) {
strncpy(buf, addr->hostname, buflen);
buf[buflen-1] = '\0';
int sk_hostname_is_local(char *name)
{
- return !strcmp(name, "localhost");
+ return !strcmp(name, "localhost") ||
+ !strcmp(name, "::1") ||
+ !strncmp(name, "127.", 4);
}
#define ipv4_is_loopback(addr) \
int sk_address_is_local(SockAddr addr)
{
-
if (addr->superfamily == UNRESOLVED)
return 0; /* we don't know; assume not */
+ else if (addr->superfamily == UNIX)
+ return 1;
else {
#ifndef NO_IPV6
return sockaddr_is_loopback(addr->ais->ai_addr);
return 0;
}
+char *get_hostname(void)
+{
+ int len = 128;
+ char *hostname = NULL;
+ do {
+ len *= 2;
+ hostname = sresize(hostname, len, char);
+ if ((gethostname(hostname, len) < 0) &&
+ (errno != ENAMETOOLONG)) {
+ sfree(hostname);
+ hostname = NULL;
+ break;
+ }
+ } while (strlen(hostname) >= len-1);
+ return hostname;
+}
+
SockAddr platform_get_x11_unix_address(const char *sockpath, int displaynum)
{
SockAddr ret = snew(struct SockAddr_tag);