y2038: Use a common definition for stat

Instead of replicate the same definitions from struct_stat_time64.h
on the multiple struct_stat.h, use a common header which is included
when required (struct_stat_time64_helper.h).  The 64-bit time support
is added only for LFS support.

The __USE_TIME_BITS64 is not defined internally yet, although the
internal header is used when building the 64-bit stat implementations.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Lukasz Majewski 2020-10-15 09:30:59 +02:00 committed by Adhemerval Zanella
parent 746ef78afe
commit 4e8521333b
10 changed files with 452 additions and 375 deletions

View file

@ -100,7 +100,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
bits/types/struct_msqid_ds.h \ bits/types/struct_msqid_ds.h \
bits/types/struct_shmid_ds.h \ bits/types/struct_shmid_ds.h \
bits/ipc-perm.h \ bits/ipc-perm.h \
bits/struct_stat.h bits/struct_stat.h \
bits/struct_stat_time64_helper.h
tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \ tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \

View file

@ -28,32 +28,35 @@
struct stat struct stat
{ {
#ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
#else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
unsigned short int __pad1; unsigned short int __pad1;
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__ino_t st_ino; /* File serial number. */ __ino_t st_ino; /* File serial number. */
#else # else
__ino_t __st_ino; /* 32bit file serial number. */ __ino_t __st_ino; /* 32bit file serial number. */
#endif # endif
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */ __nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file's owner. */ __uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/ __gid_t st_gid; /* Group ID of the file's group.*/
__dev_t st_rdev; /* Device number, if device. */ __dev_t st_rdev; /* Device number, if device. */
unsigned short int __pad2; unsigned short int __pad2;
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__off_t st_size; /* Size of file, in bytes. */ __off_t st_size; /* Size of file, in bytes. */
#else # else
__off64_t st_size; /* Size of file, in bytes. */ __off64_t st_size; /* Size of file, in bytes. */
#endif # endif
__blksize_t st_blksize; /* Optimal block size for I/O. */ __blksize_t st_blksize; /* Optimal block size for I/O. */
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
#else # else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
#endif # endif
#ifdef __USE_XOPEN2K8 # ifdef __USE_XOPEN2K8
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
equivalent to 'struct timespec'. This is the type used equivalent to 'struct timespec'. This is the type used
whenever possible but the Unix namespace rules do not allow the whenever possible but the Unix namespace rules do not allow the
@ -66,25 +69,29 @@ struct stat
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
#endif # endif
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
unsigned long int __glibc_reserved4; unsigned long int __glibc_reserved4;
unsigned long int __glibc_reserved5; unsigned long int __glibc_reserved5;
#else # else
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
#endif # endif
#endif /* __USE_TIME_BITS64 */
}; };
#ifdef __USE_LARGEFILE64 #ifdef __USE_LARGEFILE64
struct stat64 struct stat64
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
unsigned int __pad1; unsigned int __pad1;
@ -118,6 +125,7 @@ struct stat64
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
# endif # endif
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
# endif /* __USE_TIME_BITS64 */
}; };
#endif #endif

View file

@ -0,0 +1,66 @@
/* Definition for helper to define struct stat with 64-bit time.
Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
/* Content of internal __stat64_t64 struct. */
__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_XOPEN2K8
# ifndef __struct_timespec
# define __struct_timespec struct timespec
# endif
/* 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;
__struct_timespec st_mtim;
__struct_timespec st_ctim;
# define st_atime st_atim.tv_sec
# define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec
# undef __struct_timespec
#else
/* The definition should be equal to the 'struct __timespec64' internal
layout. */
# if __BYTE_ORDER == __BIG_ENDIAN
# define __fieldts64(name) \
__time64_t name; __int32_t :32; __int32_t name ## nsec
# else
# define __fieldts64(name) \
__time64_t name; __int32_t name ## nsec; __int32_t :32
# endif
__fieldts64 (st_atime);
__fieldts64 (st_mtime);
__fieldts64 (st_ctime);
unsigned long int __glibc_reserved4;
unsigned long int __glibc_reserved5;
# undef __fieldts64
#endif

View file

@ -25,32 +25,35 @@
struct stat struct stat
{ {
#ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
#else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
unsigned short int __pad1; unsigned short int __pad1;
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__ino_t st_ino; /* File serial number. */ __ino_t st_ino; /* File serial number. */
#else # else
__ino_t __st_ino; /* 32bit file serial number. */ __ino_t __st_ino; /* 32bit file serial number. */
#endif # endif
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */ __nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file's owner. */ __uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/ __gid_t st_gid; /* Group ID of the file's group.*/
__dev_t st_rdev; /* Device number, if device. */ __dev_t st_rdev; /* Device number, if device. */
unsigned short int __pad2; unsigned short int __pad2;
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__off_t st_size; /* Size of file, in bytes. */ __off_t st_size; /* Size of file, in bytes. */
#else # else
__off64_t st_size; /* Size of file, in bytes. */ __off64_t st_size; /* Size of file, in bytes. */
#endif # endif
__blksize_t st_blksize; /* Optimal block size for I/O. */ __blksize_t st_blksize; /* Optimal block size for I/O. */
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
#else # else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
#endif # endif
#ifdef __USE_XOPEN2K8 # ifdef __USE_XOPEN2K8
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
equivalent to 'struct timespec'. This is the type used equivalent to 'struct timespec'. This is the type used
whenever possible but the Unix namespace rules do not allow the whenever possible but the Unix namespace rules do not allow the
@ -63,25 +66,29 @@ struct stat
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
#endif # endif
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
unsigned long int __glibc_reserved4; unsigned long int __glibc_reserved4;
unsigned long int __glibc_reserved5; unsigned long int __glibc_reserved5;
#else # else
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
#endif # endif
#endif /* __USE_TIME_BITS64 */
}; };
#ifdef __USE_LARGEFILE64 #ifdef __USE_LARGEFILE64
struct stat64 struct stat64
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
unsigned short int __pad1; unsigned short int __pad1;
@ -115,6 +122,7 @@ struct stat64
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
# endif # endif
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
# endif /* __USE_TIME_BITS64 */
}; };
#endif #endif

View file

@ -26,6 +26,9 @@
#ifndef __USE_FILE_OFFSET64 #ifndef __USE_FILE_OFFSET64
struct stat struct stat
{ {
#ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
#else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
__ino_t st_ino; /* File serial number. */ __ino_t st_ino; /* File serial number. */
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
@ -38,7 +41,7 @@ struct stat
__blksize_t st_blksize; /* Optimal block size for I/O. */ __blksize_t st_blksize; /* Optimal block size for I/O. */
int __pad3; int __pad3;
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
#ifdef __USE_XOPEN2K8 # ifdef __USE_XOPEN2K8
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
* equivalent to 'struct timespec'. This is the type used * equivalent to 'struct timespec'. This is the type used
* whenever possible but the Unix namespace rules do not allow the * whenever possible but the Unix namespace rules do not allow the
@ -51,16 +54,17 @@ struct stat
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
#endif # endif
unsigned int __glibc_reserved4; unsigned int __glibc_reserved4;
unsigned int __glibc_reserved5; unsigned int __glibc_reserved5;
#endif /* __USE_TIME_BITS64 */
}; };
#else /* __USE_FILE_OFFSET64 */ #else /* __USE_FILE_OFFSET64 */
/* MS: If __USE_FILE_OFFSET64 is setup then struct stat should match stat64 /* MS: If __USE_FILE_OFFSET64 is setup then struct stat should match stat64
@ -70,6 +74,9 @@ struct stat
* create one ifdef to separate stats structures. */ * create one ifdef to separate stats structures. */
struct stat struct stat
{ {
#ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
#else
unsigned long long st_dev; /* Device. */ unsigned long long st_dev; /* Device. */
__ino64_t st_ino; /* 32bit file serial number. */ __ino64_t st_ino; /* 32bit file serial number. */
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
@ -82,7 +89,7 @@ struct stat
__blksize_t st_blksize; /* Optimal block size for I/O. */ __blksize_t st_blksize; /* Optimal block size for I/O. */
int __pad3; int __pad3;
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
#ifdef __USE_MISC # ifdef __USE_MISC
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
* equivalent to 'struct timespec'. This is the type used * equivalent to 'struct timespec'. This is the type used
* whenever possible but the Unix namespace rules do not allow the * whenever possible but the Unix namespace rules do not allow the
@ -95,22 +102,26 @@ struct stat
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
#endif # endif
unsigned int __glibc_reserved4; unsigned int __glibc_reserved4;
unsigned int __glibc_reserved5; unsigned int __glibc_reserved5;
# endif /* __USE_TIME_BITS64 */
}; };
#endif /* __USE_FILE_OFFSET64 */ #endif /* __USE_FILE_OFFSET64 */
#ifdef __USE_LARGEFILE64 #ifdef __USE_LARGEFILE64
struct stat64 struct stat64
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
unsigned long long st_dev; /* Device. */ unsigned long long st_dev; /* Device. */
__ino64_t st_ino; /* 32bit file serial number. */ __ino64_t st_ino; /* 32bit file serial number. */
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
@ -123,7 +134,7 @@ struct stat64
__blksize_t st_blksize; /* Optimal block size for I/O. */ __blksize_t st_blksize; /* Optimal block size for I/O. */
int __pad3; int __pad3;
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
#ifdef __USE_XOPEN2K8 # ifdef __USE_XOPEN2K8
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
* equivalent to 'struct timespec'. This is the type used * equivalent to 'struct timespec'. This is the type used
* whenever possible but the Unix namespace rules do not allow the * whenever possible but the Unix namespace rules do not allow the
@ -136,16 +147,17 @@ struct stat64
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
#endif # endif
unsigned int __glibc_reserved4; unsigned int __glibc_reserved4;
unsigned int __glibc_reserved5; unsigned int __glibc_reserved5;
# endif /* __USE_TIME_BITS64 */
}; };
#endif #endif

View file

@ -29,28 +29,31 @@
/* Structure describing file characteristics. */ /* Structure describing file characteristics. */
struct stat struct stat
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
unsigned long int st_dev; unsigned long int st_dev;
long int st_pad1[3]; long int st_pad1[3];
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__ino_t st_ino; /* File serial number. */ __ino_t st_ino; /* File serial number. */
#else # else
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
#endif # endif
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */ __nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file's owner. */ __uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/ __gid_t st_gid; /* Group ID of the file's group.*/
unsigned long int st_rdev; /* Device number, if device. */ unsigned long int st_rdev; /* Device number, if device. */
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
long int st_pad2[2]; long int st_pad2[2];
__off_t st_size; /* Size of file, in bytes. */ __off_t st_size; /* Size of file, in bytes. */
/* SVR4 added this extra long to allow for expansion of off_t. */ /* SVR4 added this extra long to allow for expansion of off_t. */
long int st_pad3; long int st_pad3;
#else # else
long int st_pad2[3]; long int st_pad2[3];
__off64_t st_size; /* Size of file, in bytes. */ __off64_t st_size; /* Size of file, in bytes. */
#endif # endif
#ifdef __USE_XOPEN2K8 # ifdef __USE_XOPEN2K8
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
equivalent to 'struct timespec'. This is the type used equivalent to 'struct timespec'. This is the type used
whenever possible but the Unix namespace rules do not allow the whenever possible but the Unix namespace rules do not allow the
@ -63,27 +66,31 @@ struct stat
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
#endif # endif
__blksize_t st_blksize; /* Optimal block size for I/O. */ __blksize_t st_blksize; /* Optimal block size for I/O. */
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__blkcnt_t st_blocks; /* Number of 512-byte blocks allocated. */ __blkcnt_t st_blocks; /* Number of 512-byte blocks allocated. */
#else # else
long int st_pad4; long int st_pad4;
__blkcnt64_t st_blocks; /* Number of 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number of 512-byte blocks allocated. */
#endif # endif
long int st_pad5[14]; long int st_pad5[14];
# endif /* __USE_TIME_BITS64 */
}; };
#ifdef __USE_LARGEFILE64 # ifdef __USE_LARGEFILE64
struct stat64 struct stat64
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
unsigned long int st_dev; unsigned long int st_dev;
long int st_pad1[3]; long int st_pad1[3];
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
@ -116,32 +123,35 @@ struct stat64
long int st_pad3; long int st_pad3;
__blkcnt64_t st_blocks; /* Number of 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number of 512-byte blocks allocated. */
long int st_pad4[14]; long int st_pad4[14];
# endif /* __USE_TIME_BITS64 */
}; };
#endif # endif /* __USE_LARGEFILE64 */
#else
#else /* _MIPS_SIM != _ABIO32 */
struct stat struct stat
{ {
__dev_t st_dev; __dev_t st_dev;
int st_pad1[3]; /* Reserved for st_dev expansion */ int st_pad1[3]; /* Reserved for st_dev expansion */
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__ino_t st_ino; __ino_t st_ino;
#else # else
__ino64_t st_ino; __ino64_t st_ino;
#endif # endif
__mode_t st_mode; __mode_t st_mode;
__nlink_t st_nlink; __nlink_t st_nlink;
__uid_t st_uid; __uid_t st_uid;
__gid_t st_gid; __gid_t st_gid;
__dev_t st_rdev; __dev_t st_rdev;
#if !defined __USE_FILE_OFFSET64 # if !defined __USE_FILE_OFFSET64
unsigned int st_pad2[2]; /* Reserved for st_rdev expansion */ unsigned int st_pad2[2]; /* Reserved for st_rdev expansion */
__off_t st_size; __off_t st_size;
int st_pad3; int st_pad3;
#else # else
unsigned int st_pad2[3]; /* Reserved for st_rdev expansion */ unsigned int st_pad2[3]; /* Reserved for st_rdev expansion */
__off64_t st_size; __off64_t st_size;
#endif # endif
#ifdef __USE_XOPEN2K8 # ifdef __USE_XOPEN2K8
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
equivalent to 'struct timespec'. This is the type used equivalent to 'struct timespec'. This is the type used
whenever possible but the Unix namespace rules do not allow the whenever possible but the Unix namespace rules do not allow the
@ -154,21 +164,21 @@ struct stat
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
#endif # endif
__blksize_t st_blksize; __blksize_t st_blksize;
unsigned int st_pad4; unsigned int st_pad4;
#ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
__blkcnt_t st_blocks; __blkcnt_t st_blocks;
#else # else
__blkcnt64_t st_blocks; __blkcnt64_t st_blocks;
#endif # endif
int st_pad5[14]; int st_pad5[14];
}; };
@ -209,6 +219,7 @@ struct stat64
int st_pad4[14]; int st_pad4[14];
}; };
#endif #endif
#endif #endif
/* Tell code we have these members. */ /* Tell code we have these members. */

View file

@ -26,9 +26,11 @@
#include <bits/wordsize.h> #include <bits/wordsize.h>
#if __WORDSIZE == 32 #if __WORDSIZE == 32
struct stat struct stat
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
# ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
unsigned short int __pad1; unsigned short int __pad1;
@ -77,12 +79,15 @@ struct stat
# endif # endif
unsigned long int __glibc_reserved4; unsigned long int __glibc_reserved4;
unsigned long int __glibc_reserved5; unsigned long int __glibc_reserved5;
# endif /* __USE_TIME_BITS64 */
}; };
# ifdef __USE_LARGEFILE64 # ifdef __USE_LARGEFILE64
struct stat64 struct stat64
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
@ -117,6 +122,7 @@ struct stat64
# endif # endif
unsigned long int __glibc_reserved4; unsigned long int __glibc_reserved4;
unsigned long int __glibc_reserved5; unsigned long int __glibc_reserved5;
# endif /* __USE_TIME_BITS64 */
}; };
# endif /* __USE_LARGEFILE64 */ # endif /* __USE_LARGEFILE64 */

View file

@ -65,6 +65,9 @@ struct stat
#else #else
struct stat struct stat
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
unsigned int __pad1; unsigned int __pad1;
# ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
@ -116,9 +119,10 @@ struct stat
unsigned long int __glibc_reserved5; unsigned long int __glibc_reserved5;
# else # else
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
# endif
# endif # endif
}; };
#endif # endif
#ifdef __USE_LARGEFILE64 #ifdef __USE_LARGEFILE64
# if __WORDSIZE == 64 # if __WORDSIZE == 64
@ -162,6 +166,9 @@ struct stat64
# else # else
struct stat64 struct stat64
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
unsigned int __pad1; unsigned int __pad1;
@ -198,6 +205,7 @@ struct stat64
unsigned long int st_ctimensec; /* Nsecs of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */
# endif # endif
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
# endif
}; };
# endif # endif
#endif #endif

View file

@ -22,64 +22,13 @@
#if __TIMESIZE == 64 #if __TIMESIZE == 64
# define __stat64_t64 stat64 # define __stat64_t64 stat64
#else #else
# ifdef __USE_LARGEFILE64 # include <struct___timespec64.h>
# include <endian.h>
/* The definition should be equal to the 'struct __timespec64' internal
layout. */
# if BYTE_ORDER == BIG_ENDIAN
# define __fieldts64(name) \
__time64_t name; __int32_t :32; __int32_t name ## nsec
# else
# define __fieldts64(name) \
__time64_t name; __int32_t name ## nsec; __int32_t :32
# endif
/* Workaround for the definition from struct_stat.h */
# undef st_atime
# undef st_mtime
# undef st_ctime
struct __stat64_t64 struct __stat64_t64
{ {
__dev_t st_dev; /* Device. */ # define __struct_timespec struct __timespec64
__ino64_t st_ino; /* file serial number. */ # include <bits/struct_stat_time64_helper.h>
__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_XOPEN2K8
/* 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 __timespec64 st_atim; /* Time of last access. */
struct __timespec64 st_mtim; /* Time of last modification. */
struct __timespec64 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
__fieldts64 (st_atime);
__fieldts64 (st_mtime);
__fieldts64 (st_ctime);
# endif /* __USE_XOPEN2K8 */
}; };
#endif /* __TIMESIZE == 64 */
# define _STATBUF_ST_BLKSIZE
# define _STATBUF_ST_RDEV
# define _STATBUF_ST_NSEC
# undef __fieldts64
# endif /* __USE_LARGEFILE64 */
# endif /* __TIMESIZE == 64 */
#endif /* _BITS_STRUCT_STAT_TIME64_H */ #endif /* _BITS_STRUCT_STAT_TIME64_H */

View file

@ -25,43 +25,46 @@
struct stat struct stat
{ {
#ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
#else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
#ifndef __x86_64__ # ifndef __x86_64__
unsigned short int __pad1; unsigned short int __pad1;
#endif # endif
#if defined __x86_64__ || !defined __USE_FILE_OFFSET64 # if defined __x86_64__ || !defined __USE_FILE_OFFSET64
__ino_t st_ino; /* File serial number. */ __ino_t st_ino; /* File serial number. */
#else # else
__ino_t __st_ino; /* 32bit file serial number. */ __ino_t __st_ino; /* 32bit file serial number. */
#endif # endif
#ifndef __x86_64__ # ifndef __x86_64__
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */ __nlink_t st_nlink; /* Link count. */
#else # else
__nlink_t st_nlink; /* Link count. */ __nlink_t st_nlink; /* Link count. */
__mode_t st_mode; /* File mode. */ __mode_t st_mode; /* File mode. */
#endif # endif
__uid_t st_uid; /* User ID of the file's owner. */ __uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/ __gid_t st_gid; /* Group ID of the file's group.*/
#ifdef __x86_64__ # ifdef __x86_64__
int __pad0; int __pad0;
#endif # endif
__dev_t st_rdev; /* Device number, if device. */ __dev_t st_rdev; /* Device number, if device. */
#ifndef __x86_64__ # ifndef __x86_64__
unsigned short int __pad2; unsigned short int __pad2;
#endif # endif
#if defined __x86_64__ || !defined __USE_FILE_OFFSET64 # if defined __x86_64__ || !defined __USE_FILE_OFFSET64
__off_t st_size; /* Size of file, in bytes. */ __off_t st_size; /* Size of file, in bytes. */
#else # else
__off64_t st_size; /* Size of file, in bytes. */ __off64_t st_size; /* Size of file, in bytes. */
#endif # endif
__blksize_t st_blksize; /* Optimal block size for I/O. */ __blksize_t st_blksize; /* Optimal block size for I/O. */
#if defined __x86_64__ || !defined __USE_FILE_OFFSET64 # if defined __x86_64__ || !defined __USE_FILE_OFFSET64
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
#else # else
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
#endif # endif
#ifdef __USE_XOPEN2K8 # ifdef __USE_XOPEN2K8
/* Nanosecond resolution timestamps are stored in a format /* Nanosecond resolution timestamps are stored in a format
equivalent to 'struct timespec'. This is the type used equivalent to 'struct timespec'. This is the type used
whenever possible but the Unix namespace rules do not allow the whenever possible but the Unix namespace rules do not allow the
@ -74,30 +77,34 @@ struct stat
# define st_atime st_atim.tv_sec /* Backward compatibility. */ # define st_atime st_atim.tv_sec /* Backward compatibility. */
# define st_mtime st_mtim.tv_sec # define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec # define st_ctime st_ctim.tv_sec
#else # else
__time_t st_atime; /* Time of last access. */ __time_t st_atime; /* Time of last access. */
__syscall_ulong_t st_atimensec; /* Nscecs of last access. */ __syscall_ulong_t st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */ __time_t st_mtime; /* Time of last modification. */
__syscall_ulong_t st_mtimensec; /* Nsecs of last modification. */ __syscall_ulong_t st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */ __time_t st_ctime; /* Time of last status change. */
__syscall_ulong_t st_ctimensec; /* Nsecs of last status change. */ __syscall_ulong_t st_ctimensec; /* Nsecs of last status change. */
#endif # endif
#ifdef __x86_64__ # ifdef __x86_64__
__syscall_slong_t __glibc_reserved[3]; __syscall_slong_t __glibc_reserved[3];
#else # else
# ifndef __USE_FILE_OFFSET64 # ifndef __USE_FILE_OFFSET64
unsigned long int __glibc_reserved4; unsigned long int __glibc_reserved4;
unsigned long int __glibc_reserved5; unsigned long int __glibc_reserved5;
# else # else
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
# endif # endif
#endif # endif
#endif /* __USE_TIME_BITS64 */
}; };
#ifdef __USE_LARGEFILE64 #ifdef __USE_LARGEFILE64
/* Note stat64 has the same shape as stat for x86-64. */ /* Note stat64 has the same shape as stat for x86-64. */
struct stat64 struct stat64
{ {
# ifdef __USE_TIME_BITS64
# include <bits/struct_stat_time64_helper.h>
# else
__dev_t st_dev; /* Device. */ __dev_t st_dev; /* Device. */
# ifdef __x86_64__ # ifdef __x86_64__
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
@ -145,6 +152,7 @@ struct stat64
# else # else
__ino64_t st_ino; /* File serial number. */ __ino64_t st_ino; /* File serial number. */
# endif # endif
# endif /* __USE_TIME_BITS64 */
}; };
#endif #endif