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