summaryrefslogtreecommitdiff
path: root/ext/socket/sockport.h
blob: 2b58958ae7b5a327fe7306b945dc656b43c89cbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/************************************************

  sockport.h -

  $Author$
  created at: Fri Apr 30 23:19:34 JST 1999

************************************************/

#ifndef SOCKPORT_H
#define SOCKPORT_H

#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
# define VALIDATE_SOCKLEN(addr, len) ((addr)->sa_len == (len))
#else
# define VALIDATE_SOCKLEN(addr, len) ((void)(addr), (void)(len), 1)
#endif

#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
# define SET_SA_LEN(sa, len) (void)((sa)->sa_len = (len))
#else
# define SET_SA_LEN(sa, len) (void)(len)
#endif

/* for strict-aliasing rule */
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
# define SET_SIN_LEN(sa, len) (void)((sa)->sin_len = (len))
#else
# define SET_SIN_LEN(sa, len) SET_SA_LEN((struct sockaddr *)(sa), (len))
#endif

#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
# define SET_SIN6_LEN(sa, len) (void)((sa)->sin6_len = (len))
#else
# define SET_SIN6_LEN(sa, len) SET_SA_LEN((struct sockaddr *)(sa), (len))
#endif

#define INIT_SOCKADDR(addr, family, len) \
  do { \
    struct sockaddr *init_sockaddr_ptr = (addr); \
    socklen_t init_sockaddr_len = (len); \
    memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
    init_sockaddr_ptr->sa_family = (family); \
    SET_SA_LEN(init_sockaddr_ptr, init_sockaddr_len); \
  } while (0)

#define INIT_SOCKADDR_IN(addr, len) \
  do { \
    struct sockaddr_in *init_sockaddr_ptr = (addr); \
    socklen_t init_sockaddr_len = (len); \
    memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
    init_sockaddr_ptr->sin_family = AF_INET; \
    SET_SIN_LEN(init_sockaddr_ptr, init_sockaddr_len); \
  } while (0)

#define INIT_SOCKADDR_IN6(addr, len) \
  do { \
    struct sockaddr_in6 *init_sockaddr_ptr = (addr); \
    socklen_t init_sockaddr_len = (len); \
    memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
    init_sockaddr_ptr->sin6_family = AF_INET6; \
    SET_SIN6_LEN(init_sockaddr_ptr, init_sockaddr_len); \
  } while (0)


/* for strict-aliasing rule */
#ifdef HAVE_TYPE_STRUCT_SOCKADDR_UN
#  ifdef HAVE_STRUCT_SOCKADDR_IN_SUN_LEN
#    define SET_SUN_LEN(sa, len) (void)((sa)->sun_len = (len))
#  else
#    define SET_SUN_LEN(sa, len) SET_SA_LEN((struct sockaddr *)(sa), (len))
#  endif
#  define INIT_SOCKADDR_UN(addr, len) \
     do { \
         struct sockaddr_un *init_sockaddr_ptr = (addr); \
         socklen_t init_sockaddr_len = (len); \
         memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
         init_sockaddr_ptr->sun_family = AF_UNIX; \
         SET_SUN_LEN(init_sockaddr_ptr, init_sockaddr_len); \
     } while (0)
#endif

#ifndef IN_MULTICAST
# define IN_CLASSD(i)	(((long)(i) & 0xf0000000) == 0xe0000000)
# define IN_MULTICAST(i)	IN_CLASSD(i)
#endif

#ifndef IN_EXPERIMENTAL
# define IN_EXPERIMENTAL(i) ((((long)(i)) & 0xe0000000) == 0xe0000000)
#endif

#ifndef IN_CLASSA_NSHIFT
# define IN_CLASSA_NSHIFT 24
#endif

#ifndef IN_LOOPBACKNET
# define IN_LOOPBACKNET 127
#endif

#ifndef AF_UNSPEC
# define AF_UNSPEC 0
#endif

#ifndef PF_UNSPEC
# define PF_UNSPEC AF_UNSPEC
#endif

#ifndef PF_INET
# define PF_INET AF_INET
#endif

#if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
extern int h_errno;
#endif

#endif