diff options
Diffstat (limited to 'games/quake6/patches/patch-af')
-rw-r--r-- | games/quake6/patches/patch-af | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/games/quake6/patches/patch-af b/games/quake6/patches/patch-af new file mode 100644 index 00000000000..d0febfa50a4 --- /dev/null +++ b/games/quake6/patches/patch-af @@ -0,0 +1,128 @@ +$NetBSD: patch-af,v 1.1 2002/01/10 16:43:28 skrll Exp $ + +--- qw_common/net_udp.c.orig Thu Jan 13 04:01:30 2000 ++++ qw_common/net_udp.c +@@ -73,11 +73,9 @@ + #else + typedef struct sockaddr_in6 sockaddress_t; + #ifdef __sun__ +-#define s6_addr32 _S6_un._S6_u32 ++#define ss_family __ss_family ++#define ss_len __ss_len + #endif __sun__ +-#ifdef __FreeBSD__ +-#define s6_addr32 __u6_addr.__u6_addr32 +-#endif __FreeBSD__ + + #endif AF_INET6 + +@@ -108,11 +106,8 @@ + memset (s, 0, sizeof(*s)); + // s->sin6_family = a->family; + +- s->sin6_family = AF_UNSPEC; +- s->sin6_addr.s6_addr32[0] = a->ip[0]; +- s->sin6_addr.s6_addr32[1] = a->ip[1]; +- s->sin6_addr.s6_addr32[2] = a->ip[2]; +- s->sin6_addr.s6_addr32[3] = a->ip[3]; ++ s->sin6_family = AF_INET6; ++ memcpy(&s->sin6_addr, a->ip, sizeof(s->sin6_addr)); + s->sin6_port = a->port; + s->sin6_len = sizeof(struct sockaddr_in6); + #endif +@@ -124,10 +119,7 @@ + *(int *)&a->ip = *(int *)&s->sin_addr; + a->port = s->sin_port; + #else +- a->ip[0] = s->sin6_addr.s6_addr32[0]; +- a->ip[1] = s->sin6_addr.s6_addr32[1]; +- a->ip[2] = s->sin6_addr.s6_addr32[2]; +- a->ip[3] = s->sin6_addr.s6_addr32[3]; ++ memcpy(a->ip, &s->sin6_addr, sizeof(s->sin6_addr)); + a->port = s->sin6_port; + a->family = s->sin6_family; + #endif +@@ -182,11 +174,21 @@ + static char s[BUFSIZ]; + struct sockaddr_storage ss; + +- ss.__ss_len = sizeof(ss); +- ss.__ss_family = AF_UNSPEC; +- memcpy(ss.__ss_pad1, &(a.ip), sizeof(a.ip)); +- if (getnameinfo((struct sockaddr *) &ss,sizeof(ss),s,sizeof(s),NULL,0,NI_NUMERICHOST)) { +- strcpy(s,"<invalid>"); ++ memset(&ss, 0, sizeof(ss)); ++ if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)a.ip)) { ++ ss.ss_len = sizeof(struct sockaddr_in); ++ ss.ss_family = AF_INET; ++ memcpy(&((struct sockaddr_in *)&ss)->sin_addr, ++ &((struct in6_addr *)a.ip)->s6_addr[12], sizeof(struct in_addr)); ++ } else { ++ ss.ss_len = sizeof(struct sockaddr_in6); ++ ss.ss_family = AF_INET6; ++ memcpy(&((struct sockaddr_in6 *)&ss)->sin6_addr, ++ a.ip, sizeof(struct in6_addr)); ++ } ++ if (getnameinfo((struct sockaddr *)&ss, ss.ss_len, s, sizeof(s), ++ NULL, 0, NI_NUMERICHOST)) { ++ strcpy(s, "<invalid>"); + } + return s; + } +@@ -282,10 +284,9 @@ + ss6=(struct sockaddr_in6 *) &ss; + ss4=(struct sockaddr_in *) resultp->ai_addr; + ss6->sin6_family=AF_INET6; +- ss6->sin6_addr.s6_addr32[0]=0; +- ss6->sin6_addr.s6_addr32[1]=0; +- ss6->sin6_addr.s6_addr32[2]=htonl(0xffff); +- ss6->sin6_addr.s6_addr32[3]=ss4->sin_addr.s_addr; ++ memset(&ss6->sin6_addr, 0, sizeof(ss6->sin6_addr)); ++ ss6->sin6_addr.s6_addr[10] = ss6->sin6_addr.s6_addr[11] = 0xff; ++ memcpy(&ss6->sin6_addr.s6_addr[12], &ss4->sin_addr, sizeof(ss4->sin_addr)); + break; + case AF_INET6: + memcpy(&ss,resultp->ai_addr,sizeof(struct sockaddr_in6)); +@@ -305,10 +306,10 @@ + // the IP is NOT one of our interfaces. + qboolean NET_IsClientLegal(netadr_t *adr) + { ++#if 0 + sockaddress_t sadr; + int newsocket; + +-#if 0 + if (adr->ip[0] == 127) + return false; // no local connections period + +@@ -416,6 +417,7 @@ + int Error; + char Buf[BUFSIZ], *Service, *Host; + qboolean _true = true; ++ const int false = 0; + int i; + + memset(&hints, 0, sizeof(hints)); +@@ -438,13 +440,21 @@ + Service = Buf; + } + +- if(Error = getaddrinfo(Host, Service, &hints, &res)) ++ Error = getaddrinfo(Host, Service, &hints, &res); ++ if (Error) + Sys_Error ("UDP_OpenSocket: getaddrinfo: %s", gai_strerror(Error)); + + if ((newsocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1) + Sys_Error ("UDP_OpenSocket: socket:", strerror(errno)); + if (ioctl (newsocket, FIONBIO, (char *)&_true) == -1) + Sys_Error ("UDP_OpenSocket: ioctl FIONBIO:", strerror(errno)); ++ ++#ifdef IPV6_BINDV6ONLY ++ if (setsockopt(newsocket, IPPROTO_IPV6, IPV6_BINDV6ONLY, &false, ++ sizeof(false)) < 0) { ++ /* I don't care */ ++ } ++#endif + + if (bind(newsocket, res->ai_addr, res->ai_addrlen) < 0) + Sys_Error ("UDP_OpenSocket: bind: %s", strerror(errno)); |