2
#include "pipe/p_compiler.h"
3
#include "util/u_network.h"
4
#include "util/u_debug.h"
6
#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
9
#elif defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) || \
10
defined(PIPE_OS_APPLE) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
11
# include <sys/socket.h>
12
# include <netinet/in.h>
17
# warning "No socket implementation"
23
#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
24
WORD wVersionRequested;
28
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
29
wVersionRequested = MAKEWORD(1, 1);
31
err = WSAStartup(wVersionRequested, &wsaData);
33
debug_printf("WSAStartup failed with error: %d\n", err);
37
#elif defined(PIPE_HAVE_SOCKETS)
47
#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
58
#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
59
|| defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
60
shutdown(s, SHUT_RDWR);
62
#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
70
int u_socket_accept(int s)
72
#if defined(PIPE_HAVE_SOCKETS)
73
return accept(s, NULL, NULL);
80
u_socket_send(int s, void *data, size_t size)
82
#if defined(PIPE_HAVE_SOCKETS)
83
return send(s, data, size, 0);
90
u_socket_peek(int s, void *data, size_t size)
92
#if defined(PIPE_HAVE_SOCKETS)
93
return recv(s, data, size, MSG_PEEK);
100
u_socket_recv(int s, void *data, size_t size)
102
#if defined(PIPE_HAVE_SOCKETS)
103
return recv(s, data, size, 0);
110
u_socket_connect(const char *hostname, uint16_t port)
112
#if defined(PIPE_HAVE_SOCKETS)
114
struct sockaddr_in sa;
115
struct hostent *host = NULL;
117
memset(&sa, 0, sizeof(struct sockaddr_in));
118
host = gethostbyname(hostname);
122
memcpy((char *)&sa.sin_addr,host->h_addr_list[0],host->h_length);
123
sa.sin_family= host->h_addrtype;
124
sa.sin_port = htons(port);
126
s = socket(host->h_addrtype, SOCK_STREAM, IPPROTO_TCP);
130
if (connect(s, (struct sockaddr *)&sa, sizeof(sa))) {
143
u_socket_listen_on_port(uint16_t portnum)
145
#if defined(PIPE_HAVE_SOCKETS)
147
struct sockaddr_in sa;
148
memset(&sa, 0, sizeof(struct sockaddr_in));
150
sa.sin_family = AF_INET;
151
sa.sin_port = htons(portnum);
153
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
157
if (bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == -1) {
172
u_socket_block(int s, boolean block)
174
#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
175
|| defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
176
int old = fcntl(s, F_GETFL, 0);
180
/* TODO obey block */
182
fcntl(s, F_SETFL, old & ~O_NONBLOCK);
184
fcntl(s, F_SETFL, old | O_NONBLOCK);
185
#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
186
u_long iMode = block ? 0 : 1;
187
ioctlsocket(s, FIONBIO, &iMode);