* Slap *some* sense into our header inclusions.
[reactos.git] / reactos / dll / opengl / mesa / src / gallium / auxiliary / util / u_network.c
1
2 #include "pipe/p_compiler.h"
3 #include "util/u_network.h"
4 #include "util/u_debug.h"
5
6 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
7 # define WIN32_NO_STATUS
8 # define _INC_WINDOWS
9 # include <windef.h>
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>
16 # include <unistd.h>
17 # include <fcntl.h>
18 # include <netdb.h>
19 #else
20 # warning "No socket implementation"
21 #endif
22
23 boolean
24 u_socket_init()
25 {
26 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
27 WORD wVersionRequested;
28 WSADATA wsaData;
29 int err;
30
31 /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
32 wVersionRequested = MAKEWORD(1, 1);
33
34 err = WSAStartup(wVersionRequested, &wsaData);
35 if (err != 0) {
36 debug_printf("WSAStartup failed with error: %d\n", err);
37 return FALSE;
38 }
39 return TRUE;
40 #elif defined(PIPE_HAVE_SOCKETS)
41 return TRUE;
42 #else
43 return FALSE;
44 #endif
45 }
46
47 void
48 u_socket_stop()
49 {
50 #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
51 WSACleanup();
52 #endif
53 }
54
55 void
56 u_socket_close(int s)
57 {
58 if (s < 0)
59 return;
60
61 #if defined(PIPE_OS_LINUX) || defined(PIPE_OS_HAIKU) \
62 || defined(PIPE_OS_APPLE) || defined(PIPE_OS_SOLARIS)
63 shutdown(s, SHUT_RDWR);
64 close(s);
65 #elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
66 shutdown(s, SD_BOTH);
67 closesocket(s);
68 #else
69 assert(0);
70 #endif
71 }
72
73 int u_socket_accept(int s)
74 {
75 #if defined(PIPE_HAVE_SOCKETS)
76 return accept(s, NULL, NULL);
77 #else
78 return -1;
79 #endif
80 }
81
82 int
83 u_socket_send(int s, void *data, size_t size)
84 {
85 #if defined(PIPE_HAVE_SOCKETS)
86 return send(s, data, size, 0);
87 #else
88 return -1;
89 #endif
90 }
91
92 int
93 u_socket_peek(int s, void *data, size_t size)
94 {
95 #if defined(PIPE_HAVE_SOCKETS)
96 return recv(s, data, size, MSG_PEEK);
97 #else
98 return -1;
99 #endif
100 }
101
102 int
103 u_socket_recv(int s, void *data, size_t size)
104 {
105 #if defined(PIPE_HAVE_SOCKETS)
106 return recv(s, data, size, 0);
107 #else
108 return -1;
109 #endif
110 }
111
112 int
113 u_socket_connect(const char *hostname, uint16_t port)
114 {
115 #if defined(PIPE_HAVE_SOCKETS)
116 int s;
117 struct sockaddr_in sa;
118 struct hostent *host = NULL;
119
120 memset(&sa, 0, sizeof(struct sockaddr_in));
121 host = gethostbyname(hostname);
122 if (!host)
123 return -1;
124
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);
128
129 s = socket(host->h_addrtype, SOCK_STREAM, IPPROTO_TCP);
130 if (s < 0)
131 return -1;
132
133 if (connect(s, (struct sockaddr *)&sa, sizeof(sa))) {
134 u_socket_close(s);
135 return -1;
136 }
137
138 return s;
139 #else
140 assert(0);
141 return -1;
142 #endif
143 }
144
145 int
146 u_socket_listen_on_port(uint16_t portnum)
147 {
148 #if defined(PIPE_HAVE_SOCKETS)
149 int s;
150 struct sockaddr_in sa;
151 memset(&sa, 0, sizeof(struct sockaddr_in));
152
153 sa.sin_family = AF_INET;
154 sa.sin_port = htons(portnum);
155
156 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
157 if (s < 0)
158 return -1;
159
160 if (bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == -1) {
161 u_socket_close(s);
162 return -1;
163 }
164
165 listen(s, 0);
166
167 return s;
168 #else
169 assert(0);
170 return -1;
171 #endif
172 }
173
174 void
175 u_socket_block(int s, boolean block)
176 {
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);
180 if (old == -1)
181 return;
182
183 /* TODO obey block */
184 if (block)
185 fcntl(s, F_SETFL, old & ~O_NONBLOCK);
186 else
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);
191 #else
192 assert(0);
193 #endif
194 }