| 26 | static __be32 g_port; |
| 27 | |
| 28 | static int recv_prep(struct io_uring *ring, struct iovec *iov, int *sock, |
| 29 | int registerfiles) |
| 30 | { |
| 31 | struct sockaddr_in saddr; |
| 32 | struct io_uring_sqe *sqe; |
| 33 | int sockfd, ret, val, use_fd; |
| 34 | |
| 35 | memset(&saddr, 0, sizeof(saddr)); |
| 36 | saddr.sin_family = AF_INET; |
| 37 | saddr.sin_addr.s_addr = htonl(INADDR_ANY); |
| 38 | |
| 39 | sockfd = socket(AF_INET, SOCK_DGRAM, 0); |
| 40 | if (sockfd < 0) { |
| 41 | perror("socket"); |
| 42 | return 1; |
| 43 | } |
| 44 | |
| 45 | val = 1; |
| 46 | setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); |
| 47 | |
| 48 | if (t_bind_ephemeral_port(sockfd, &saddr)) { |
| 49 | perror("bind"); |
| 50 | goto err; |
| 51 | } |
| 52 | g_port = saddr.sin_port; |
| 53 | |
| 54 | if (registerfiles) { |
| 55 | ret = io_uring_register_files(ring, &sockfd, 1); |
| 56 | if (ret) { |
| 57 | fprintf(stderr, "file reg failed\n"); |
| 58 | goto err; |
| 59 | } |
| 60 | use_fd = 0; |
| 61 | } else { |
| 62 | use_fd = sockfd; |
| 63 | } |
| 64 | |
| 65 | sqe = io_uring_get_sqe(ring); |
| 66 | io_uring_prep_recv(sqe, use_fd, iov->iov_base, iov->iov_len, 0); |
| 67 | if (registerfiles) |
| 68 | sqe->flags |= IOSQE_FIXED_FILE; |
| 69 | sqe->user_data = 2; |
| 70 | |
| 71 | ret = io_uring_submit(ring); |
| 72 | if (ret <= 0) { |
| 73 | fprintf(stderr, "submit failed: %d\n", ret); |
| 74 | goto err; |
| 75 | } |
| 76 | |
| 77 | *sock = sockfd; |
| 78 | return 0; |
| 79 | err: |
| 80 | close(sockfd); |
| 81 | return 1; |
| 82 | } |
| 83 | |
| 84 | static int do_recv(struct io_uring *ring, struct iovec *iov) |
| 85 | { |
no test coverage detected