#include #include #include #include #include #include #include #define SUN_PATH "local-stream" int main(void) { struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = SUN_PATH }; socklen_t len = offsetof(struct sockaddr_un, sun_path) + sizeof SUN_PATH; unlink(SUN_PATH); close(0); close(1); assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 0); assert(bind(0, (struct sockaddr *) &addr, len) == 0); assert(listen(0, 5) == 0); memset(&addr, 0, sizeof addr); assert(getsockname(0, (struct sockaddr *) &addr, &len) == 0); pid_t pid = fork(); assert(pid >= 0); if (pid) { assert(accept(0, (struct sockaddr *) &addr, &len) == 1); assert(close(0) == 0); int status; assert(waitpid(pid, &status, 0) == pid); assert(status == 0); assert(close(1) == 0); } else { assert(socket(PF_LOCAL, SOCK_STREAM, 0) == 1); assert(close(0) == 0); assert(connect(1, (struct sockaddr *) &addr, len) == 0); assert(close(1) == 0); return 0; } unlink(SUN_PATH); return 0; }