blob: 6d99e3aa850b0bcb469d63da8472c2f361897f91 [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);
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +000018
Dmitry V. Levinc9e24182015-01-29 15:19:21 +000019 strncpy(addr.sun_path, av[1], sizeof(addr.sun_path));
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +000020 len = offsetof(struct sockaddr_un, sun_path) + strlen(av[1]) + 1;
Dmitry V. Levinc9e24182015-01-29 15:19:21 +000021 if (len > sizeof(addr))
22 len = sizeof(addr);
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +000023
24 unlink(av[1]);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000025 close(0);
26 close(1);
27
28 assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 0);
29 assert(bind(0, (struct sockaddr *) &addr, len) == 0);
30 assert(listen(0, 5) == 0);
31
32 memset(&addr, 0, sizeof addr);
33 assert(getsockname(0, (struct sockaddr *) &addr, &len) == 0);
Dmitry V. Levinc9e24182015-01-29 15:19:21 +000034 if (len > sizeof(addr))
35 len = sizeof(addr);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000036
37 pid_t pid = fork();
38 assert(pid >= 0);
39
40 if (pid) {
41 assert(accept(0, (struct sockaddr *) &addr, &len) == 1);
42 assert(close(0) == 0);
43 int status;
44 assert(waitpid(pid, &status, 0) == pid);
45 assert(status == 0);
46 assert(close(1) == 0);
47 } else {
48 assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 1);
49 assert(close(0) == 0);
Dmitry V. Levin56ef5ef2013-05-08 14:03:38 +000050 assert(connect(1, (struct sockaddr *) &addr, len) == 0);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000051 assert(close(1) == 0);
52 return 0;
53 }
54
Dmitry V. Levinc9cc4cb2015-01-07 20:14:19 +000055 unlink(av[1]);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000056 return 0;
57}