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 #define SUN_PATH "local-stream" 10 int main(void) 11 { 12 struct sockaddr_un addr = { 13 .sun_family = AF_UNIX, 14 .sun_path = SUN_PATH 15 }; 16 socklen_t len = offsetof(struct sockaddr_un, sun_path) + sizeof SUN_PATH; 17 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); 42 assert(connect(1, (struct sockaddr *) &addr, len) == 0); 43 assert(close(1) == 0); 44 return 0; 45 } 46 47 unlink(SUN_PATH); 48 return 0; 49 } 50