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