OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2012 The Native Client Authors. All rights reserved. | |
3 * Use of this source code is governed by a BSD-style license that can | |
4 * be found in the LICENSE file. | |
5 */ | |
6 | |
7 #include <arpa/inet.h> | |
8 #include <assert.h> | |
9 #include <errno.h> | |
10 #include <native_client/tests/glibc_socket_wrappers/irt_syscalls.h> | |
pasko-google - do not use
2012/04/24 09:24:15
this should go in double quotes and separated from
vissi
2012/04/24 10:01:54
in fact, it should take pre-installed irt_syscalls
| |
11 #include <netdb.h> | |
12 #include <netinet/in.h> | |
13 #include <stdio.h> | |
14 #include <string.h> | |
15 #include <sys/socket.h> | |
16 #include <sys/types.h> | |
17 | |
18 int test_var; | |
19 struct sockaddr_in s_in; | |
20 | |
21 #define REGISTER_WRAPPER_IN_GLIBC(name) do { \ | |
22 __nacl_irt_##name = __nacl_irt_##name##_wrap; \ | |
23 } while (0) | |
24 #define WRAP(name) __nacl_irt_##name##_wrap | |
25 | |
26 int WRAP(socket) (int domain, int type, int protocol, int* ret) { | |
27 ++test_var; | |
28 *ret = 51; | |
29 return 0; | |
30 } | |
31 | |
32 int WRAP(accept)(int sockfd, struct sockaddr* addr, socklen_t* addrlen, | |
33 int* ret) { | |
34 ++test_var; | |
35 *addrlen = 52; | |
36 *ret = 23; | |
37 return 0; | |
38 } | |
39 | |
40 int WRAP(bind) (int sockfd, const struct sockaddr* addr, socklen_t addrlen) { | |
41 ++test_var; | |
42 return sockfd > 0 ? 0 : -53; | |
pasko-google - do not use
2012/04/24 09:24:15
this is part of the test code, one of these cases
vissi
2012/04/24 10:01:54
Now covered.
| |
43 } | |
44 | |
45 int WRAP(listen) (int sockfd, int backlog) { | |
46 ++test_var; | |
47 return sockfd > 0 ? 0 : -54; | |
48 } | |
49 | |
50 int WRAP(connect) (int sockfd, const struct sockaddr* addr, | |
51 socklen_t addrlen) { | |
52 ++test_var; | |
53 assert(reinterpret_cast<void*>(&s_in) == reinterpret_cast<void*>(addr)); | |
pasko-google - do not use
2012/04/24 09:24:15
reinterpret_cast in C?
vissi
2012/04/24 10:01:54
no, it was a lint warning, removed now.
| |
54 return sockfd > 0 ? 0 : -55; | |
55 } | |
56 | |
57 int WRAP(send) (int sockfd, const void *buf, size_t len, int flags, | |
58 int* ret) { | |
59 ++test_var; | |
60 *ret = 56; | |
61 return 0; | |
62 } | |
63 | |
64 int WRAP(sendto) (int sockfd, const void *buf, size_t len, int flags, | |
65 const struct sockaddr *dest_addr, socklen_t addrlen, | |
66 int* ret) { | |
67 ++test_var; | |
68 *ret = 57; | |
69 return 0; | |
70 } | |
71 | |
72 int WRAP(sendmsg) (int sockfd, const struct msghdr *msg, int flags, | |
73 int* ret) { | |
74 ++test_var; | |
75 *ret = 58; | |
76 return 0; | |
77 } | |
78 | |
79 int WRAP(recv) (int sockfd, void *buf, size_t len, int flags, int* ret) { | |
80 ++test_var; | |
81 *ret = 59; | |
82 return 0; | |
83 } | |
84 | |
85 int WRAP(recvfrom) (int sockfd, void *buf, size_t len, int flags, | |
86 struct sockaddr *src_addr, socklen_t* addrlen, | |
87 int* ret) { | |
88 ++test_var; | |
89 *ret = 60; | |
90 return 0; | |
91 } | |
92 | |
93 int WRAP(recvmsg) (int sockfd, struct msghdr *msg, int flags, int* ret) { | |
94 ++test_var; | |
95 *ret = 61; | |
96 return 0; | |
97 } | |
98 | |
99 int WRAP(getsockname) (int sockfd, struct sockaddr *addr, | |
100 socklen_t* addrlen) { | |
101 ++test_var; | |
102 *addrlen = 62; | |
103 return 0; | |
104 } | |
105 | |
106 int WRAP(getpeername) (int sockfd, struct sockaddr *addr, | |
107 socklen_t* addrlen) { | |
108 ++test_var; | |
109 *addrlen = 63; | |
110 return 0; | |
111 } | |
112 | |
113 int WRAP(setsockopt) (int sockfd, int level, int optname, const void *optval, | |
114 socklen_t optlen) { | |
115 ++test_var; | |
116 return -64; | |
117 } | |
118 | |
119 int WRAP(getsockopt) (int sockfd, int level, int optname, void *optval, | |
120 socklen_t* optlen) { | |
121 ++test_var; | |
122 return -65; | |
123 } | |
124 | |
125 int WRAP(epoll_create) (int size, int *sd) { | |
126 ++test_var; | |
127 *sd = 5; | |
128 return -66; | |
129 } | |
130 | |
131 int WRAP(epoll_ctl) (int epfd, int op, int fd, struct epoll_event *event) { | |
132 ++test_var; | |
133 return -67; | |
134 } | |
135 | |
136 int WRAP(epoll_wait) (int epfd, struct epoll_event *events, | |
137 int maxevents, int timeout, int* count) { | |
138 ++test_var; | |
139 *count = 0; | |
140 return -68; | |
141 } | |
142 | |
143 int WRAP(epoll_pwait) (int epfd, struct epoll_event *events, | |
144 int maxevents, int timeout, const sigset_t *sigmask, | |
145 size_t sigset_size, int *count) { | |
146 ++test_var; | |
147 *count = 0; | |
148 return -69; | |
149 } | |
150 | |
151 int WRAP(poll) (struct pollfd *fds, nfds_t nfds, int timeout, int *count) { | |
152 ++test_var; | |
153 *count = 0; | |
154 return -70; | |
155 } | |
156 | |
157 int WRAP(ppoll) (struct pollfd *fds, nfds_t nfds, | |
158 const struct timespec *timeout, const sigset_t *sigmask, | |
159 size_t sigset_size, int *count) { | |
160 ++test_var; | |
161 *count = 0; | |
162 return -71; | |
163 } | |
164 | |
165 #define DIRSIZE 8192 | |
166 #define PORT 0x1234 | |
167 int main(int argc, char** argv) { | |
168 REGISTER_WRAPPER_IN_GLIBC(socket); | |
169 REGISTER_WRAPPER_IN_GLIBC(accept); | |
170 REGISTER_WRAPPER_IN_GLIBC(bind); | |
171 REGISTER_WRAPPER_IN_GLIBC(connect); | |
172 REGISTER_WRAPPER_IN_GLIBC(listen); | |
173 REGISTER_WRAPPER_IN_GLIBC(recv); | |
174 REGISTER_WRAPPER_IN_GLIBC(recvmsg); | |
175 REGISTER_WRAPPER_IN_GLIBC(recvfrom); | |
176 REGISTER_WRAPPER_IN_GLIBC(send); | |
177 REGISTER_WRAPPER_IN_GLIBC(sendto); | |
178 REGISTER_WRAPPER_IN_GLIBC(sendmsg); | |
179 REGISTER_WRAPPER_IN_GLIBC(setsockopt); | |
180 REGISTER_WRAPPER_IN_GLIBC(getsockopt); | |
181 REGISTER_WRAPPER_IN_GLIBC(getpeername); | |
182 REGISTER_WRAPPER_IN_GLIBC(getsockname); | |
183 REGISTER_WRAPPER_IN_GLIBC(epoll_create); | |
184 REGISTER_WRAPPER_IN_GLIBC(epoll_ctl); | |
185 REGISTER_WRAPPER_IN_GLIBC(epoll_wait); | |
186 REGISTER_WRAPPER_IN_GLIBC(epoll_pwait); | |
187 REGISTER_WRAPPER_IN_GLIBC(poll); | |
188 REGISTER_WRAPPER_IN_GLIBC(ppoll); | |
189 | |
190 char dir[DIRSIZE]; | |
191 int sd, sd_current, ret; | |
192 socklen_t addrlen; | |
193 struct sockaddr_in pin; | |
194 struct msghdr msg; | |
195 struct epoll_event event; | |
196 struct pollfd pollfds; | |
197 struct timespec timeout; | |
198 sigset_t sigmask; | |
199 | |
200 int prev_var = test_var; | |
201 sd = socket(AF_INET, SOCK_STREAM, 0); | |
202 assert(sd == 51); | |
203 assert(test_var - prev_var == 1); | |
204 | |
205 memset(&s_in, 0, sizeof(s_in)); | |
206 s_in.sin_family = AF_INET; | |
207 s_in.sin_addr.s_addr = INADDR_ANY; | |
208 s_in.sin_port = htons(PORT); | |
209 | |
210 prev_var = test_var; | |
211 ret = bind(sd, (struct sockaddr *) &s_in, sizeof(s_in)); | |
212 assert(ret == 0); | |
213 assert(test_var - prev_var == 1); | |
214 | |
215 prev_var = test_var; | |
216 ret = listen(-1, 5); | |
217 assert(errno == -54); | |
218 assert(test_var - prev_var == 1); | |
219 | |
220 addrlen = sizeof(pin); | |
221 prev_var = test_var; | |
222 sd_current = accept(sd, (struct sockaddr *) &pin, &addrlen); | |
223 assert(addrlen == 52 && sd_current == 23); | |
224 assert(test_var - prev_var == 1); | |
225 | |
226 prev_var = test_var; | |
227 errno = 0; | |
228 connect(sd_current, &s_in, addrlen); | |
229 ret = errno; | |
230 assert(ret == 0); | |
231 assert(test_var - prev_var == 1); | |
232 | |
233 prev_var = test_var; | |
234 ret = recv(sd_current, dir, sizeof(dir), 0); | |
235 assert(ret == 59); | |
236 assert(test_var - prev_var == 1); | |
237 | |
238 prev_var = test_var; | |
239 ret = send(sd_current, dir, sizeof(dir), 0); | |
240 assert(ret == 56); | |
241 assert(test_var - prev_var == 1); | |
242 | |
243 prev_var = test_var; | |
244 ret = sendto(sd_current, dir, sizeof(dir), 0, &s_in, 0); | |
245 assert(ret == 57); | |
246 assert(test_var - prev_var == 1); | |
247 | |
248 prev_var = test_var; | |
249 ret = recvfrom(sd_current, dir, sizeof(dir), 0, &s_in, &addrlen); | |
250 assert(ret == 60); | |
251 assert(test_var - prev_var == 1); | |
252 | |
253 prev_var = test_var; | |
254 ret = recvmsg(sd_current, &msg, 0); | |
255 assert(ret == 61); | |
256 assert(test_var - prev_var == 1); | |
257 | |
258 prev_var = test_var; | |
259 ret = sendmsg(sd_current, &msg, 0); | |
260 assert(ret == 58); | |
261 assert(test_var - prev_var == 1); | |
262 | |
263 prev_var = test_var; | |
264 errno = 0; | |
265 getsockopt(sd, 0, 0, dir, &addrlen); | |
266 ret = errno; | |
267 assert(ret == -65); | |
268 assert(test_var - prev_var == 1); | |
269 | |
270 prev_var = test_var; | |
271 errno = 0; | |
272 setsockopt(sd, 0, 0, dir, addrlen); | |
273 ret = errno; | |
274 assert(ret == -64); | |
275 assert(test_var - prev_var == 1); | |
276 | |
277 prev_var = test_var; | |
278 getpeername(sd, &s_in, &addrlen); | |
279 assert(addrlen == 63); | |
280 assert(test_var - prev_var == 1); | |
281 | |
282 prev_var = test_var; | |
283 getsockname(sd, &s_in, &addrlen); | |
284 assert(addrlen == 62); | |
285 assert(test_var - prev_var == 1); | |
286 | |
287 prev_var = test_var; | |
288 errno = 0; | |
289 epoll_create(0); | |
290 ret = errno; | |
291 assert(ret == -66); | |
292 assert(test_var - prev_var == 1); | |
293 | |
294 prev_var = test_var; | |
295 errno = 0; | |
296 epoll_ctl(0, 0, 0, &event); | |
297 ret = errno; | |
298 assert(ret == -67); | |
299 assert(test_var - prev_var == 1); | |
300 | |
301 prev_var = test_var; | |
302 errno = 0; | |
303 epoll_wait(0, &event, 0, 0); | |
304 ret = errno; | |
305 assert(ret == -68); | |
306 assert(test_var - prev_var == 1); | |
307 | |
308 prev_var = test_var; | |
309 errno = 0; | |
310 epoll_pwait(0, &event, 0, 0, &sigmask); | |
311 ret = errno; | |
312 assert(ret == -69); | |
313 assert(test_var - prev_var == 1); | |
314 | |
315 prev_var = test_var; | |
316 errno = 0; | |
317 poll(&pollfds, 0, 0); | |
318 ret = errno; | |
319 assert(ret == -70); | |
320 assert(test_var - prev_var == 1); | |
321 | |
322 prev_var = test_var; | |
323 errno = 0; | |
324 ppoll(&pollfds, 0, &timeout, &sigmask); | |
325 ret = errno; | |
326 assert(ret == -71); | |
327 assert(test_var - prev_var == 1); | |
328 | |
329 return 0; | |
330 } | |
331 | |
OLD | NEW |