aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/liburing/test/hardlink.c
diff options
context:
space:
mode:
authorthegeorg <thegeorg@yandex-team.com>2024-06-09 11:55:21 +0300
committerthegeorg <thegeorg@yandex-team.com>2024-06-09 12:07:55 +0300
commitafd4899380eea1c70e2a68714b5da1c9919ccdbd (patch)
treecd5120708784139bc6a0f8881da1ed8389a065b3 /contrib/libs/liburing/test/hardlink.c
parenta83bd2dd3c21e38c6c0807ec5e679497ab567f24 (diff)
downloadydb-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.c108
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;
}