/* SPDX-License-Identifier: MIT */ /* * Description: open+read+close link sequence with fd passing * */ #include #include #include #include #include #include #include "liburing.h" static int test_orc(struct io_uring *ring, const char *fname) { struct io_uring_cqe *cqe; struct io_uring_sqe *sqe; char buf[4096]; int ret, i; sqe = io_uring_get_sqe(ring); io_uring_prep_openat(sqe, AT_FDCWD, fname, O_RDONLY, 0); sqe->flags |= IOSQE_IO_LINK; sqe->user_data = IORING_OP_OPENAT; sqe = io_uring_get_sqe(ring); io_uring_prep_read(sqe, -4096, buf, sizeof(buf), 0); sqe->flags |= IOSQE_IO_LINK; sqe->user_data = IORING_OP_READ; sqe = io_uring_get_sqe(ring); io_uring_prep_close(sqe, -4096); sqe->user_data = IORING_OP_CLOSE; ret = io_uring_submit(ring); if (ret != 3) { fprintf(stderr, "sqe submit failed: %d\n", ret); goto err; } for (i = 0; i < 3; i++) { ret = io_uring_wait_cqe(ring, &cqe); if (ret < 0) { fprintf(stderr, "wait completion %d\n", ret); goto err; } printf("%d: op=%u, res=%d\n", i, (unsigned) cqe->user_data, cqe->res); io_uring_cqe_seen(ring, cqe); } return 0; err: return 1; } int main(int argc, char *argv[]) { struct io_uring ring; int ret; if (argc < 2) { fprintf(stderr, "%s: \n", argv[0]); return 1; } ret = io_uring_queue_init(8, &ring, 0); if (ret) { fprintf(stderr, "ring setup failed: %d\n", ret); return 1; } ret = test_orc(&ring, argv[1]); if (ret) { fprintf(stderr, "test_orc failed\n"); return ret; } return 0; }