| 77 | } |
| 78 | |
| 79 | static int recv_prep(struct io_uring *ring, struct recv_data *rd, int *sock) |
| 80 | { |
| 81 | struct sockaddr_in saddr; |
| 82 | int sockfd, ret, val, use_fd; |
| 83 | socklen_t socklen; |
| 84 | |
| 85 | memset(&saddr, 0, sizeof(saddr)); |
| 86 | saddr.sin_family = AF_INET; |
| 87 | saddr.sin_addr.s_addr = htonl(INADDR_ANY); |
| 88 | saddr.sin_port = htons(use_port); |
| 89 | |
| 90 | if (use_tcp) |
| 91 | sockfd = socket(AF_INET, SOCK_STREAM, 0); |
| 92 | else |
| 93 | sockfd = socket(AF_INET, SOCK_DGRAM, 0); |
| 94 | if (sockfd < 0) { |
| 95 | perror("socket"); |
| 96 | return 1; |
| 97 | } |
| 98 | |
| 99 | val = 1; |
| 100 | setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); |
| 101 | |
| 102 | ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)); |
| 103 | if (ret < 0) { |
| 104 | perror("bind"); |
| 105 | goto err; |
| 106 | } |
| 107 | |
| 108 | if (use_tcp) { |
| 109 | ret = listen(sockfd, 1); |
| 110 | if (ret < 0) { |
| 111 | perror("listen"); |
| 112 | goto err; |
| 113 | } |
| 114 | |
| 115 | pthread_barrier_wait(&rd->connect); |
| 116 | |
| 117 | if (rd->abort) |
| 118 | goto err; |
| 119 | |
| 120 | socklen = sizeof(saddr); |
| 121 | use_fd = accept(sockfd, (struct sockaddr *)&saddr, &socklen); |
| 122 | if (use_fd < 0) { |
| 123 | perror("accept"); |
| 124 | goto err; |
| 125 | } |
| 126 | } else { |
| 127 | use_fd = sockfd; |
| 128 | pthread_barrier_wait(&rd->connect); |
| 129 | } |
| 130 | |
| 131 | rd->accept_fd = use_fd; |
| 132 | pthread_barrier_wait(&rd->startup); |
| 133 | pthread_barrier_wait(&rd->barrier); |
| 134 | |
| 135 | if (arm_recv(ring, rd)) |
| 136 | goto err; |