Changes stat interface
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 9 Aug 2010 22:46:53 +0000 (15:46 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:50 +0000 (17:35 -0700)
Rebuild your cross compiler.

struct stat and stat64 are the same (sizes and all), and the kernel
knows about the right sizes.  This also changes the glibc wrappers
around the stat family to not do the buffer conversion that we used to
do with the appserver.

13 files changed:
kern/include/ros/fs.h [new file with mode: 0644]
kern/include/ros/stat.h [deleted file]
kern/include/sys/types.h
kern/include/vfs.h
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/bits/stat.h
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/bits/typesizes.h [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/fxstat.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/fxstat64.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/lxstat.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/lxstat64.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/ros_stat.h [deleted file]
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/xstat.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/xstat64.c

diff --git a/kern/include/ros/fs.h b/kern/include/ros/fs.h
new file mode 100644 (file)
index 0000000..5abe81f
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef _ROS_INC_STAT_H
+#define _ROS_INC_STAT_H
+
+#include <sys/types.h>
+#include <timing.h>
+
+#define MAX_FILENAME_SZ 255
+/* This will change once we have a decent readdir / getdents syscall, and
+ * send the strlen along with the d_name.  The sizes need rechecked too, since
+ * they are probably wrong. */
+struct kdirent {
+       ino_t                                   d_ino;       /* inode number */
+       off_t                                   d_off;       /* offset to the next dirent */
+       unsigned short                          d_reclen;    /* length of this record */
+       char                                    d_name[MAX_FILENAME_SZ + 1]; /* filename */
+};
+
+/* These stat sizes should match the types in stat.h and types.h and the sizes
+ * in typesizes in glibc (which we modified slightly).  While glibc has it's own
+ * stat, we have this here so that the kernel is exporting the interface it
+ * expects.  We #def stat for our own internal use at the end. */
+struct kstat {
+       __dev_t                                         st_dev;         /* Device.  */
+       __ino64_t                                       st_ino;         /* File serial number.  */
+       __mode_t                                        st_mode;        /* File mode.  */
+       __nlink_t                                       st_nlink;       /* Link count.  */
+       __uid_t                                         st_uid;         /* User ID of the file's owner. */
+       __gid_t                                         st_gid;         /* Group ID of the file's group.*/
+       __dev_t                                         st_rdev;        /* Device number, if device.  */
+       __off64_t                                       st_size;        /* Size of file, in bytes.  */
+       __blksize_t                                     st_blksize;     /* Optimal block size for I/O.  */
+       __blkcnt64_t                            st_blocks;      /* Number 512-byte blocks allocated. */
+       struct timespec                         st_atime;       /* Time of last access.  */
+       struct timespec                         st_mtime;       /* Time of last modification.  */
+       struct timespec                         st_ctime;       /* Time of last status change.  */
+};
+
+#ifdef ROS_KERNEL
+#define stat kstat
+#define dirent kdirent 
+#endif
+
+#endif /* _ROS_INC_STAT_H */
diff --git a/kern/include/ros/stat.h b/kern/include/ros/stat.h
deleted file mode 100644 (file)
index 22ea700..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _ROS_STAT_H
-#define _ROS_STAT_H
-
-// This matches the stat structure used by the RAMP appserver.
-#include <stdint.h>
-
-struct ros_stat
-{
-   int16_t st_dev;
-  uint32_t st_ino;
-  uint16_t st_mode;
-  uint16_t st_nlink;
-  uint16_t st_uid;
-  uint16_t st_gid;
-   int16_t st_rdev;
-   int32_t st_size;
-   int32_t st_atime;
-   int32_t st_spare1;
-   int32_t st_mtime;
-   int32_t st_spare2;
-   int32_t st_ctime;
-   int32_t st_spare3;
-   int32_t st_blksize;
-   int32_t st_blocks;
-   int32_t st_spare4[2];
-};
-
-#endif
index 44fd3db..5c6d19e 100644 (file)
@@ -1,5 +1,20 @@
-/* GHETTO: To our grandchildren, we are sorry for this
- * We do this since newlib has it's own stdint that conflicts with the kernel
- * and roslib's types. */
+/* This exists so we can conveniently call for sys/types.h in headers shared by
+ * both the kernel and userspace.  This is the kernel's version. */
 
+#ifndef _ROS_SYS_TYPES_H
+#define _ROS_SYS_TYPES_H
+
+#include <ros/common.h>
 #include <arch/types.h>
+
+typedef uint64_t __dev_t;
+typedef uint64_t __ino64_t;
+typedef uint32_t __mode_t;
+typedef uint32_t __nlink_t;
+typedef uint32_t __uid_t;
+typedef uint32_t __gid_t;
+typedef int64_t __off64_t;
+typedef int32_t __blksize_t;
+typedef int64_t __blkcnt64_t;
+
+#endif /* _ROS_SYS_TYPES_H */
index 41284be..da83841 100644 (file)
@@ -33,7 +33,9 @@ struct block_device   {int x;};
 struct io_writeback    {int x;};
 struct event_poll {int x;};
 struct poll_table_struct {int x;};
-// end temp typedefs
+// end temp typedefs.  note ino and off_t are needed in the next include
+
+#include <ros/fs.h>
 
 struct page_map;       /* analagous to linux's address_space object */
 struct page_map_operations;
@@ -48,16 +50,6 @@ struct file_operations;
 struct fs_type;
 struct vfsmount;
 
-/* part of the kernel interface, ripped from man pages, ought to work. */
-// TODO: eventually move this to ros/fs.h or something.
-#define MAX_FILENAME_SZ 255
-struct dirent { // or maybe something else to not conflict with userspace
-       ino_t          d_ino;       /* inode number */
-       off_t          d_off;       /* offset to the next dirent */
-       unsigned short d_reclen;    /* length of this record */
-       char           d_name[MAX_FILENAME_SZ + 1]; /* filename */
-};
-
 struct iovec {
     void *iov_base;
     size_t iov_len;
@@ -73,7 +65,7 @@ TAILQ_HEAD(file_tailq, file);
 TAILQ_HEAD(io_wb_tailq, io_writeback);
 TAILQ_HEAD(event_poll_tailq, event_poll);
 TAILQ_HEAD(vfsmount_tailq, vfsmount);
-TAILQ_HEAD(fs_type_tailq, fs_type);
+TAILQ_HEAD(fs_type_tailq, fs_type); 
 
 /* Linux's quickstring - saves recomputing the hash and length.  Note the length
  * is the non-null-terminated length, as you'd get from strlen(). (for now) */
@@ -390,6 +382,7 @@ struct vfsmount {
 /* Per-process structs */
 #define NR_OPEN_FILES_DEFAULT 32
 #define NR_FILE_DESC_DEFAULT 32
+/* keep this in sync with glibc's fd_setsize */
 #define NR_FILE_DESC_MAX 1024
 
 /* Bitmask for file descriptors, big for when we exceed the initial small.  We
index 5b285fd..97ac6f5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1996, 1997, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995-2001, 2002, 2009 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
 # error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
 #endif
 
-/* This structure needs to be defined in accordance with the
-   implementation of __stat, __fstat, and __lstat.  */
-
-#include <bits/types.h>
-
-/* Structure describing file characteristics.  */
 struct stat
   {
-    /* These are the members that POSIX.1 requires.  */
-
-    __mode_t st_mode;          /* File mode.  */
-#ifndef __USE_FILE_OFFSET64
-    __ino_t st_ino;            /* File serial number.  */
+    __dev_t st_dev;                    /* Device.  */
+    __ino64_t st_ino;                  /* File serial number.  */
+    __mode_t st_mode;                  /* File mode.  */
+    __nlink_t st_nlink;                        /* Link count.  */
+    __uid_t st_uid;                    /* User ID of the file's owner. */
+    __gid_t st_gid;                    /* Group ID of the file's group.*/
+    __dev_t st_rdev;                   /* Device number, if device.  */
+    __off64_t st_size;                 /* Size of file, in bytes.  */
+    __blksize_t st_blksize;            /* Optimal block size for I/O.  */
+    __blkcnt64_t st_blocks;            /* Number 512-byte blocks allocated. */
+#ifdef __USE_MISC
+    /* Nanosecond resolution timestamps are stored in a format
+       equivalent to 'struct timespec'.  This is the type used
+       whenever possible but the Unix namespace rules do not allow the
+       identifier 'timespec' to appear in the <sys/stat.h> header.
+       Therefore we have to handle the use of this header in strictly
+       standard-compliant sources special.  */
+    struct timespec st_atim;           /* Time of last access.  */
+    struct timespec st_mtim;           /* Time of last modification.  */
+    struct timespec st_ctim;           /* Time of last status change.  */
+# define st_atime st_atim.tv_sec       /* Backward compatibility.  */
+# define st_mtime st_mtim.tv_sec
+# define st_ctime st_ctim.tv_sec
 #else
-    __ino64_t st_ino;          /* File serial number.  */
+    __time_t st_atime;                 /* Time of last access.  */
+    unsigned long int st_atimensec;    /* Nscecs of last access.  */
+    __time_t st_mtime;                 /* Time of last modification.  */
+    unsigned long int st_mtimensec;    /* Nsecs of last modification.  */
+    __time_t st_ctime;                 /* Time of last status change.  */
+    unsigned long int st_ctimensec;    /* Nsecs of last status change.  */
 #endif
-    __dev_t st_dev;            /* Device containing the file.  */
-    __nlink_t st_nlink;                /* Link count.  */
+  };
 
-    __uid_t st_uid;            /* User ID of the file's owner.  */
-    __gid_t st_gid;            /* Group ID of the file's group.  */
-#ifndef __USE_FILE_OFFSET64
-    __off_t st_size;           /* Size of file, in bytes.  */
+#ifdef __USE_LARGEFILE64
+struct stat64
+  {
+    __dev_t st_dev;                    /* Device.  */
+    __ino64_t st_ino;                  /* File serial number.          */
+    __mode_t st_mode;                  /* File mode.  */
+    __nlink_t st_nlink;                        /* Link count.  */
+    __uid_t st_uid;                    /* User ID of the file's owner. */
+    __gid_t st_gid;                    /* Group ID of the file's group.*/
+    __dev_t st_rdev;                   /* Device number, if device.  */
+    __off64_t st_size;                 /* Size of file, in bytes.  */
+    __blksize_t st_blksize;            /* Optimal block size for I/O.  */
+    __blkcnt64_t st_blocks;            /* Number 512-byte blocks allocated. */
+#ifdef __USE_MISC
+    /* Nanosecond resolution timestamps are stored in a format
+       equivalent to 'struct timespec'.  This is the type used
+       whenever possible but the Unix namespace rules do not allow the
+       identifier 'timespec' to appear in the <sys/stat.h> header.
+       Therefore we have to handle the use of this header in strictly
+       standard-compliant sources special.  */
+    struct timespec st_atim;           /* Time of last access.  */
+    struct timespec st_mtim;           /* Time of last modification.  */
+    struct timespec st_ctim;           /* Time of last status change.  */
 #else
-    __off64_t st_size;         /* Size of file, in bytes.  */
+    __time_t st_atime;                 /* Time of last access.  */
+    unsigned long int st_atimensec;    /* Nscecs of last access.  */
+    __time_t st_mtime;                 /* Time of last modification.  */
+    unsigned long int st_mtimensec;    /* Nsecs of last modification.  */
+    __time_t st_ctime;                 /* Time of last status change.  */
+    unsigned long int st_ctimensec;    /* Nsecs of last status change.  */
 #endif
-
-    __time_t st_atime;         /* Time of last access.  */
-    __time_t st_mtime;         /* Time of last modification.  */
-    __time_t st_ctime;         /* Time of last status change.  */
-
-    /* This should be defined if there is a `st_blksize' member.  */
-#undef _STATBUF_ST_BLKSIZE
   };
+#endif
+
+/* Tell code we have these members.  */
+#define        _STATBUF_ST_BLKSIZE
+#define _STATBUF_ST_RDEV
+/* Nanosecond resolution time values are supported.  */
+#define _STATBUF_ST_NSEC
 
-/* Encoding of the file mode.  These are the standard Unix values,
-   but POSIX.1 does not specify what values should be used.  */
+/* Encoding of the file mode.  */
 
 #define        __S_IFMT        0170000 /* These bits determine file type.  */
 
@@ -66,35 +105,25 @@ struct stat
 #define        __S_IFBLK       0060000 /* Block device.  */
 #define        __S_IFREG       0100000 /* Regular file.  */
 #define        __S_IFIFO       0010000 /* FIFO.  */
+#define        __S_IFLNK       0120000 /* Symbolic link.  */
+#define        __S_IFSOCK      0140000 /* Socket.  */
 
-/* POSIX.1b objects.  */
-#define __S_TYPEISMQ(buf) 0
-#define __S_TYPEISSEM(buf) 0
-#define __S_TYPEISSHM(buf) 0
+/* POSIX.1b objects.  Note that these macros always evaluate to zero.  But
+   they do it by enforcing the correct use of the macros.  */
+#define __S_TYPEISMQ(buf)  ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSEM(buf) ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSHM(buf) ((buf)->st_mode - (buf)->st_mode)
 
 /* Protection bits.  */
 
 #define        __S_ISUID       04000   /* Set user ID on execution.  */
 #define        __S_ISGID       02000   /* Set group ID on execution.  */
-#define        __S_ISVTX       01000   /* wtf? */
+#define        __S_ISVTX       01000   /* Save swapped text after use (sticky).  */
 #define        __S_IREAD       0400    /* Read by owner.  */
 #define        __S_IWRITE      0200    /* Write by owner.  */
 #define        __S_IEXEC       0100    /* Execute by owner.  */
 
-#ifdef __USE_LARGEFILE64
-struct stat64
-  {
-    __mode_t st_mode;          /* File mode.  */
-    __ino64_t st_ino;          /* File serial number.  */
-    __dev_t st_dev;            /* Device.  */
-    __nlink_t st_nlink;                /* Link count.  */
-
-    __uid_t st_uid;            /* User ID of the file's owner. */
-    __gid_t st_gid;            /* Group ID of the file's group.*/
-    __off64_t st_size;         /* Size of file, in bytes.  */
-
-    __time_t st_atime;         /* Time of last access.  */
-    __time_t st_mtime;         /* Time of last modification.  */
-    __time_t st_ctime;         /* Time of last status change.  */
-  };
+#ifdef __USE_ATFILE
+# define UTIME_NOW     ((1l << 30) - 1l)
+# define UTIME_OMIT    ((1l << 30) - 2l)
 #endif
diff --git a/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/bits/typesizes.h b/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/bits/typesizes.h
new file mode 100644 (file)
index 0000000..79bb91e
--- /dev/null
@@ -0,0 +1,66 @@
+/* bits/typesizes.h -- underlying types for *_t.  Generic version.
+   Copyright (C) 2002, 2003 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _BITS_TYPES_H
+# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
+#endif
+
+#ifndef        _BITS_TYPESIZES_H
+#define        _BITS_TYPESIZES_H       1
+
+/* See <bits/types.h> for the meaning of these macros.  This file exists so
+   that <bits/types.h> need not vary across different GNU platforms.  */
+
+#define __DEV_T_TYPE           __UQUAD_TYPE
+#define __UID_T_TYPE           __U32_TYPE
+#define __GID_T_TYPE           __U32_TYPE
+#define __INO_T_TYPE           __ULONGWORD_TYPE
+#define __INO64_T_TYPE         __UQUAD_TYPE
+#define __MODE_T_TYPE          __U32_TYPE
+#define __NLINK_T_TYPE         __U32_TYPE
+#define __OFF_T_TYPE           __SLONGWORD_TYPE
+#define __OFF64_T_TYPE         __SQUAD_TYPE
+#define __PID_T_TYPE           __S32_TYPE
+#define __RLIM_T_TYPE          __ULONGWORD_TYPE
+#define __RLIM64_T_TYPE                __UQUAD_TYPE
+#define        __BLKCNT_T_TYPE         __SLONGWORD_TYPE
+#define        __BLKCNT64_T_TYPE       __SQUAD_TYPE
+#define        __FSBLKCNT_T_TYPE       __ULONGWORD_TYPE
+#define        __FSBLKCNT64_T_TYPE     __UQUAD_TYPE
+#define        __FSFILCNT_T_TYPE       __ULONGWORD_TYPE
+#define        __FSFILCNT64_T_TYPE     __UQUAD_TYPE
+#define        __ID_T_TYPE             __U32_TYPE
+#define __CLOCK_T_TYPE         __SLONGWORD_TYPE
+#define __TIME_T_TYPE          __SLONGWORD_TYPE
+#define __USECONDS_T_TYPE      __U32_TYPE
+#define __SUSECONDS_T_TYPE     __SLONGWORD_TYPE
+#define __DADDR_T_TYPE         __S32_TYPE
+#define __SWBLK_T_TYPE         __SLONGWORD_TYPE
+#define __KEY_T_TYPE           __S32_TYPE
+#define __CLOCKID_T_TYPE       __S32_TYPE
+#define __TIMER_T_TYPE         void *
+#define __BLKSIZE_T_TYPE       __S32_TYPE
+#define __FSID_T_TYPE          struct { int __val[2]; }
+#define __SSIZE_T_TYPE         __SWORD_TYPE
+
+/* Number of descriptors that can fit in an `fd_set'.  */
+#define        __FD_SETSIZE            1024
+
+
+#endif /* bits/typesizes.h */
index db9781a..ca386f1 100644 (file)
@@ -22,7 +22,6 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <ros/syscall.h>
-#include "ros_stat.h"
 
 /* Get information about the file descriptor FD in BUF.  */
 int
@@ -46,9 +45,7 @@ __fxstat (int vers, int fd, struct stat *buf)
     }
 
   
-  struct ros_stat nst;
-  int ret = (int)ros_syscall(SYS_fstat,fd,&nst,0,0,0);
-  __convert_stat(&nst,buf);
+  int ret = (int)ros_syscall(SYS_fstat, fd, buf, 0, 0, 0);
   return ret;
 }
 stub_warning (fstat)
index 8342ad6..e1603c2 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 #include <ros/syscall.h>
-#include "ros_stat.h"
 
 /* Get information about the file descriptor FD in BUF.  */
 int
 __fxstat64 (int vers, int fd, struct stat64 *buf)
 {
-  struct stat st;
-  int ret = __fxstat(vers,fd,&st);
-  __convert_stat64(&st,buf);
+  int ret = __fxstat(vers, fd, (struct stat*)buf);
   return ret;
 }
 hidden_def (__fxstat64)
index 5c95448..601b679 100644 (file)
@@ -24,7 +24,6 @@
 #include <string.h>
 #include <assert.h>
 #include <ros/syscall.h>
-#include "ros_stat.h"
 
 /* Get file information about FILE in BUF.  */
 int
@@ -36,9 +35,7 @@ __lxstat (int vers, const char *file, struct stat *buf)
     return -1;
   }
 
-  struct ros_stat nst;
-  int ret = (int)ros_syscall(SYS_lstat, file, strlen(file), &nst, 0, 0);
-  __convert_stat(&nst,buf);
+  int ret = (int)ros_syscall(SYS_lstat, file, strlen(file), buf, 0, 0);
   return ret;
 }
 hidden_def (__lxstat)
index 3e9fa68..fa95a9c 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 #include <ros/syscall.h>
-#include "ros_stat.h"
 
 /* Get file information about FILE in BUF.  */
 int
 __lxstat64 (int vers, const char *file, struct stat64 *buf)
 {
-  struct stat st;
-  int ret = __lxstat(vers,file,&st);
-  __convert_stat64(&st,buf);
+  int ret = __lxstat(vers, file, (struct stat*)buf);
   return ret;
 }
 hidden_def (__lxstat64)
diff --git a/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/ros_stat.h b/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/ros_stat.h
deleted file mode 100644 (file)
index 7d363b4..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef _ROS_CONVERT_STAT_H
-#define _ROS_CONVERT_STAT_H
-
-#include <ros/stat.h>
-
-#define __stat_copy_field(field) \
-  st->st_##field = (typeof(st->st_##field))nst->st_##field
-
-static void __convert_stat(const struct ros_stat* nst, struct stat* st)
-{
-  __stat_copy_field(dev);
-  __stat_copy_field(ino);
-  __stat_copy_field(mode);
-  __stat_copy_field(nlink);
-  __stat_copy_field(uid);
-  __stat_copy_field(gid);
-  __stat_copy_field(size);
-  __stat_copy_field(atime);
-  __stat_copy_field(mtime);
-  __stat_copy_field(ctime);
-}
-
-static void __convert_stat64(const struct stat* nst, struct stat64* st)
-{
-  __stat_copy_field(dev);
-  __stat_copy_field(ino);
-  __stat_copy_field(mode);
-  __stat_copy_field(nlink);
-  __stat_copy_field(uid);
-  __stat_copy_field(gid);
-  __stat_copy_field(size);
-  __stat_copy_field(atime);
-  __stat_copy_field(mtime);
-  __stat_copy_field(ctime);
-}
-
-#endif
index 7a056cf..4785248 100644 (file)
@@ -23,7 +23,6 @@
 #include <fcntl.h>
 #include <string.h>
 #include <ros/syscall.h>
-#include "ros_stat.h"
 
 /* Get file information about FILE in BUF.  */
 int
@@ -35,9 +34,7 @@ __xstat (int vers, const char *file, struct stat *buf)
     return -1;
   }
 
-  struct ros_stat nst;
-  int ret = (int)ros_syscall(SYS_stat, file, strlen(file), &nst, 0, 0);
-  __convert_stat(&nst,buf);
+  int ret = (int)ros_syscall(SYS_stat, file, strlen(file), buf, 0, 0);
   return ret;
 }
 hidden_def (__xstat)
index 879e4e3..b64838b 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 #include <ros/syscall.h>
-#include "ros_stat.h"
 
 /* Get file information about FILE in BUF.  */
 int
 __xstat64 (int vers, const char *file, struct stat64 *buf)
 {
-  struct stat st;
-  int ret = __xstat(vers,file,&st);
-  __convert_stat64(&st,buf);
+  int ret = __xstat(vers, file, (struct stat*)buf);
   return ret;
 }
 hidden_def (__xstat64)