stat.h with nanosecond resolution
Andreas Jaeger
aj@suse.de
Tue Dec 31 05:23:00 GMT 2002
I'm appending the follow-on patch that I just committed. It adds
nanosecond resolution for those platforms with specific files. Some
notes:
- Alpha/sparc64: These platforms have no nanosecond resolution added
since no space was reserved.
- m68k,mips: Has no nanosecond resolution added in kernel but space is
reserved. Andi, will these get changed, also?
- sparc/sparc64: Since sparc has nanosecond resolution but sparc64 has
not, we have to be really careful. Jakub, please double check my
changes.
- s390x: The s390-64/kernel_stat.h file differed from the one in Linux
2.5. I've merged in the 2.5 version now (it has the same layout as
the 2.4 version). Martin, please double check that this change is
correct, I don't see how it could have worked before.
Andreas
2002-12-31 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/powerpc/powerpc32/kernel_stat.h: Sync
with Linux kernel.
* sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h: Likewise.
* sysdeps/unix/sysv/linux/kernel_stat.h
(_HAVE_STAT_NSEC,_HAVE_STAT_NSEC64): New.
* sysdeps/unix/sysv/linux/xstatconv.c (xstat_conv): Readd
__unused[1-3] since they're needed by some platforms. Handle
_HAVE_STAT_NSEC and _HAVE_STAT_NSEC64.
* sysdeps/unix/sysv/linux/s390/s390-64/kernel_stat.h: Sync with
current kernel version.
* sysdeps/unix/sysv/linux/hppa/kernel_stat.h (struct kernel_stat):
Add nsec resolution.
* sysdeps/unix/sysv/linux/x86_64/bits/stat.h: Add nsec resolution
for structs stat and stat64.
* sysdeps/unix/sysv/linux/ia64/bits/stat.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/bits/stat.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/bits/stat.h: Likewise.
* sysdeps/unix/sysv/linux/s390/bits/stat.h: Likewise.
* io/sys/stat.h [__USE_MISC]: Define __need_timespec for struct
stat.
* sysdeps/unix/sysv/linux/xstatconv.c (xstat_conv): Adjust for
nsec resolution changes.
(xstat64_conv): Likewise.
(xstat32_conv): Likewise.
* sysdeps/unix/sysv/linux/kernel_stat.h: Add nsec resolution for
struct kernel_stat.
* sysdeps/unix/sysv/linux/bits/stat.h: Add nsec resolution for
structs stat and stat64.
* time/time.h (__timespec_defined): Define for __USE_MISC.
============================================================
Index: sysdeps/unix/sysv/linux/xstatconv.c
--- sysdeps/unix/sysv/linux/xstatconv.c 31 Dec 2002 00:01:53 -0000 1.11
+++ sysdeps/unix/sysv/linux/xstatconv.c 31 Dec 2002 12:17:17 -0000
@@ -60,12 +60,27 @@ xstat_conv (int vers, struct kernel_stat
buf->st_size = kbuf->st_size;
buf->st_blksize = kbuf->st_blksize;
buf->st_blocks = kbuf->st_blocks;
+#ifdef _HAVE_STAT_NSEC
buf->st_atim.tv_sec = kbuf->st_atim.tv_sec;
buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec;
buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec;
buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec;
buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec;
buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec;
+#else
+ buf->st_atime = kbuf->st_atime;
+ buf->st_mtime = kbuf->st_mtime;
+ buf->st_ctime = kbuf->st_ctime;
+#endif
+#ifdef _HAVE_STAT___UNUSED1
+ buf->__unused1 = 0;
+#endif
+#ifdef _HAVE_STAT___UNUSED2
+ buf->__unused2 = 0;
+#endif
+#ifdef _HAVE_STAT___UNUSED3
+ buf->__unused3 = 0;
+#endif
#ifdef _HAVE_STAT___UNUSED4
buf->__unused4 = 0;
#endif
@@ -115,12 +130,27 @@ xstat64_conv (int vers, struct kernel_st
buf->st_size = kbuf->st_size;
buf->st_blksize = kbuf->st_blksize;
buf->st_blocks = kbuf->st_blocks;
+#ifdef _HAVE_STAT64_NSEC
buf->st_atim.tv_sec = kbuf->st_atim.tv_sec;
buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec;
buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec;
buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec;
buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec;
buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec;
+#else
+ buf->st_atime = kbuf->st_atime;
+ buf->st_mtime = kbuf->st_mtime;
+ buf->st_ctime = kbuf->st_ctime;
+#endif
+#ifdef _HAVE_STAT64___UNUSED1
+ buf->__unused1 = 0;
+#endif
+#ifdef _HAVE_STAT64___UNUSED2
+ buf->__unused2 = 0;
+#endif
+#ifdef _HAVE_STAT64___UNUSED3
+ buf->__unused3 = 0;
+#endif
#ifdef _HAVE_STAT64___UNUSED4
buf->__unused4 = 0;
#endif
@@ -204,12 +234,28 @@ xstat32_conv (int vers, struct stat64 *k
__set_errno (EOVERFLOW);
return -1;
}
+#ifdef _HAVE_STAT_NSEC
buf->st_atim.tv_sec = kbuf->st_atim.tv_sec;
buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec;
buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec;
buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec;
buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec;
buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec;
+#else
+ buf->st_atime = kbuf->st_atime;
+ buf->st_mtime = kbuf->st_mtime;
+ buf->st_ctime = kbuf->st_ctime;
+#endif
+
+#ifdef _HAVE_STAT___UNUSED1
+ buf->__unused1 = 0;
+#endif
+#ifdef _HAVE_STAT___UNUSED2
+ buf->__unused2 = 0;
+#endif
+#ifdef _HAVE_STAT___UNUSED3
+ buf->__unused3 = 0;
+#endif
#ifdef _HAVE_STAT___UNUSED4
buf->__unused4 = 0;
#endif
============================================================
Index: sysdeps/unix/sysv/linux/hppa/kernel_stat.h
--- hppa/kernel_stat.h 15 Oct 2000 03:26:58 -0000 1.1
+++ hppa/kernel_stat.h 31 Dec 2002 12:17:17 -0000
@@ -1,32 +1,31 @@
/* definition of "struct stat" from the kernel */
struct kernel_stat {
unsigned long st_dev; /* dev_t is 32 bits on parisc */
- unsigned long st_ino; /* 32 bits */
- unsigned short st_mode; /* 16 bits */
+ unsigned long st_ino; /* 32 bits */
+ unsigned short st_mode; /* 16 bits */
unsigned short st_nlink; /* 16 bits */
unsigned short st_reserved1; /* old st_uid */
unsigned short st_reserved2; /* old st_gid */
- unsigned long st_rdev;
+ unsigned long st_rdev;
unsigned long st_size;
- unsigned long st_atime;
- unsigned long st_spare1;
- unsigned long st_mtime;
- unsigned long st_spare2;
- unsigned long st_ctime;
- unsigned long st_spare3;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
long st_blksize;
long st_blocks;
unsigned long __unused1; /* ACL stuff */
unsigned long __unused2; /* network */
- unsigned long __unused3; /* network */
+ unsigned long __unused3; /* network */
unsigned long __unused4; /* cnodes */
unsigned short __unused5; /* netsite */
short st_fstype;
- unsigned long st_realdev;
+ unsigned long st_realdev;
unsigned short st_basemode;
unsigned short st_spareshort;
- unsigned long st_uid;
+ unsigned long st_uid;
unsigned long st_gid;
unsigned long st_spare4[3];
};
+#define _HAVE_STAT_NSEC
+#define _HAVE_STAT64_NSEC
============================================================
Index: sysdeps/unix/sysv/linux/ia64/bits/stat.h
--- ia64/bits/stat.h 6 Jul 2001 04:56:17 -0000 1.6
+++ ia64/bits/stat.h 31 Dec 2002 12:17:17 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2001, 2002 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
@@ -39,12 +39,27 @@ struct stat
int pad0;
__dev_t st_rdev; /* Device number, if device. */
__off_t st_size; /* Size of file, in bytes. */
- __time_t st_atime; /* Time of last access. */
- long int __reserved0; /* Reserved for atime.nanoseconds. */
- __time_t st_mtime; /* Time of last modification. */
- long int __reserved1; /* Reserved for mtime.nanoseconds. */
- __time_t st_ctime; /* Time of last status change. */
- long int __reserved2; /* Reserved for ctime.nanoseconds. */
+#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
+ __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
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt_t st_blocks; /* Nr. 512-byte blocks allocated. */
long int __unused[3];
@@ -63,12 +78,27 @@ struct stat64
int pad0;
__dev_t st_rdev; /* Device number, if device. */
__off_t st_size; /* Size of file, in bytes. */
- __time_t st_atime; /* Time of last access. */
- long int __reserved0; /* Reserved for atime.nanoseconds. */
- __time_t st_mtime; /* Time of last modification. */
- long int __reserved1; /* Reserved for mtime.nanoseconds. */
- __time_t st_ctime; /* Time of last status change. */
- long int __reserved2; /* Reserved for ctime.nanoseconds. */
+#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
+ __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
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */
long int __unused[3];
============================================================
Index: sysdeps/unix/sysv/linux/powerpc/bits/stat.h
--- powerpc/bits/stat.h 2 Oct 2002 08:33:48 -0000 1.4
+++ powerpc/bits/stat.h 31 Dec 2002 12:17:17 -0000
@@ -69,12 +69,27 @@ struct stat
# else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
# endif
+#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
__time_t st_atime; /* Time of last access. */
- unsigned long int __unused1; /* Reserved for atime.nanoseconds. */
+ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */
- unsigned long int __unused2; /* Reserved for mtime.nanoseconds. */
+ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */
- unsigned long int __unused3; /* Reserved for ctime.nanoseconds. */
+ unsigned long int st_ctimensec; /* Nsecs of last status change. */
+#endif
unsigned long int __unused4;
unsigned long int __unused5;
};
@@ -94,12 +109,27 @@ struct stat64
__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
__time_t st_atime; /* Time of last access. */
- unsigned long int __unused1; /* Reserved for atime.nanoseconds. */
+ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */
- unsigned long int __unused2; /* Reserved for mtime.nanoseconds. */
+ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */
- unsigned long int __unused3; /* Reserved for ctime.nanoseconds. */
+ unsigned long int st_ctimensec; /* Nsecs of last status change. */
+#endif
unsigned long int __unused4;
unsigned long int __unused5;
};
@@ -133,12 +163,27 @@ struct stat
# else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
# endif
+#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
__time_t st_atime; /* Time of last access. */
- unsigned long int __unused1; /* Reserved for atime.nanoseconds. */
+ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */
- unsigned long int __unused2; /* Reserved for mtime.nanoseconds. */
+ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */
- unsigned long int __unused3; /* Reserved for ctime.nanoseconds. */
+ unsigned long int st_ctimensec; /* Nsecs of last status change. */
+#endif
unsigned long int __unused4;
unsigned long int __unused5;
unsigned long int __unused6;
@@ -158,12 +203,27 @@ struct stat64
__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
__time_t st_atime; /* Time of last access. */
- unsigned long int __unused1; /* Reserved for atime.nanoseconds. */
+ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */
- unsigned long int __unused2; /* Reserved for mtime.nanoseconds. */
+ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */
- unsigned long int __unused3; /* Reserved for ctime.nanoseconds. */
+ unsigned long int st_ctimensec; /* Nsecs of last status change. */
+#endif
unsigned long int __unused4;
unsigned long int __unused5;
unsigned long int __unused6;
============================================================
Index: sysdeps/unix/sysv/linux/powerpc/powerpc32/kernel_stat.h
--- powerpc/powerpc32/kernel_stat.h 5 Sep 2002 09:13:26 -0000 1.1
+++ powerpc/powerpc32/kernel_stat.h 31 Dec 2002 12:17:17 -0000
@@ -1,5 +1,5 @@
/* Definition of `struct stat' used in the kernel.
- Copyright (C) 1997, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2000, 2002 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
@@ -29,31 +29,19 @@ struct kernel_stat
unsigned long int st_size;
unsigned long int st_blksize;
unsigned long int st_blocks;
- unsigned long int st_atime;
- unsigned long int __unused1;
-#define _HAVE___UNUSED1
- unsigned long int st_mtime;
- unsigned long int __unused2;
-#define _HAVE___UNUSED2
- unsigned long int st_ctime;
- unsigned long int __unused3;
-#define _HAVE___UNUSED3
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
unsigned long int __unused4;
#define _HAVE___UNUSED4
unsigned long int __unused5;
#define _HAVE___UNUSED5
};
-#define _HAVE_STAT___UNUSED1
-#define _HAVE_STAT___UNUSED2
-#define _HAVE_STAT___UNUSED3
#define _HAVE_STAT___UNUSED4
#define _HAVE_STAT___UNUSED5
#define _HAVE_STAT___PAD1
#define _HAVE_STAT___PAD2
-#define _HAVE_STAT64___UNUSED1
-#define _HAVE_STAT64___UNUSED2
-#define _HAVE_STAT64___UNUSED3
#define _HAVE_STAT64___UNUSED4
#define _HAVE_STAT64___UNUSED5
#define _HAVE_STAT64___PAD2
============================================================
Index: sysdeps/unix/sysv/linux/s390/bits/stat.h
--- s390/bits/stat.h 11 Jul 2002 21:42:06 -0000 1.4
+++ s390/bits/stat.h 31 Dec 2002 12:17:17 -0000
@@ -56,12 +56,27 @@ struct stat
int pad0;
__dev_t st_rdev; /* Device number, if device. */
__off_t st_size; /* Size of file, in bytes. */
- __time_t st_atime; /* Time of last access. */
- long int __reserved0; /* Reserved for atime.nanoseconds. */
- __time_t st_mtime; /* Time of last modification. */
- long int __reserved1; /* Reserved for mtime.nanoseconds. */
- __time_t st_ctime; /* Time of last status change. */
- long int __reserved2; /* Reserved for ctime.nanoseconds. */
+#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
+ __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
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt_t st_blocks; /* Nr. 512-byte blocks allocated. */
long int __unused[3];
@@ -94,12 +109,27 @@ struct stat
# else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
# endif
+#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
__time_t st_atime; /* Time of last access. */
- unsigned long int __unused1;
+ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */
- unsigned long int __unused2;
+ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */
- unsigned long int __unused3;
+ unsigned long int st_ctimensec; /* Nsecs of last status change. */
+#endif
# ifndef __USE_FILE_OFFSET64
unsigned long int __unused4;
unsigned long int __unused5;
@@ -123,12 +153,27 @@ struct stat64
int pad0;
__dev_t st_rdev; /* Device number, if device. */
__off_t st_size; /* Size of file, in bytes. */
- __time_t st_atime; /* Time of last access. */
- long int __reserved0; /* Reserved for atime.nanoseconds. */
- __time_t st_mtime; /* Time of last modification. */
- long int __reserved1; /* Reserved for mtime.nanoseconds. */
- __time_t st_ctime; /* Time of last status change. */
- long int __reserved2; /* Reserved for ctime.nanoseconds. */
+#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
+ __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
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */
long int __unused[3];
@@ -150,12 +195,27 @@ struct stat64
__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
__time_t st_atime; /* Time of last access. */
- unsigned long int __unused1;
+ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */
- unsigned long int __unused2;
+ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */
- unsigned long int __unused3;
+ unsigned long int st_ctimensec; /* Nsecs of last status change. */
+#endif
__ino64_t st_ino; /* File serial number. */
};
# endif
============================================================
Index: sysdeps/unix/sysv/linux/s390/s390-64/kernel_stat.h
--- s390/s390-64/kernel_stat.h 6 Jul 2001 04:56:20 -0000 1.2
+++ s390/s390-64/kernel_stat.h 31 Dec 2002 12:17:17 -0000
@@ -1,5 +1,5 @@
/* Definition of `struct stat' used in the kernel. 64 bit S/390 version.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -26,21 +26,18 @@ struct kernel_stat
unsigned int st_nlink;
unsigned int st_uid;
unsigned int st_gid;
- unsigned int st_rdev;
unsigned int __pad1;
+ unsigned int st_rdev;
unsigned long int st_size;
- unsigned long int st_atime;
- unsigned long int st_mtime;
- unsigned long int st_ctime;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
unsigned int st_blksize;
int st_blocks;
- unsigned long __unused1;
- unsigned long __unused2;
+ unsigned long __unused[3];
};
extern int __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf);
#define XSTAT_IS_XSTAT64 1
-#define _HAVE___UNUSED1
-#define _HAVE___UNUSED2
-
+#define _HAVE_STAT_NSEC
============================================================
Index: sysdeps/unix/sysv/linux/sparc/bits/stat.h
--- sparc/bits/stat.h 6 Jul 2001 04:56:21 -0000 1.3
+++ sparc/bits/stat.h 31 Dec 2002 12:17:17 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,95,96,97,98,99,2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 1992,95,96,97,98,99,2000,2001,2002 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
@@ -60,12 +60,36 @@ struct stat
#else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
#endif
+#if __WORDSIZE == 64
__time_t st_atime; /* Time of last access. */
unsigned long int __unused1;
__time_t st_mtime; /* Time of last modification. */
unsigned long int __unused2;
__time_t st_ctime; /* Time of last status change. */
unsigned long int __unused3;
+#else
+# 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
+ __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
+#endif
unsigned long int __unused4;
unsigned long int __unused5;
};
@@ -88,12 +112,36 @@ struct stat64
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
+#if __WORDSIZE == 64
__time_t st_atime; /* Time of last access. */
unsigned long int __unused1;
__time_t st_mtime; /* Time of last modification. */
unsigned long int __unused2;
__time_t st_ctime; /* Time of last status change. */
unsigned long int __unused3;
+#else
+# 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
+ __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
+#endif
unsigned long int __unused4;
unsigned long int __unused5;
};
============================================================
Index: sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h
--- sparc/sparc32/kernel_stat.h 12 Aug 2000 05:11:57 -0000 1.2
+++ sparc/sparc32/kernel_stat.h 31 Dec 2002 12:17:17 -0000
@@ -9,34 +9,24 @@ struct kernel_stat
unsigned short int st_gid;
unsigned short int st_rdev;
long int st_size;
- long int st_atime;
- unsigned long int __unused1;
- long int st_mtime;
- unsigned long int __unused2;
- long int st_ctime;
- unsigned long int __unused3;
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
long int st_blksize;
long int st_blocks;
unsigned long int __unused4;
unsigned long int __unused5;
};
-#define _HAVE___UNUSED1
-#define _HAVE___UNUSED2
-#define _HAVE___UNUSED3
#define _HAVE___UNUSED4
#define _HAVE___UNUSED5
-#define _HAVE_STAT___UNUSED1
-#define _HAVE_STAT___UNUSED2
-#define _HAVE_STAT___UNUSED3
#define _HAVE_STAT___UNUSED4
#define _HAVE_STAT___UNUSED5
#define _HAVE_STAT___PAD1
#define _HAVE_STAT___PAD2
-#define _HAVE_STAT64___UNUSED1
-#define _HAVE_STAT64___UNUSED2
-#define _HAVE_STAT64___UNUSED3
#define _HAVE_STAT64___UNUSED4
#define _HAVE_STAT64___UNUSED5
#define _HAVE_STAT64___PAD2
+#define _HAVE_STAT_NSEC
+#define _HAVE_STAT64_NSEC
============================================================
Index: sysdeps/unix/sysv/linux/x86_64/bits/stat.h
--- x86_64/bits/stat.h 4 Mar 2002 13:39:58 -0000 1.2
+++ x86_64/bits/stat.h 31 Dec 2002 12:17:17 -0000
@@ -76,12 +76,27 @@ struct stat
#else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
#endif
- __time_t st_atime; /* Time of last access. */
- long int __reserved0; /* Reserved for atime.nanoseconds. */
- __time_t st_mtime; /* Time of last modification. */
- long int __reserved1; /* Reserved for mtime.nanoseconds. */
- __time_t st_ctime; /* Time of last status change. */
- long int __reserved2; /* Reserved for ctime.nanoseconds. */
+#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
+ __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
#if __WORDSIZE == 64
long int __unused[3];
#else
@@ -122,12 +137,27 @@ struct stat64
#endif
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */
- __time_t st_atime; /* Time of last access. */
- long int __reserved0; /* Reserved for atime.nanoseconds. */
- __time_t st_mtime; /* Time of last modification. */
- long int __reserved1; /* Reserved for mtime.nanoseconds. */
- __time_t st_ctime; /* Time of last status change. */
- long int __reserved2; /* Reserved for ctime.nanoseconds. */
+#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
+ __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
#if __WORDSIZE == 64
long int __unused[3];
#else
--
Andreas Jaeger
SuSE Labs aj@suse.de
private aj@arthur.inka.de
http://www.suse.de/~aj
More information about the Libc-alpha
mailing list