]> granicus.if.org Git - strace/blob - tests/net-accept-connect.c
tests: fix race condition in net-accept-connect based tests
[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 int main(int ac, const char **av)
10 {
11         struct sockaddr_un addr = {
12                 .sun_family = AF_UNIX,
13         };
14         socklen_t len;
15
16         assert(ac == 2);
17         assert(strlen(av[1]) > 0);
18         assert(strlen(av[1]) < sizeof(addr.sun_path));
19
20         strcpy(addr.sun_path, av[1]);
21         len = offsetof(struct sockaddr_un, sun_path) + strlen(av[1]) + 1;
22
23         unlink(av[1]);
24         close(0);
25         close(1);
26
27         assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 0);
28         assert(bind(0, (struct sockaddr *) &addr, len) == 0);
29         assert(listen(0, 5) == 0);
30
31         memset(&addr, 0, sizeof addr);
32         assert(getsockname(0, (struct sockaddr *) &addr, &len) == 0);
33
34         pid_t pid = fork();
35         assert(pid >= 0);
36
37         if (pid) {
38                 assert(accept(0, (struct sockaddr *) &addr, &len) == 1);
39                 assert(close(0) == 0);
40                 int status;
41                 assert(waitpid(pid, &status, 0) == pid);
42                 assert(status == 0);
43                 assert(close(1) == 0);
44         } else {
45                 assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 1);
46                 assert(close(0) == 0);
47                 assert(connect(1, (struct sockaddr *) &addr, len) == 0);
48                 assert(close(1) == 0);
49                 return 0;
50         }
51
52         unlink(av[1]);
53         return 0;
54 }