1 // RUN: %clangxx -O0 -g %s -o %t && %run %t 2 3 #include <netinet/in.h> 4 #include <sys/socket.h> 5 #include <sys/wait.h> 6 #include <signal.h> 7 #include <stdlib.h> 8 #include <unistd.h> 9 10 int main(void) { 11 int child; 12 int fd, sfd; 13 socklen_t len; 14 struct sockaddr_in server = {}, client = {}; 15 sigset_t set; 16 17 child = fork(); 18 if (child == 0) { 19 fd = socket(AF_INET, SOCK_STREAM, 0); 20 if (fd == -1) 21 _exit(1); 22 23 server.sin_family = AF_INET; 24 server.sin_addr.s_addr = INADDR_ANY; 25 server.sin_port = htons(2222); 26 27 if (connect(fd, (struct sockaddr *)&server, sizeof(server)) == -1) 28 _exit(1); 29 30 close(fd); 31 32 _exit(0); 33 } 34 35 fd = socket(AF_INET, SOCK_STREAM, 0); 36 if (fd == -1) { 37 kill(child, SIGKILL); 38 wait(NULL); 39 exit(1); 40 } 41 42 server.sin_family = AF_INET; 43 server.sin_addr.s_addr = INADDR_ANY; 44 server.sin_port = htons(2222); 45 46 if (bind(fd, (const struct sockaddr *)&server, sizeof(server)) == -1) { 47 kill(child, SIGKILL); 48 wait(NULL); 49 exit(1); 50 } 51 52 listen(fd, 3); 53 54 if (sigemptyset(&set) == -1) { 55 kill(child, SIGKILL); 56 wait(NULL); 57 exit(1); 58 } 59 60 len = sizeof(client); 61 sfd = paccept(fd, (struct sockaddr *)&client, &len, &set, SOCK_NONBLOCK); 62 if (sfd == -1) { 63 kill(child, SIGKILL); 64 wait(NULL); 65 exit(1); 66 } 67 68 wait(NULL); 69 70 close(sfd); 71 close(fd); 72 73 return 0; 74 } 75