Coverage Report

Created: 2018-09-25 14:53

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