Local socket connections do not work on hurd-i386
[free-sw/xcb/libxcb] / src / xcb_auth.c
index 4842d1d..93a6f68 100644 (file)
@@ -68,7 +68,7 @@ static size_t memdup(char **dst, void *src, size_t len)
     return len;
 }
 
-static int authname_match(enum auth_protos kind, char *name, int namelen)
+static int authname_match(enum auth_protos kind, char *name, size_t namelen)
 {
     if(strlen(authnames[kind]) != namelen)
        return 0;
@@ -93,6 +93,7 @@ static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen,
     family = FamilyLocal; /* 256 */
     switch(sockname->sa_family)
     {
+#ifdef AF_INET6
     case AF_INET6:
         addr = (char *) SIN6_ADDR(sockname);
         addrlen = sizeof(*SIN6_ADDR(sockname));
@@ -104,6 +105,7 @@ static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen,
         }
         addr += 12;
         /* if v4-mapped, fall through. */
+#endif
     case AF_INET:
         if(!addr)
             addr = (char *) &((struct sockaddr_in *)sockname)->sin_addr;
@@ -179,12 +181,13 @@ static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr *
            APPEND(info->data, j, si->sin_port);
        }
        break;
+#ifdef AF_INET6
         case AF_INET6:
             /*block*/ {
             struct sockaddr_in6 *si6 = (struct sockaddr_in6 *) sockname;
             if(IN6_IS_ADDR_V4MAPPED(SIN6_ADDR(sockname)))
             {
-                APPEND(info->data, j, si6->sin6_addr.s6_addr[12]);
+                do_append(info->data, &j, &si6->sin6_addr.s6_addr[12], 4);
                 APPEND(info->data, j, si6->sin6_port);
             }
             else
@@ -192,17 +195,18 @@ static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr *
                 /* XDM-AUTHORIZATION-1 does not handle IPv6 correctly.  Do the
                    same thing Xlib does: use all zeroes for the 4-byte address
                    and 2-byte port number. */
-                long fakeaddr = 0;
-                short fakeport = 0;
+                uint32_t fakeaddr = 0;
+                uint16_t fakeport = 0;
                 APPEND(info->data, j, fakeaddr);
                 APPEND(info->data, j, fakeport);
             }
         }
         break;
+#endif
         case AF_UNIX:
             /*block*/ {
-           long fakeaddr = htonl(0xffffffff - next_nonce());
-           short fakeport = htons(getpid());
+           uint32_t fakeaddr = htonl(0xffffffff - next_nonce());
+           uint16_t fakeport = htons(getpid());
            APPEND(info->data, j, fakeaddr);
            APPEND(info->data, j, fakeport);
        }
@@ -212,9 +216,7 @@ static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr *
             return 0;   /* do not know how to build this */
        }
        {
-           long now;
-           time(&now);
-           now = htonl(now);
+           uint32_t now = htonl(time(0));
            APPEND(info->data, j, now);
        }
        assert(j <= 192 / 8);
@@ -241,7 +243,14 @@ int _xcb_get_auth_info(int fd, xcb_auth_info_t *info, int display)
     int ret = 1;
 
     if (getpeername(fd, sockname, &socknamelen) == -1)
-        return 0;  /* can only authenticate sockets */
+    {
+        if (getsockname(fd, sockname, &socknamelen) == -1)
+            return 0;  /* can only authenticate sockets */
+        if (sockname->sa_family != AF_UNIX)
+            return 0;
+        /* Some systems like hpux or Hurd do not expose peer names
+         * for UNIX Domain Sockets.  We do not need it anyway.  */
+    }
 
     authptr = get_authptr(sockname, socknamelen, display);
     if (authptr == 0)