]> granicus.if.org Git - strace/blob - tests/net-accept-connect.c
tests/net: fix portability issues
[strace] / tests / net-accept-connect.c
1 #include <assert.h>
2 #include <stddef.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <sys/wait.h>
6 #include <sys/socket.h>
7 #include <sys/un.h>
8
9 #define SUN_PATH "local-stream"
10 int main(void)
11 {
12         struct sockaddr_un addr = {
13                 .sun_family = AF_UNIX,
14                 .sun_path = SUN_PATH
15         };
16         socklen_t len = offsetof(struct sockaddr_un, sun_path) + sizeof SUN_PATH;
17
18         unlink(SUN_PATH);
19         close(0);
20         close(1);
21
22         assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 0);
23         assert(bind(0, (struct sockaddr *) &addr, len) == 0);
24         assert(listen(0, 5) == 0);
25
26         memset(&addr, 0, sizeof addr);
27         assert(getsockname(0, (struct sockaddr *) &addr, &len) == 0);
28
29         pid_t pid = fork();
30         assert(pid >= 0);
31
32         if (pid) {
33                 assert(accept(0, (struct sockaddr *) &addr, &len) == 1);
34                 assert(close(0) == 0);
35                 int status;
36                 assert(waitpid(pid, &status, 0) == pid);
37                 assert(status == 0);
38                 assert(close(1) == 0);
39         } else {
40                 assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 1);
41                 assert(close(0) == 0);
42                 assert(connect(1, (struct sockaddr *) &addr, len) == 0);
43                 assert(close(1) == 0);
44                 return 0;
45         }
46
47         unlink(SUN_PATH);
48         return 0;
49 }