Tizen 2.0 Release
[profile/ivi/osmesa.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) || defined(PIPE_OS_CYGWIN)
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_list[0],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 }