$NetBSD: patch-ap,v 1.3 2009/04/07 11:40:20 drochner Exp $ --- ./daemon/gdm-xdmcp-manager.c.orig 2009-03-19 05:59:27.000000000 +0100 +++ ./daemon/gdm-xdmcp-manager.c @@ -64,7 +64,7 @@ * On Sun, we need to define allow_severity and deny_severity to link * against libwrap. */ -#ifdef __sun +#if defined(__sun) || defined(__NetBSD__) #include int allow_severity = LOG_INFO; int deny_severity = LOG_WARNING; @@ -370,12 +370,14 @@ ai_flags_str (struct addrinfo *ai) if (ai->ai_flags & AI_NUMERICSERV) { g_string_append (str, "numserv "); } +#if 0 if (ai->ai_flags & AI_V4MAPPED) { g_string_append (str, "v4mapped "); } if (ai->ai_flags & AI_ALL) { g_string_append (str, "all "); } +#endif } return g_string_free (str, FALSE); } @@ -405,6 +407,14 @@ create_socket (struct addrinfo *ai) return sock; } +#if defined(__NetBSD__) && ENABLE_IPV6 + /* NetBSD defaults to V6ONLY */ + { + int no = 0; + setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &no, sizeof(no)); + } +#endif + if (bind (sock, ai->ai_addr, ai->ai_addrlen) < 0) { gdm_error ("bind: %s", g_strerror (errno)); close (sock); @@ -1259,7 +1269,9 @@ create_sa_from_request (ARRAY8 *req_addr memset (&hints, 0, sizeof (hints)); hints.ai_family = family; +#if !defined(__NetBSD__) || defined(AI_V4MAPPED) hints.ai_flags = AI_V4MAPPED; /* this should convert IPv4 address to IPv6 if needed */ +#endif if ((gaierr = getaddrinfo (host, serv, &hints, &ai_list)) != 0) { gdm_debug ("Unable get address: %s", gai_strerror (gaierr)); return FALSE; @@ -1278,6 +1290,20 @@ create_sa_from_request (ARRAY8 *req_addr freeaddrinfo (ai_list); +#if defined(__NetBSD__) && !defined(AI_V4MAPPED) + if (!found && family == AF_INET6 && req_addr->length == 4 && sap) { + struct sockaddr_in6 *sa = g_malloc(sizeof(struct sockaddr_in6)); + memset(sa, 0, sizeof(struct sockaddr_in6)); + sa->sin6_len = sizeof(struct sockaddr_in6); + sa->sin6_family = AF_INET6; + sa->sin6_port = port; + memset(&sa->sin6_addr.s6_addr[10], 0xff, 2); + memcpy(&sa->sin6_addr.s6_addr[12], req_addr->data, 4); + *sap = sa; + found = TRUE; + } +#endif + return found; }