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)
7 # define WIN32_NO_STATUS
10 # include <winsock2.h>
11 //# include <windows.h>
12 #elif defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) || \
13 defined(PIPE_OS_APPLE) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
14 # include <sys/socket.h>
15 # include <netinet/in.h>
20 # warning "No socket implementation"
26 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
27 WORD wVersionRequested
;
31 /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
32 wVersionRequested
= MAKEWORD(1, 1);
34 err
= WSAStartup(wVersionRequested
, &wsaData
);
36 debug_printf("WSAStartup failed with error: %d\n", err
);
40 #elif defined(PIPE_HAVE_SOCKETS)
50 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
61 #if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
62 || defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
63 shutdown(s
, SHUT_RDWR
);
65 #elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
73 int u_socket_accept(int s
)
75 #if defined(PIPE_HAVE_SOCKETS)
76 return accept(s
, NULL
, NULL
);
83 u_socket_send(int s
, void *data
, size_t size
)
85 #if defined(PIPE_HAVE_SOCKETS)
86 return send(s
, data
, size
, 0);
93 u_socket_peek(int s
, void *data
, size_t size
)
95 #if defined(PIPE_HAVE_SOCKETS)
96 return recv(s
, data
, size
, MSG_PEEK
);
103 u_socket_recv(int s
, void *data
, size_t size
)
105 #if defined(PIPE_HAVE_SOCKETS)
106 return recv(s
, data
, size
, 0);
113 u_socket_connect(const char *hostname
, uint16_t port
)
115 #if defined(PIPE_HAVE_SOCKETS)
117 struct sockaddr_in sa
;
118 struct hostent
*host
= NULL
;
120 memset(&sa
, 0, sizeof(struct sockaddr_in
));
121 host
= gethostbyname(hostname
);
125 memcpy((char *)&sa
.sin_addr
,host
->h_addr_list
[0],host
->h_length
);
126 sa
.sin_family
= host
->h_addrtype
;
127 sa
.sin_port
= htons(port
);
129 s
= socket(host
->h_addrtype
, SOCK_STREAM
, IPPROTO_TCP
);
133 if (connect(s
, (struct sockaddr
*)&sa
, sizeof(sa
))) {
146 u_socket_listen_on_port(uint16_t portnum
)
148 #if defined(PIPE_HAVE_SOCKETS)
150 struct sockaddr_in sa
;
151 memset(&sa
, 0, sizeof(struct sockaddr_in
));
153 sa
.sin_family
= AF_INET
;
154 sa
.sin_port
= htons(portnum
);
156 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
160 if (bind(s
, (struct sockaddr
*)&sa
, sizeof(struct sockaddr_in
)) == -1) {
175 u_socket_block(int s
, boolean block
)
177 #if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
178 || defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
179 int old
= fcntl(s
, F_GETFL
, 0);
183 /* TODO obey block */
185 fcntl(s
, F_SETFL
, old
& ~O_NONBLOCK
);
187 fcntl(s
, F_SETFL
, old
| O_NONBLOCK
);
188 #elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
189 u_long iMode
= block
? 0 : 1;
190 ioctlsocket(s
, FIONBIO
, &iMode
);