Signed-off-by: Mark Salter <msal...@redhat.com>
---
 ldso/include/dl-syscall.h             |   15 ++++++++++++++-
 libc/sysdeps/linux/common/fstatfs.c   |   25 +++++++++++++++++++++++++
 libc/sysdeps/linux/common/ftruncate.c |    7 +++++++
 libc/sysdeps/linux/common/stat.c      |    7 ++++++-
 libc/sysdeps/linux/common/statfs.c    |   25 +++++++++++++++++++++++++
 libc/sysdeps/linux/common/truncate.c  |    7 +++++++
 6 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/ldso/include/dl-syscall.h b/ldso/include/dl-syscall.h
index 547dad1..4c8aeaf 100644
--- a/ldso/include/dl-syscall.h
+++ b/ldso/include/dl-syscall.h
@@ -23,7 +23,7 @@ extern int _dl_errno;
 /* Pull in whatever this particular arch's kernel thinks the kernel version of
  * struct stat should look like.  It turns out that each arch has a different
  * opinion on the subject, and different kernel revs use different names... */
-#if defined(__sparc_v9__) && (__WORDSIZE == 64)
+#if !defined(__NR_stat) || (defined(__sparc_v9__) && (__WORDSIZE == 64))
 #define kernel_stat64 stat
 #else
 #define kernel_stat stat
@@ -35,6 +35,7 @@ extern int _dl_errno;
 #define        S_ISUID         04000   /* Set user ID on execution.  */
 #define        S_ISGID         02000   /* Set group ID on execution.  */
 
+#define AT_FDCWD       -100
 
 /* Here are the definitions for some syscalls that are used
    by the dynamic linker.  The idea is that we want to be able
@@ -64,11 +65,23 @@ static __always_inline _syscall3(unsigned long, _dl_read, 
int, fd,
 static __always_inline _syscall3(int, _dl_mprotect, const void *, addr,
                         unsigned long, len, int, prot)
 
+#if defined(__NR_stat)
 #define __NR__dl_stat __NR_stat
 static __always_inline _syscall2(int, _dl_stat, const char *, file_name,
                         struct stat *, buf)
+#elif defined(__NR_fstatat64)
+static __always_inline int
+_dl_stat(const char *fn, struct stat *stat)
+{
+       return INLINE_SYSCALL(fstatat64, 4, AT_FDCWD, fn, stat, 0);
+}
+#endif
 
+#if defined(__NR_fstat)
 #define __NR__dl_fstat __NR_fstat
+#elif defined(__NR_fstat64)
+#define __NR__dl_fstat __NR_fstat64
+#endif
 static __always_inline _syscall2(int, _dl_fstat, int, fd, struct stat *, buf)
 
 #define __NR__dl_munmap __NR_munmap
diff --git a/libc/sysdeps/linux/common/fstatfs.c 
b/libc/sysdeps/linux/common/fstatfs.c
index fa0024a..3c8c53e 100644
--- a/libc/sysdeps/linux/common/fstatfs.c
+++ b/libc/sysdeps/linux/common/fstatfs.c
@@ -22,9 +22,34 @@ extern int __REDIRECT_NTH (fstatfs, (int __fildes, struct 
statfs *__buf),
 # endif
 #endif
 
+#ifdef __NR_fstatfs
 extern __typeof(fstatfs) __libc_fstatfs attribute_hidden;
 #define __NR___libc_fstatfs __NR_fstatfs
 _syscall2(int, __libc_fstatfs, int, fd, struct statfs *, buf)
+#elif defined __NR_fstatfs64
+int __libc_fstatfs(int fd, struct statfs *buf)
+{
+       struct statfs64 st;
+       int err;
+
+       err = INLINE_SYSCALL(fstatfs64, 3, fd, sizeof(st), &st);
+       if (err)
+               return err;
+
+       buf->f_type = st.f_type;
+       buf->f_bsize = st.f_bsize;
+       buf->f_blocks = st.f_blocks;
+       buf->f_bfree = st.f_bfree;
+       buf->f_bavail = st.f_bavail;
+       buf->f_files = st.f_files;
+       buf->f_ffree = st.f_ffree;
+       buf->f_fsid = st.f_fsid;
+       buf->f_namelen = st.f_namelen;
+       buf->f_frsize = st.f_frsize;
+
+       return 0;
+}
+#endif
 
 #if defined __UCLIBC_LINUX_SPECIFIC__
 weak_alias(__libc_fstatfs,fstatfs)
diff --git a/libc/sysdeps/linux/common/ftruncate.c 
b/libc/sysdeps/linux/common/ftruncate.c
index 3bdef3f..a2bb016 100644
--- a/libc/sysdeps/linux/common/ftruncate.c
+++ b/libc/sysdeps/linux/common/ftruncate.c
@@ -11,5 +11,12 @@
 #include <unistd.h>
 
 
+#ifdef __NR_ftruncate
 _syscall2(int, ftruncate, int, fd, __off_t, length)
+#elif defined __NR_truncate64
+int ftruncate(int fd, __off_t length)
+{
+       return ftruncate64(fd, length);
+}
+#endif
 libc_hidden_def(ftruncate)
diff --git a/libc/sysdeps/linux/common/stat.c b/libc/sysdeps/linux/common/stat.c
index 829f35a..8e0e9f5 100644
--- a/libc/sysdeps/linux/common/stat.c
+++ b/libc/sysdeps/linux/common/stat.c
@@ -9,6 +9,7 @@
 
 #include <sys/syscall.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include <sys/stat.h>
 #include "xstatconv.h"
 
@@ -17,14 +18,18 @@
 int stat(const char *file_name, struct stat *buf)
 {
        int result;
-#ifdef __NR_stat64
+#if defined __NR_stat64 || defined __NR_fstatat64
        /* normal stat call has limited values for various stat elements
         * e.g. uid device major/minor etc.
         * so we use 64 variant if available
         * in order to get newer versions of stat elements
         */
        struct kernel_stat64 kbuf;
+#ifdef __NR_stat64
        result = INLINE_SYSCALL(stat64, 2, file_name, &kbuf);
+#else
+       result = INLINE_SYSCALL(fstatat64, 4, AT_FDCWD, file_name, &kbuf, 0);
+#endif
        if (result == 0) {
                __xstat32_conv(&kbuf, buf);
        }
diff --git a/libc/sysdeps/linux/common/statfs.c 
b/libc/sysdeps/linux/common/statfs.c
index d24bc9d..9def2f5 100644
--- a/libc/sysdeps/linux/common/statfs.c
+++ b/libc/sysdeps/linux/common/statfs.c
@@ -12,9 +12,34 @@
 #include <sys/param.h>
 #include <sys/vfs.h>
 
+#if defined __NR_statfs
 extern __typeof(statfs) __libc_statfs attribute_hidden;
 #define __NR___libc_statfs __NR_statfs
 _syscall2(int, __libc_statfs, const char *, path, struct statfs *, buf)
+#elif defined __NR_statfs64
+int __libc_statfs(const char *path, struct statfs *buf)
+{
+       struct statfs64 st;
+       int err;
+
+       err = INLINE_SYSCALL(statfs64, 3, path, sizeof(st), &st);
+       if (err)
+               return err;
+
+       buf->f_type = st.f_type;
+       buf->f_bsize = st.f_bsize;
+       buf->f_blocks = st.f_blocks;
+       buf->f_bfree = st.f_bfree;
+       buf->f_bavail = st.f_bavail;
+       buf->f_files = st.f_files;
+       buf->f_ffree = st.f_ffree;
+       buf->f_fsid = st.f_fsid;
+       buf->f_namelen = st.f_namelen;
+       buf->f_frsize = st.f_frsize;
+
+       return 0;
+}
+#endif
 
 #if defined __UCLIBC_LINUX_SPECIFIC__ || defined __UCLIBC_HAS_THREADS_NATIVE__
 /* statfs is used by NPTL, so it must exported in case */
diff --git a/libc/sysdeps/linux/common/truncate.c 
b/libc/sysdeps/linux/common/truncate.c
index 2331bdd..596acb7 100644
--- a/libc/sysdeps/linux/common/truncate.c
+++ b/libc/sysdeps/linux/common/truncate.c
@@ -11,5 +11,12 @@
 #include <unistd.h>
 
 
+#ifdef __NR_truncate
 _syscall2(int, truncate, const char *, path, __off_t, length)
+#elif defined(__NR_truncate64)
+int truncate(const char *path, __off_t length)
+{
+       return truncate64(path, length);
+}
+#endif
 libc_hidden_def(truncate)
-- 
1.7.9.1

_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to