forked from haskell/network
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHsNet.h
139 lines (124 loc) · 2.67 KB
/
HsNet.h
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* -----------------------------------------------------------------------------
*
* Definitions for package `network' which are visible in Haskell land.
*
* ---------------------------------------------------------------------------*/
#ifndef HSNET_H
#define HSNET_H
#include "HsNetDef.h"
#ifndef INLINE
# if defined(_MSC_VER)
# define INLINE extern __inline
# elif defined(__GNUC_GNU_INLINE__)
# define INLINE extern inline
# else
# define INLINE inline
# endif
#endif
#define _GNU_SOURCE 1 /* for struct ucred on Linux */
#ifdef _WIN32
# include <winsock2.h>
# include <ws2tcpip.h>
# define IPV6_V6ONLY 27
#endif
#ifdef HAVE_LIMITS_H
# include <limits.h>
#endif
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif
#ifdef HAVE_SYS_UIO_H
# include <sys/uio.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_TCP_H
# include <netinet/tcp.h>
#endif
#ifdef HAVE_SYS_UN_H
# include <sys/un.h>
#endif
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#ifdef HAVE_NET_IF_H
# include <net/if.h>
#endif
#ifdef HAVE_NETIOAPI_H
# include <netioapi.h>
#endif
#ifdef _WIN32
extern int initWinSock ();
extern const char* getWSErrorDescr(int err);
extern void* newAcceptParams(int sock,
int sz,
void* sockaddr);
extern int acceptNewSock(void* d);
extern int acceptDoProc(void* param);
#else /* _WIN32 */
extern int
sendFd(int sock, int outfd);
extern int
recvFd(int sock);
#endif /* _WIN32 */
INLINE char *
hsnet_inet_ntoa(
#if defined(_WIN32)
u_long addr
#elif defined(HAVE_IN_ADDR_T)
in_addr_t addr
#elif defined(HAVE_INTTYPES_H)
uint32_t addr
#else
unsigned long addr
#endif
)
{
struct in_addr a;
a.s_addr = addr;
return inet_ntoa(a);
}
INLINE int
hsnet_getnameinfo(const struct sockaddr* a,socklen_t b, char* c,
# if defined(_WIN32)
DWORD d, char* e, DWORD f, int g)
# else
socklen_t d, char* e, socklen_t f, int g)
# endif
{
return getnameinfo(a,b,c,d,e,f,g);
}
INLINE int
hsnet_getaddrinfo(const char *hostname, const char *servname,
const struct addrinfo *hints, struct addrinfo **res)
{
return getaddrinfo(hostname, servname, hints, res);
}
INLINE void
hsnet_freeaddrinfo(struct addrinfo *ai)
{
freeaddrinfo(ai);
}
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
#ifndef SOCK_NONBLOCK // Missing define in Bionic libc (Android)
# define SOCK_NONBLOCK O_NONBLOCK
#endif
#endif /* HSNET_H */