netwerk/base/src/nsNetAddr.cpp

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:589f3ac7cb04
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

mercurial