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);