tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

inaddr_st.h (2688B)


      1 /* Copyright (c) 2003-2004, Roger Dingledine
      2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      3 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      4 /* See LICENSE for licensing information */
      5 
      6 /**
      7 * \file inaddr_st.h
      8 *
      9 * \brief Define in6_addr, its members, and related types on platforms that
     10 *    lack it.
     11 **/
     12 
     13 #ifndef TOR_INADDR_ST_H
     14 #define TOR_INADDR_ST_H
     15 
     16 #include "orconfig.h"
     17 #include <stddef.h>
     18 
     19 #ifdef HAVE_ARPA_INET_H
     20 #include <arpa/inet.h>
     21 #endif
     22 #ifdef HAVE_NETINET_IN_H
     23 #include <netinet/in.h>
     24 #endif
     25 #ifdef HAVE_NETINET_IN6_H
     26 #include <netinet/in6.h>
     27 #endif
     28 #ifdef HAVE_SYS_SOCKET_H
     29 #include <sys/socket.h>
     30 #endif
     31 #ifdef HAVE_SYS_PARAM_H
     32 #include <sys/param.h>
     33 #endif
     34 
     35 #ifdef _WIN32
     36 #include <winsock2.h>
     37 #include <ws2tcpip.h>
     38 #include <windows.h>
     39 #endif
     40 
     41 #include "lib/cc/torint.h"
     42 
     43 struct in_addr;
     44 
     45 /** Implementation of struct in6_addr for platforms that do not have it.
     46 * Generally, these platforms are ones without IPv6 support, but we want to
     47 * have a working in6_addr there anyway, so we can use it to parse IPv6
     48 * addresses. */
     49 #if !defined(HAVE_STRUCT_IN6_ADDR)
     50 struct in6_addr
     51 {
     52  union {
     53    uint8_t u6_addr8[16];
     54    uint16_t u6_addr16[8];
     55    uint32_t u6_addr32[4];
     56  } in6_u;
     57 #define s6_addr   in6_u.u6_addr8
     58 #define s6_addr16 in6_u.u6_addr16
     59 #define s6_addr32 in6_u.u6_addr32
     60 };
     61 #endif /* !defined(HAVE_STRUCT_IN6_ADDR) */
     62 
     63 /** @{ */
     64 /** Many BSD variants seem not to define these. */
     65 #if defined(__APPLE__) || defined(__darwin__) || \
     66  defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD)
     67 #ifndef s6_addr16
     68 #define s6_addr16 __u6_addr.__u6_addr16
     69 #endif
     70 #ifndef s6_addr32
     71 #define s6_addr32 __u6_addr.__u6_addr32
     72 #endif
     73 #endif /* defined(__APPLE__) || defined(__darwin__) || ... */
     74 /** @} */
     75 
     76 #ifndef HAVE_SA_FAMILY_T
     77 typedef uint16_t sa_family_t;
     78 #endif
     79 
     80 /** @{ */
     81 /** Apparently, MS and Solaris don't define s6_addr16 or s6_addr32; these
     82 * macros get you a pointer to s6_addr32 or local equivalent. */
     83 #ifdef HAVE_STRUCT_IN6_ADDR_S6_ADDR32
     84 #define S6_ADDR32(x) ((uint32_t*)(x).s6_addr32)
     85 #else
     86 #define S6_ADDR32(x) ((uint32_t*)((char*)&(x).s6_addr))
     87 #endif
     88 #ifdef HAVE_STRUCT_IN6_ADDR_S6_ADDR16
     89 #define S6_ADDR16(x) ((uint16_t*)(x).s6_addr16)
     90 #else
     91 #define S6_ADDR16(x) ((uint16_t*)((char*)&(x).s6_addr))
     92 #endif
     93 /** @} */
     94 
     95 /** Implementation of struct sockaddr_in6 on platforms that do not have
     96 * it. See notes on struct in6_addr. */
     97 #if !defined(HAVE_STRUCT_SOCKADDR_IN6)
     98 struct sockaddr_in6 {
     99  sa_family_t sin6_family;
    100  uint16_t sin6_port;
    101  // uint32_t sin6_flowinfo;
    102  struct in6_addr sin6_addr;
    103  // uint32_t sin6_scope_id;
    104 };
    105 #endif /* !defined(HAVE_STRUCT_SOCKADDR_IN6) */
    106 
    107 #endif /* !defined(TOR_INADDR_ST_H) */