blob: f33d48f3235c65d079ae5b9dd70fbdbe0c909da8 [file] [log] [blame]
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +00001#include <assert.h>
Dmitry V. Levin56ef5ef2013-05-08 14:03:38 +00002#include <stddef.h>
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +00003#include <string.h>
4#include <unistd.h>
5#include <sys/wait.h>
6#include <sys/socket.h>
7#include <sys/un.h>
8
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +00009int main(int ac, const char **av)
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000010{
11 struct sockaddr_un addr = {
12 .sun_family = AF_UNIX,
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000013 };
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +000014 socklen_t len;
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000015
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +000016 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]);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000024 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);
Dmitry V. Levin56ef5ef2013-05-08 14:03:38 +000047 assert(connect(1, (struct sockaddr *) &addr, len) == 0);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000048 assert(close(1) == 0);
49 return 0;
50 }
51
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +000052 unlink(av[1]);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000053 return 0;
54}