blob: 5af7d81b7342109ed2321f82a99af9ca6a8c78ce [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
9#define SUN_PATH "local-stream"
10int main(void)
11{
12 struct sockaddr_un addr = {
13 .sun_family = AF_UNIX,
14 .sun_path = SUN_PATH
15 };
Dmitry V. Levin56ef5ef2013-05-08 14:03:38 +000016 socklen_t len = offsetof(struct sockaddr_un, sun_path) + sizeof SUN_PATH;
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000017
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);
Dmitry V. Levin56ef5ef2013-05-08 14:03:38 +000042 assert(connect(1, (struct sockaddr *) &addr, len) == 0);
Dmitry V. Levin47b0dcc2013-05-07 23:32:01 +000043 assert(close(1) == 0);
44 return 0;
45 }
46
47 unlink(SUN_PATH);
48 return 0;
49}