|
1 /* vim: et ts=2 sw=2 tw=80 |
|
2 */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #include "nsNetAddr.h" |
|
8 #include "nsString.h" |
|
9 #include "mozilla/net/DNS.h" |
|
10 |
|
11 using namespace mozilla::net; |
|
12 |
|
13 NS_IMPL_ISUPPORTS(nsNetAddr, nsINetAddr) |
|
14 |
|
15 /* Makes a copy of |addr| */ |
|
16 nsNetAddr::nsNetAddr(NetAddr* addr) |
|
17 { |
|
18 NS_ASSERTION(addr, "null addr"); |
|
19 mAddr = *addr; |
|
20 } |
|
21 |
|
22 /* readonly attribute unsigned short family; */ |
|
23 NS_IMETHODIMP nsNetAddr::GetFamily(uint16_t *aFamily) |
|
24 { |
|
25 switch(mAddr.raw.family) { |
|
26 case AF_INET: |
|
27 *aFamily = nsINetAddr::FAMILY_INET; |
|
28 break; |
|
29 case AF_INET6: |
|
30 *aFamily = nsINetAddr::FAMILY_INET6; |
|
31 break; |
|
32 #if defined(XP_UNIX) |
|
33 case AF_LOCAL: |
|
34 *aFamily = nsINetAddr::FAMILY_LOCAL; |
|
35 break; |
|
36 #endif |
|
37 default: |
|
38 return NS_ERROR_UNEXPECTED; |
|
39 } |
|
40 |
|
41 return NS_OK; |
|
42 } |
|
43 |
|
44 /* readonly attribute AUTF8String address; */ |
|
45 NS_IMETHODIMP nsNetAddr::GetAddress(nsACString & aAddress) |
|
46 { |
|
47 switch(mAddr.raw.family) { |
|
48 /* PR_NetAddrToString can handle INET and INET6, but not LOCAL. */ |
|
49 case AF_INET: |
|
50 aAddress.SetCapacity(kIPv4CStrBufSize); |
|
51 NetAddrToString(&mAddr, aAddress.BeginWriting(), kIPv4CStrBufSize); |
|
52 aAddress.SetLength(strlen(aAddress.BeginReading())); |
|
53 break; |
|
54 case AF_INET6: |
|
55 aAddress.SetCapacity(kIPv6CStrBufSize); |
|
56 NetAddrToString(&mAddr, aAddress.BeginWriting(), kIPv6CStrBufSize); |
|
57 aAddress.SetLength(strlen(aAddress.BeginReading())); |
|
58 break; |
|
59 #if defined(XP_UNIX) |
|
60 case AF_LOCAL: |
|
61 aAddress.Assign(mAddr.local.path); |
|
62 break; |
|
63 #endif |
|
64 // PR_AF_LOCAL falls through to default when not XP_UNIX |
|
65 default: |
|
66 return NS_ERROR_UNEXPECTED; |
|
67 } |
|
68 |
|
69 return NS_OK; |
|
70 } |
|
71 |
|
72 /* readonly attribute unsigned short port; */ |
|
73 NS_IMETHODIMP nsNetAddr::GetPort(uint16_t *aPort) |
|
74 { |
|
75 switch(mAddr.raw.family) { |
|
76 case AF_INET: |
|
77 *aPort = ntohs(mAddr.inet.port); |
|
78 break; |
|
79 case AF_INET6: |
|
80 *aPort = ntohs(mAddr.inet6.port); |
|
81 break; |
|
82 #if defined(XP_UNIX) |
|
83 case AF_LOCAL: |
|
84 // There is no port number for local / connections. |
|
85 return NS_ERROR_NOT_AVAILABLE; |
|
86 #endif |
|
87 default: |
|
88 return NS_ERROR_UNEXPECTED; |
|
89 } |
|
90 |
|
91 return NS_OK; |
|
92 } |
|
93 |
|
94 /* readonly attribute unsigned long flow; */ |
|
95 NS_IMETHODIMP nsNetAddr::GetFlow(uint32_t *aFlow) |
|
96 { |
|
97 switch(mAddr.raw.family) { |
|
98 case AF_INET6: |
|
99 *aFlow = ntohl(mAddr.inet6.flowinfo); |
|
100 break; |
|
101 case AF_INET: |
|
102 #if defined(XP_UNIX) |
|
103 case AF_LOCAL: |
|
104 #endif |
|
105 // only for IPv6 |
|
106 return NS_ERROR_NOT_AVAILABLE; |
|
107 default: |
|
108 return NS_ERROR_UNEXPECTED; |
|
109 } |
|
110 |
|
111 return NS_OK; |
|
112 } |
|
113 |
|
114 /* readonly attribute unsigned long scope; */ |
|
115 NS_IMETHODIMP nsNetAddr::GetScope(uint32_t *aScope) |
|
116 { |
|
117 switch(mAddr.raw.family) { |
|
118 case AF_INET6: |
|
119 *aScope = ntohl(mAddr.inet6.scope_id); |
|
120 break; |
|
121 case AF_INET: |
|
122 #if defined(XP_UNIX) |
|
123 case AF_LOCAL: |
|
124 #endif |
|
125 // only for IPv6 |
|
126 return NS_ERROR_NOT_AVAILABLE; |
|
127 default: |
|
128 return NS_ERROR_UNEXPECTED; |
|
129 } |
|
130 |
|
131 return NS_OK; |
|
132 } |
|
133 |
|
134 /* readonly attribute boolean isV4Mapped; */ |
|
135 NS_IMETHODIMP nsNetAddr::GetIsV4Mapped(bool *aIsV4Mapped) |
|
136 { |
|
137 switch(mAddr.raw.family) { |
|
138 case AF_INET6: |
|
139 *aIsV4Mapped = IPv6ADDR_IS_V4MAPPED(&mAddr.inet6.ip); |
|
140 break; |
|
141 case AF_INET: |
|
142 #if defined(XP_UNIX) |
|
143 case AF_LOCAL: |
|
144 #endif |
|
145 // only for IPv6 |
|
146 return NS_ERROR_NOT_AVAILABLE; |
|
147 default: |
|
148 return NS_ERROR_UNEXPECTED; |
|
149 } |
|
150 |
|
151 return NS_OK; |
|
152 } |
|
153 |
|
154 NS_IMETHODIMP nsNetAddr::GetNetAddr(NetAddr *aResult) { |
|
155 memcpy(aResult, &mAddr, sizeof(mAddr)); |
|
156 return NS_OK; |
|
157 } |
|
158 |