| // RUN: %clangxx -O0 -g %s -o %t && %run %t |
| |
| #include <netinet/in.h> |
| #include <sys/socket.h> |
| #include <sys/wait.h> |
| #include <signal.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| |
| int main(void) { |
| int child; |
| int fd, sfd; |
| socklen_t len; |
| struct sockaddr_in server = {}, client = {}; |
| sigset_t set; |
| |
| child = fork(); |
| if (child == 0) { |
| fd = socket(AF_INET, SOCK_STREAM, 0); |
| if (fd == -1) |
| _exit(1); |
| |
| server.sin_family = AF_INET; |
| server.sin_addr.s_addr = INADDR_ANY; |
| server.sin_port = htons(2222); |
| |
| if (connect(fd, (struct sockaddr *)&server, sizeof(server)) == -1) |
| _exit(1); |
| |
| close(fd); |
| |
| _exit(0); |
| } |
| |
| fd = socket(AF_INET, SOCK_STREAM, 0); |
| if (fd == -1) { |
| kill(child, SIGKILL); |
| wait(NULL); |
| exit(1); |
| } |
| |
| server.sin_family = AF_INET; |
| server.sin_addr.s_addr = INADDR_ANY; |
| server.sin_port = htons(2222); |
| |
| if (bind(fd, (const struct sockaddr *)&server, sizeof(server)) == -1) { |
| kill(child, SIGKILL); |
| wait(NULL); |
| exit(1); |
| } |
| |
| listen(fd, 3); |
| |
| if (sigemptyset(&set) == -1) { |
| kill(child, SIGKILL); |
| wait(NULL); |
| exit(1); |
| } |
| |
| len = sizeof(client); |
| sfd = paccept(fd, (struct sockaddr *)&client, &len, &set, SOCK_NONBLOCK); |
| if (sfd == -1) { |
| kill(child, SIGKILL); |
| wait(NULL); |
| exit(1); |
| } |
| |
| wait(NULL); |
| |
| close(sfd); |
| close(fd); |
| |
| return 0; |
| } |