netwerk/base/src/nsNetAddr.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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/. */
     7 #include "nsNetAddr.h"
     8 #include "nsString.h"
     9 #include "mozilla/net/DNS.h"
    11 using namespace mozilla::net;
    13 NS_IMPL_ISUPPORTS(nsNetAddr, nsINetAddr)
    15 /* Makes a copy of |addr| */
    16 nsNetAddr::nsNetAddr(NetAddr* addr)
    17 {
    18   NS_ASSERTION(addr, "null addr");
    19   mAddr = *addr;
    20 }
    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   }
    41   return NS_OK;
    42 }
    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   }
    69   return NS_OK;
    70 }
    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   }
    91   return NS_OK;
    92 }
    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   }
   111   return NS_OK;
   112 }
   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   }
   131   return NS_OK;
   132 }
   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   }
   151   return NS_OK;
   152 }
   154 NS_IMETHODIMP nsNetAddr::GetNetAddr(NetAddr *aResult) {
   155   memcpy(aResult, &mAddr, sizeof(mAddr));
   156   return NS_OK;
   157 }

mercurial