1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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));
|