| From 4e41a05de1f34ba00a68ca4f20fb49c4d1cbd2d0 Mon Sep 17 00:00:00 2001 |
| From: Richard Purdie <richard.purdie@linuxfoundation.org> |
| Date: Wed, 6 Nov 2019 12:17:46 +0000 |
| Subject: [PATCH] Add statx glibc/syscall support |
| |
| Modern distros (e.g. fedora30) are starting to use the new statx() syscall through |
| the newly exposed glibc wrapper function in software like coreutils (e.g. the ls |
| command). Add support to intercept this to pseudo. |
| |
| Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> |
| Upstream-Status: Submitted [Emailed to seebs] |
| --- |
| ports/linux/guts/statx.c | 48 ++++++++++++++++++++++++++++++++++++++++ |
| ports/linux/portdefs.h | 1 + |
| ports/linux/wrapfuncs.in | 1 + |
| 3 files changed, 50 insertions(+) |
| create mode 100644 ports/linux/guts/statx.c |
| |
| diff --git a/ports/linux/statx/guts/statx.c b/ports/linux/statx/guts/statx.c |
| new file mode 100644 |
| index 0000000..a3259c4 |
| --- /dev/null |
| +++ b/ports/linux/statx/guts/statx.c |
| @@ -0,0 +1,42 @@ |
| +/* |
| + * Copyright (c) 2019 Linux Foundation |
| + * Author: Richard Purdie |
| + * |
| + * SPDX-License-Identifier: LGPL-2.1-only |
| + * |
| + * int |
| + * statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf) { |
| + * int rc = -1; |
| + */ |
| + pseudo_msg_t *msg; |
| + PSEUDO_STATBUF buf; |
| + int save_errno; |
| + |
| + rc = real_statx(dirfd, pathname, flags, mask, statxbuf); |
| + save_errno = errno; |
| + if (rc == -1) { |
| + return rc; |
| + } |
| + |
| + buf.st_uid = statxbuf->stx_uid; |
| + buf.st_gid = statxbuf->stx_gid; |
| + buf.st_dev = makedev(statxbuf->stx_dev_major, statxbuf->stx_dev_minor); |
| + buf.st_ino = statxbuf->stx_ino; |
| + buf.st_mode = statxbuf->stx_mode; |
| + buf.st_rdev = makedev(statxbuf->stx_rdev_major, statxbuf->stx_rdev_minor); |
| + buf.st_nlink = statxbuf->stx_nlink; |
| + msg = pseudo_client_op(OP_STAT, 0, -1, dirfd, pathname, &buf); |
| + if (msg && msg->result == RESULT_SUCCEED) { |
| + pseudo_debug(PDBGF_FILE, "statx(path %s), flags %o, stat rc %d, stat uid %o\n", pathname, flags, rc, statxbuf->stx_uid); |
| + statxbuf->stx_uid = msg->uid; |
| + statxbuf->stx_gid = msg->gid; |
| + statxbuf->stx_mode = msg->mode; |
| + statxbuf->stx_rdev_major = major(msg->rdev); |
| + statxbuf->stx_rdev_minor = minor(msg->rdev); |
| + } else { |
| + pseudo_debug(PDBGF_FILE, "statx(path %s) failed, flags %o, stat rc %d, stat uid %o\n", pathname, flags, rc, statxbuf->stx_uid); |
| + } |
| + errno = save_errno; |
| +/* return rc; |
| + * } |
| + */ |
| diff --git a/ports/linux/statx/portdefs.h b/ports/linux/statx/portdefs.h |
| new file mode 100644 |
| index 0000000..bf934dc |
| --- /dev/null |
| +++ b/ports/linux/statx/portdefs.h |
| @@ -0,0 +1,6 @@ |
| +/* |
| + * SPDX-License-Identifier: LGPL-2.1-only |
| + * |
| + */ |
| +#include <sys/stat.h> |
| +#include <sys/sysmacros.h> |
| diff --git a/ports/linux/statx/wrapfuncs.in b/ports/linux/statx/wrapfuncs.in |
| new file mode 100644 |
| index 0000000..c9cd4c3 |
| --- /dev/null |
| +++ b/ports/linux/statx/wrapfuncs.in |
| @@ -0,0 +1 @@ |
| +int statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf); |
| diff --git a/ports/linux/subports b/ports/linux/subports |
| index a29044a..49081bf 100755 |
| --- a/ports/linux/subports |
| +++ b/ports/linux/subports |
| @@ -54,3 +54,13 @@ else |
| fi |
| rm -f dummy.c dummy.o |
| |
| +cat > dummy.c <<EOF |
| +#define _GNU_SOURCE |
| +#include <sys/stat.h> |
| +struct statx x; |
| +EOF |
| +if ${CC} -c -o dummy.o dummy.c >/dev/null 2>&1; then |
| + echo "linux/statx" |
| +fi |
| +rm -f dummy.c dummy.o |
| + |
| -- |
| 2.17.1 |
| |