This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

stat.h with nanosecond resolution


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]