diff options
author | thegeorg <thegeorg@yandex-team.com> | 2024-06-09 11:55:21 +0300 |
---|---|---|
committer | thegeorg <thegeorg@yandex-team.com> | 2024-06-09 12:07:55 +0300 |
commit | afd4899380eea1c70e2a68714b5da1c9919ccdbd (patch) | |
tree | cd5120708784139bc6a0f8881da1ed8389a065b3 /contrib/libs/liburing/test/hardlink.c | |
parent | a83bd2dd3c21e38c6c0807ec5e679497ab567f24 (diff) | |
download | ydb-afd4899380eea1c70e2a68714b5da1c9919ccdbd.tar.gz |
Update contrib/libs/liburing to 2.6
3b51a9fb14de805208d11f1c077c78bb5d487e0f
Diffstat (limited to 'contrib/libs/liburing/test/hardlink.c')
-rw-r--r-- | contrib/libs/liburing/test/hardlink.c | 108 |
1 files changed, 69 insertions, 39 deletions
diff --git a/contrib/libs/liburing/test/hardlink.c b/contrib/libs/liburing/test/hardlink.c index 1bd7a1c882..6ac5f39f98 100644 --- a/contrib/libs/liburing/test/hardlink.c +++ b/contrib/libs/liburing/test/hardlink.c @@ -13,36 +13,34 @@ #include "liburing.h" #include "helpers.h" - -static int do_linkat(struct io_uring *ring, const char *oldname, const char *newname) +static int do_linkat(struct io_uring *ring, int olddirfd, const char *oldname, + const char *newname, int flags) { - int ret; struct io_uring_sqe *sqe; struct io_uring_cqe *cqe; + int ret; sqe = io_uring_get_sqe(ring); if (!sqe) { fprintf(stderr, "sqe get failed\n"); - goto err; + return 1; } - io_uring_prep_linkat(sqe, AT_FDCWD, oldname, AT_FDCWD, newname, 0); + io_uring_prep_linkat(sqe, olddirfd, oldname, AT_FDCWD, newname, flags); ret = io_uring_submit(ring); if (ret != 1) { fprintf(stderr, "submit failed: %d\n", ret); - goto err; + return 1; } ret = io_uring_wait_cqes(ring, &cqe, 1, 0, 0); if (ret) { fprintf(stderr, "wait_cqe failed: %d\n", ret); - goto err; + return 1; } ret = cqe->res; io_uring_cqe_seen(ring, cqe); return ret; -err: - return 1; } static int files_linked_ok(const char* fn1, const char *fn2) @@ -71,9 +69,11 @@ static int files_linked_ok(const char* fn1, const char *fn2) int main(int argc, char *argv[]) { static const char target[] = "io_uring-linkat-test-target"; + static const char emptyname[] = "io_uring-linkat-test-empty"; static const char linkname[] = "io_uring-linkat-test-link"; - int ret; + static const char symlinkname[] = "io_uring-linkat-test-symlink"; struct io_uring ring; + int ret, fd, exit_status = T_EXIT_FAIL; if (argc > 1) return T_EXIT_SKIP; @@ -84,58 +84,88 @@ int main(int argc, char *argv[]) return ret; } - ret = open(target, O_CREAT | O_RDWR | O_EXCL, 0600); + ret = fd = open(target, O_CREAT | O_RDWR | O_EXCL, 0600); if (ret < 0) { perror("open"); - goto err; + goto out; + } + if (write(fd, "linktest", 8) != 8) { + close(fd); + goto out; } - if (write(ret, "linktest", 8) != 8) { - close(ret); - goto err1; + if(geteuid()) { + fprintf(stdout, "not root, skipping AT_EMPTY_PATH test\n"); + } else { + ret = do_linkat(&ring, fd, "", emptyname, AT_EMPTY_PATH); + if (ret < 0) { + if (ret == -EBADF || ret == -EINVAL) { + fprintf(stdout, "linkat not supported, skipping\n"); + exit_status = T_EXIT_SKIP; + goto out; + } + fprintf(stderr, "linkat: %s\n", strerror(-ret)); + goto out; + } else if (ret) { + goto out; + } + if (!files_linked_ok(emptyname, target)) + goto out; + unlinkat(AT_FDCWD, emptyname, 0); } - close(ret); + close(fd); - ret = do_linkat(&ring, target, linkname); + ret = symlink(target, symlinkname); + if (ret < 0) { + perror("open"); + goto out; + } + + ret = do_linkat(&ring, AT_FDCWD, target, linkname, 0); if (ret < 0) { if (ret == -EBADF || ret == -EINVAL) { fprintf(stdout, "linkat not supported, skipping\n"); - goto skip; + exit_status = T_EXIT_SKIP; + goto out; } fprintf(stderr, "linkat: %s\n", strerror(-ret)); - goto err1; + goto out; } else if (ret) { - goto err1; + goto out; } if (!files_linked_ok(linkname, target)) - goto err2; + goto out; + + unlinkat(AT_FDCWD, linkname, 0); - ret = do_linkat(&ring, target, linkname); + ret = do_linkat(&ring, AT_FDCWD, symlinkname, linkname, AT_SYMLINK_FOLLOW); + if (ret < 0) { + fprintf(stderr, "linkat: %s\n", strerror(-ret)); + goto out; + } else if (ret) { + goto out; + } + + if (!files_linked_ok(symlinkname, target)) + goto out; + + ret = do_linkat(&ring, AT_FDCWD, target, linkname, 0); if (ret != -EEXIST) { fprintf(stderr, "test_linkat linkname already exists failed: %d\n", ret); - goto err2; + goto out; } - ret = do_linkat(&ring, target, "surely/this/does/not/exist"); + ret = do_linkat(&ring, AT_FDCWD, target, "surely/this/does/not/exist", 0); if (ret != -ENOENT) { fprintf(stderr, "test_linkat no parent failed: %d\n", ret); - goto err2; + goto out; } - - unlinkat(AT_FDCWD, linkname, 0); - unlinkat(AT_FDCWD, target, 0); - io_uring_queue_exit(&ring); - return T_EXIT_PASS; -skip: - unlinkat(AT_FDCWD, linkname, 0); - unlinkat(AT_FDCWD, target, 0); - io_uring_queue_exit(&ring); - return T_EXIT_SKIP; -err2: + exit_status = T_EXIT_PASS; +out: + unlinkat(AT_FDCWD, symlinkname, 0); unlinkat(AT_FDCWD, linkname, 0); -err1: + unlinkat(AT_FDCWD, emptyname, 0); unlinkat(AT_FDCWD, target, 0); -err: io_uring_queue_exit(&ring); - return T_EXIT_FAIL; + return exit_status; } |