From: YunQiang Su <yunqiang.su@cipunited.com>
To: libc-alpha@sourceware.org
Cc: chenli@uniontech.com, macro@orcam.me.uk, jiaxun.yang@flygoat.com,
aurelien@aurel32.net, YunQiang Su <yunqiang.su@cipunited.com>
Subject: [PATCH] MIPS: fix y2106 problem on N64 with statx
Date: Fri, 12 Mar 2021 03:49:20 +0000 [thread overview]
Message-ID: <20210312034920.14846-1-yunqiang.su@cipunited.com> (raw)
the stat series syscall of N64 use uint32 as its time.
Glibc converts it to int64 then. For example a file with timestamp -1:
syscall(stat) gets 0xffffffff
Glibc convert it to 0x00000000ffffffff
Then, -1 becomes a time in y2106.
In this patch, we use statx syscall to replace stat-series syscall.
statx always return int64 timestamp, and the `struct stat' in userland
of N64 always has 64bit timestamp. We can convert between them without
any problem.
---
io/tst-fstatat.c | 26 +++++++-
sysdeps/unix/sysv/linux/fstatat64.c | 8 ++-
.../unix/sysv/linux/mips/mips64/n64/fstatat.c | 52 +++++++++++++++
.../unix/sysv/linux/mips/mips64/n64/fxstat.c | 51 +++++++++++++++
.../sysv/linux/mips/mips64/n64/fxstat64.c | 43 +++++++++++++
.../sysv/linux/mips/mips64/n64/fxstatat.c | 63 +++++++++++++++++++
.../sysv/linux/mips/mips64/n64/fxstatat64.c | 53 ++++++++++++++++
.../unix/sysv/linux/mips/mips64/n64/lxstat.c | 51 +++++++++++++++
.../sysv/linux/mips/mips64/n64/lxstat64.c | 43 +++++++++++++
.../unix/sysv/linux/mips/mips64/n64/xstat.c | 51 +++++++++++++++
.../unix/sysv/linux/mips/mips64/n64/xstat64.c | 43 +++++++++++++
11 files changed, 482 insertions(+), 2 deletions(-)
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fstatat.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat64.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat64.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat64.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/xstat.c
create mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/xstat64.c
diff --git a/io/tst-fstatat.c b/io/tst-fstatat.c
index 4766bb2e71..8297b14479 100644
--- a/io/tst-fstatat.c
+++ b/io/tst-fstatat.c
@@ -5,7 +5,7 @@
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
-
+#include <kernel-features.h>
static void prepare (void);
#define PREPARE(argc, argv) prepare ()
@@ -134,6 +134,30 @@ do_test (void)
puts ("stat results do not match");
return 1;
}
+#if defined(__mips64) && (_MIPS_SIM == _ABI64) && defined(__ASSUME_STATX)
+ /* fstatat syscall has y2106 problem on MIPS N64
+ Now we use statx to implement *stat* functions
+ So the problem should have gone */
+ struct timespec tm_1[2] = {{-1, 0}, {-1, 0}};
+ if (utimensat(dir_fd, "some-file", tm_1, 0) != 0)
+ {
+ puts ("utimensat fail");
+ return 1;
+ }
+
+ if (fstatat64 (dir_fd, "some-file", &st2, 0) != 0)
+ {
+ puts ("fstatat64 failed");
+ return 1;
+ }
+
+ if (st2.st_mtim.tv_sec != -1
+ || st2.st_atim.tv_sec != -1)
+ {
+ puts ("fstatat64 has y2106 problem?");
+ return 1;
+ }
+#endif
if (unlinkat (dir_fd, "some-file", 0) != 0)
{
diff --git a/sysdeps/unix/sysv/linux/fstatat64.c b/sysdeps/unix/sysv/linux/fstatat64.c
index 490226a8ec..220321be9c 100644
--- a/sysdeps/unix/sysv/linux/fstatat64.c
+++ b/sysdeps/unix/sysv/linux/fstatat64.c
@@ -47,15 +47,21 @@ __fstatat64_time64 (int fd, const char *file, struct __stat64_t64 *buf,
int r;
#if (__WORDSIZE == 32 \
- && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32))
+ && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \
+ || defined(__mips64)
/* 32-bit kABI with default 64-bit time_t, e.g. arc, riscv32. Also
64-bit time_t support is done through statx syscall. */
+ /* Also use statx syscall for MIPS N64, since newfstatat has y2106 problem */
struct statx tmp;
r = INTERNAL_SYSCALL_CALL (statx, fd, file, AT_NO_AUTOMOUNT | flag,
STATX_BASIC_STATS, &tmp);
if (r == 0)
{
+#if defined(__mips64) && (_MIPS_SIM == _ABI64)
+ __cp_stat64_statx (buf, &tmp);
+#else
__cp_stat64_t64_statx (buf, &tmp);
+#endif
return 0;
}
if (-r != ENOSYS)
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatat.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatat.c
new file mode 100644
index 0000000000..5000cd0715
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatat.c
@@ -0,0 +1,52 @@
+/* Copyright (C) 2005-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+/* Ho hum, since fxstatat == fxstatat64 we must get rid of the
+ prototype or gcc will complain since they don't strictly match. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <kernel_stat.h>
+#include <statx_cp.h>
+
+
+/* Get information about the file NAME relative to FD in ST. */
+int
+__fstatat (int fd, const char *file, struct stat *st, int flag)
+{
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, fd, file, flag&AT_SYMLINK_NOFOLLOW,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx((struct stat64 *)st, &xbuf);
+ return r;
+}
+
+weak_alias (__fstatat, fstatat)
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/fstatat.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat.c
new file mode 100644
index 0000000000..acd929dfaa
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat.c
@@ -0,0 +1,51 @@
+/* fxstat using old-style Unix stat system call.
+ Copyright (C) 1991-2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <kernel_stat.h>
+#include <sysdep.h>
+#include <statx_cp.h>
+
+/* Get information about the file NAME in BUF. */
+int
+__fxstat (int vers, int fd, struct stat *buf)
+{
+ switch (vers)
+ {
+ case _STAT_VER_KERNEL:
+ return INLINE_SYSCALL_CALL (fstat, fd, buf);
+
+ default:
+ {
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, fd, "", AT_EMPTY_PATH,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx((struct stat64 *)buf, &xbuf);
+ return r;
+ }
+ }
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/fxstat.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat64.c
new file mode 100644
index 0000000000..a8da108347
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstat64.c
@@ -0,0 +1,43 @@
+/* fxstat64 using 64-bit MIPS fstat system call.
+ Copyright (C) 1997-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <kernel_stat.h>
+#include <sysdep.h>
+#include <statx_cp.h>
+
+/* Get information about the file FD in BUF. */
+
+int
+__fxstat64 (int vers, int fd, struct stat64 *buf)
+{
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, fd, "", AT_EMPTY_PATH,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx(buf, &xbuf);
+ return r;
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/mips64/fxstat64.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat.c
new file mode 100644
index 0000000000..935888efe6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat.c
@@ -0,0 +1,63 @@
+/* Copyright (C) 2005-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+/* Ho hum, since fxstatat == fxstatat64 we must get rid of the
+ prototype or gcc will complain since they don't strictly match. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <kernel_stat.h>
+#include <statx_cp.h>
+
+
+/* Get information about the file NAME relative to FD in ST. */
+int
+__fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
+{
+ switch (vers)
+ {
+ case _STAT_VER_KERNEL:
+ return INLINE_SYSCALL (newfstatat, 4, fd, file, st, flag);
+
+ case _STAT_VER_LINUX:
+ {
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, fd, file, flag&AT_SYMLINK_NOFOLLOW,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx((struct stat64 *)st, &xbuf);
+ return r;
+ }
+
+ default:
+ __set_errno (EINVAL);
+ return -1;
+ }
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/mips64/fxstatat.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat64.c
new file mode 100644
index 0000000000..80bd0f1d09
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/fxstatat64.c
@@ -0,0 +1,53 @@
+/* Copyright (C) 2005-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <kernel_stat.h>
+
+#include <sysdep.h>
+#include <statx_cp.h>
+
+/* Get information about the file NAME in BUF. */
+
+int
+__fxstatat64 (int vers, int fd, const char *file, struct stat64 *st, int flag)
+{
+ if (__builtin_expect (vers != _STAT_VER_LINUX, 0))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, fd, file, flag&AT_SYMLINK_NOFOLLOW,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx(st, &xbuf);
+ return r;
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/mips64/fxstatat64.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat.c
new file mode 100644
index 0000000000..f9c28b753b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat.c
@@ -0,0 +1,51 @@
+/* lxstat using old-style Unix stat system call.
+ Copyright (C) 1991-2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <kernel_stat.h>
+#include <sysdep.h>
+#include <statx_cp.h>
+
+/* Get information about the file NAME in BUF. */
+int
+__lxstat (int vers, const char *name, struct stat *buf)
+{
+ switch (vers)
+ {
+ case _STAT_VER_KERNEL:
+ return INLINE_SYSCALL_CALL (lstat, name, buf);
+
+ default:
+ {
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, AT_SYMLINK_NOFOLLOW,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx((struct stat64 *)buf, &xbuf);
+ return r;
+ }
+ }
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/lxstat.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat64.c
new file mode 100644
index 0000000000..927c542ca7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/lxstat64.c
@@ -0,0 +1,43 @@
+/* lxstat64 using 64-bit MIPS lstat system call.
+ Copyright (C) 1997-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <kernel_stat.h>
+#include <sysdep.h>
+#include <statx_cp.h>
+
+/* Get information about the file NAME in BUF. */
+int
+__lxstat64 (int vers, const char *name, struct stat64 *buf)
+{
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, AT_SYMLINK_NOFOLLOW,
+ STATX_BASIC_STATS, &xbuf);
+ // cast to struct stat from struct stat64 is OK for N64.
+ if (r == 0)
+ __cp_stat64_statx(buf, &xbuf);
+ return r;
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/mips64/lxstat64.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/xstat.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/xstat.c
new file mode 100644
index 0000000000..6c735e5365
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/xstat.c
@@ -0,0 +1,51 @@
+/* xstat using old-style Unix stat system call.
+ Copyright (C) 1991-2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <kernel_stat.h>
+#include <sysdep.h>
+#include <statx_cp.h>
+
+/* Get information about the file NAME in BUF. */
+int
+__xstat (int vers, const char *name, struct stat *buf)
+{
+ switch (vers)
+ {
+ case _STAT_VER_KERNEL:
+ return INLINE_SYSCALL_CALL (stat, name, buf);
+
+ default:
+ {
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, 0,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx((struct stat64 *)buf, &xbuf);
+ return r;
+ }
+ }
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/xstat.c>
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/xstat64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/xstat64.c
new file mode 100644
index 0000000000..84db1b7a85
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/xstat64.c
@@ -0,0 +1,43 @@
+/* xstat64 using 64-bit MIPS stat system call.
+ Copyright (C) 1991-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <kernel-features.h>
+#include <sys/syscall.h>
+#if defined(__ASSUME_STATX) && defined(__NR_statx)
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <kernel_stat.h>
+#include <sysdep.h>
+#include <statx_cp.h>
+
+/* Get information about the file NAME in BUF. */
+
+int
+__xstat64 (int vers, const char *name, struct stat64 *buf)
+{
+ struct statx xbuf;
+ int r = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, 0,
+ STATX_BASIC_STATS, &xbuf);
+ if (r == 0)
+ __cp_stat64_statx(buf, &xbuf);
+ return r;
+}
+
+#else /* __ASSUME_STATX && __NR_statx */
+#include <sysdeps/unix/sysv/linux/mips/mips64/xstat64.c>
+#endif
--
2.30.2
next reply other threads:[~2021-03-12 3:49 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-12 3:49 YunQiang Su [this message]
2021-03-12 12:34 ` Adhemerval Zanella
2021-03-17 7:25 ` 回复: " yunqiang.su
2021-03-17 11:27 ` Adhemerval Zanella
2021-03-18 6:05 ` 回复: " yunqiang.su
2021-03-18 12:17 ` Adhemerval Zanella
2021-03-19 1:00 ` 回复: " yunqiang.su
2021-03-17 22:28 ` Maciej W. Rozycki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210312034920.14846-1-yunqiang.su@cipunited.com \
--to=yunqiang.su@cipunited.com \
--cc=aurelien@aurel32.net \
--cc=chenli@uniontech.com \
--cc=jiaxun.yang@flygoat.com \
--cc=libc-alpha@sourceware.org \
--cc=macro@orcam.me.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).