a7a4d28abcd976cf6622e3b1d6e9fe7f0299fcfc
2 #include "pipe/p_compiler.h"
3 #include "util/u_network.h"
4 #include "util/u_debug.h"
7 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
10 # include <ws2tcpip.h>
11 #elif defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) || \
12 defined(PIPE_OS_APPLE) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
13 # include <sys/socket.h>
14 # include <netinet/in.h>
19 # warning "No socket implementation"
25 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
26 WORD wVersionRequested
;
30 /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
31 wVersionRequested
= MAKEWORD(1, 1);
33 err
= WSAStartup(wVersionRequested
, &wsaData
);
35 debug_printf("WSAStartup failed with error: %d\n", err
);
39 #elif defined(PIPE_HAVE_SOCKETS)
49 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
60 #if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
61 || defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
62 shutdown(s
, SHUT_RDWR
);
64 #elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
72 int u_socket_accept(int s
)
74 #if defined(PIPE_HAVE_SOCKETS)
75 return accept(s
, NULL
, NULL
);
82 u_socket_send(int s
, void *data
, size_t size
)
84 #if defined(PIPE_HAVE_SOCKETS)
85 return send(s
, data
, size
, 0);
92 u_socket_peek(int s
, void *data
, size_t size
)
94 #if defined(PIPE_HAVE_SOCKETS)
95 return recv(s
, data
, size
, MSG_PEEK
);
102 u_socket_recv(int s
, void *data
, size_t size
)
104 #if defined(PIPE_HAVE_SOCKETS)
105 return recv(s
, data
, size
, 0);
112 u_socket_connect(const char *hostname
, uint16_t port
)
114 #if defined(PIPE_HAVE_SOCKETS)
116 struct addrinfo hints
, *addr
;
119 memset(&hints
, 0, sizeof hints
);
120 hints
.ai_family
= AF_UNSPEC
; // AF_INET or AF_INET6 to force version
121 hints
.ai_socktype
= SOCK_STREAM
;
123 snprintf(portString
, sizeof(portString
), "%d", port
);
125 r
= getaddrinfo(hostname
, portString
, NULL
, &addr
);
130 s
= socket(addr
->ai_family
, SOCK_STREAM
, IPPROTO_TCP
);
136 if (connect(s
, addr
->ai_addr
, (int) addr
->ai_addrlen
)) {
152 u_socket_listen_on_port(uint16_t portnum
)
154 #if defined(PIPE_HAVE_SOCKETS)
156 struct sockaddr_in sa
;
157 memset(&sa
, 0, sizeof(struct sockaddr_in
));
159 sa
.sin_family
= AF_INET
;
160 sa
.sin_port
= htons(portnum
);
162 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
166 if (bind(s
, (struct sockaddr
*)&sa
, sizeof(struct sockaddr_in
)) == -1) {
181 u_socket_block(int s
, boolean block
)
183 #if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
184 || defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
185 int old
= fcntl(s
, F_GETFL
, 0);
189 /* TODO obey block */
191 fcntl(s
, F_SETFL
, old
& ~O_NONBLOCK
);
193 fcntl(s
, F_SETFL
, old
| O_NONBLOCK
);
194 #elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
195 u_long iMode
= block
? 0 : 1;
196 ioctlsocket(s
, FIONBIO
, &iMode
);