Line data Source code
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 0 : NS_IMPL_ISUPPORTS(nsNetAddr, nsINetAddr)
14 :
15 : /* Makes a copy of |addr| */
16 0 : nsNetAddr::nsNetAddr(NetAddr* addr)
17 : {
18 0 : NS_ASSERTION(addr, "null addr");
19 0 : mAddr = *addr;
20 0 : }
21 :
22 0 : NS_IMETHODIMP nsNetAddr::GetFamily(uint16_t *aFamily)
23 : {
24 0 : switch(mAddr.raw.family) {
25 : case AF_INET:
26 0 : *aFamily = nsINetAddr::FAMILY_INET;
27 0 : break;
28 : case AF_INET6:
29 0 : *aFamily = nsINetAddr::FAMILY_INET6;
30 0 : break;
31 : #if defined(XP_UNIX)
32 : case AF_LOCAL:
33 0 : *aFamily = nsINetAddr::FAMILY_LOCAL;
34 0 : break;
35 : #endif
36 : default:
37 0 : return NS_ERROR_UNEXPECTED;
38 : }
39 :
40 0 : return NS_OK;
41 : }
42 :
43 0 : NS_IMETHODIMP nsNetAddr::GetAddress(nsACString & aAddress)
44 : {
45 0 : switch(mAddr.raw.family) {
46 : /* PR_NetAddrToString can handle INET and INET6, but not LOCAL. */
47 : case AF_INET:
48 0 : aAddress.SetCapacity(kIPv4CStrBufSize);
49 0 : NetAddrToString(&mAddr, aAddress.BeginWriting(), kIPv4CStrBufSize);
50 0 : aAddress.SetLength(strlen(aAddress.BeginReading()));
51 0 : break;
52 : case AF_INET6:
53 0 : aAddress.SetCapacity(kIPv6CStrBufSize);
54 0 : NetAddrToString(&mAddr, aAddress.BeginWriting(), kIPv6CStrBufSize);
55 0 : aAddress.SetLength(strlen(aAddress.BeginReading()));
56 0 : break;
57 : #if defined(XP_UNIX)
58 : case AF_LOCAL:
59 0 : aAddress.Assign(mAddr.local.path);
60 0 : break;
61 : #endif
62 : // PR_AF_LOCAL falls through to default when not XP_UNIX
63 : default:
64 0 : return NS_ERROR_UNEXPECTED;
65 : }
66 :
67 0 : return NS_OK;
68 : }
69 :
70 0 : NS_IMETHODIMP nsNetAddr::GetPort(uint16_t *aPort)
71 : {
72 0 : switch(mAddr.raw.family) {
73 : case AF_INET:
74 0 : *aPort = ntohs(mAddr.inet.port);
75 0 : break;
76 : case AF_INET6:
77 0 : *aPort = ntohs(mAddr.inet6.port);
78 0 : break;
79 : #if defined(XP_UNIX)
80 : case AF_LOCAL:
81 : // There is no port number for local / connections.
82 0 : return NS_ERROR_NOT_AVAILABLE;
83 : #endif
84 : default:
85 0 : return NS_ERROR_UNEXPECTED;
86 : }
87 :
88 0 : return NS_OK;
89 : }
90 :
91 0 : NS_IMETHODIMP nsNetAddr::GetFlow(uint32_t *aFlow)
92 : {
93 0 : switch(mAddr.raw.family) {
94 : case AF_INET6:
95 0 : *aFlow = ntohl(mAddr.inet6.flowinfo);
96 0 : break;
97 : case AF_INET:
98 : #if defined(XP_UNIX)
99 : case AF_LOCAL:
100 : #endif
101 : // only for IPv6
102 0 : return NS_ERROR_NOT_AVAILABLE;
103 : default:
104 0 : return NS_ERROR_UNEXPECTED;
105 : }
106 :
107 0 : return NS_OK;
108 : }
109 :
110 0 : NS_IMETHODIMP nsNetAddr::GetScope(uint32_t *aScope)
111 : {
112 0 : switch(mAddr.raw.family) {
113 : case AF_INET6:
114 0 : *aScope = ntohl(mAddr.inet6.scope_id);
115 0 : break;
116 : case AF_INET:
117 : #if defined(XP_UNIX)
118 : case AF_LOCAL:
119 : #endif
120 : // only for IPv6
121 0 : return NS_ERROR_NOT_AVAILABLE;
122 : default:
123 0 : return NS_ERROR_UNEXPECTED;
124 : }
125 :
126 0 : return NS_OK;
127 : }
128 :
129 0 : NS_IMETHODIMP nsNetAddr::GetIsV4Mapped(bool *aIsV4Mapped)
130 : {
131 0 : switch(mAddr.raw.family) {
132 : case AF_INET6:
133 0 : *aIsV4Mapped = IPv6ADDR_IS_V4MAPPED(&mAddr.inet6.ip);
134 0 : break;
135 : case AF_INET:
136 : #if defined(XP_UNIX)
137 : case AF_LOCAL:
138 : #endif
139 : // only for IPv6
140 0 : return NS_ERROR_NOT_AVAILABLE;
141 : default:
142 0 : return NS_ERROR_UNEXPECTED;
143 : }
144 :
145 0 : return NS_OK;
146 : }
147 :
148 0 : NS_IMETHODIMP nsNetAddr::GetNetAddr(NetAddr *aResult) {
149 0 : memcpy(aResult, &mAddr, sizeof(mAddr));
150 0 : return NS_OK;
151 : }
152 :
|