From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id B15D4399E06A for ; Fri, 4 Jun 2021 19:38:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B15D4399E06A Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-186-ACRJL4kzOX-moHiSiBkwBw-1; Fri, 04 Jun 2021 15:37:58 -0400 X-MC-Unique: ACRJL4kzOX-moHiSiBkwBw-1 Received: by mail-qt1-f199.google.com with SMTP id h12-20020ac8776c0000b02901f1228fdb1bso5830918qtu.6 for ; Fri, 04 Jun 2021 12:37:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:organization :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=bypi8kJ2MITYiuMbKUKN7C0jg2c8EU1hnofrWss2xj0=; b=YBGKQtwNL6fA7yKOSMBqKGEM/w2CagKXMvSPT6AwfUd6a2mvw6Qha5GPXhAELvzm2R asErbhGZ/cR/DHR9RuHtdiH567CuJCK7a/IJYK82IZd+kaEzSuADg/I+hLVzuoTpS2BX Y/PhBNzEiffDVQpQ8hnPxlM1MADLpkWsDVZta53MSxvYf0QE5AQysM3ic4h1D7+nWB9x kfxERkD3f0K/pK/qGegUG6dmJkQl33ww8Lz1nJWfOQaQUYuImBdWgnu/7dSyTn+CdsLo uK96Uzegj5hq0+NoE/XcXZy71mRxyJZCmqCL29dr3DNlESDW+mRK+RUPKyfuzA1s4RRH QH4w== X-Gm-Message-State: AOAM531I5cMkXZCJBfz5dJbxLKbpsOlbFrd696PDzRQGhoC+qk9T551R QjBQU4xMFleGQ+igZLYbfmAfXEFWZNU6hRMOQiLF772mBpQJ4L50Tf6ZUeqYSfehIeGg2wuBRPG 7RHteT8VqFBwquWSs4JF8 X-Received: by 2002:a0c:9ccc:: with SMTP id j12mr6428544qvf.30.1622835477588; Fri, 04 Jun 2021 12:37:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzBT82xKmRzlidAXRkRVlx7Xr/Ak48/GvkeaKS2cAUKZm2wJrRv9SoE7eMYPk+82jOdega/IQ== X-Received: by 2002:a0c:9ccc:: with SMTP id j12mr6428477qvf.30.1622835476738; Fri, 04 Jun 2021 12:37:56 -0700 (PDT) Received: from [192.168.1.16] (198-84-214-74.cpe.teksavvy.com. [198.84.214.74]) by smtp.gmail.com with ESMTPSA id f11sm3996428qtf.30.2021.06.04.12.37.55 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 04 Jun 2021 12:37:56 -0700 (PDT) From: Carlos O'Donell Subject: Re: [PATCH v2 13/25] y2038: Use a common definition for stat To: Adhemerval Zanella , libc-alpha@sourceware.org References: <20210518205613.1487824-1-adhemerval.zanella@linaro.org> <20210518205613.1487824-14-adhemerval.zanella@linaro.org> Organization: Red Hat Message-ID: <1febc644-6089-46b7-f70d-e039e3361b9b@redhat.com> Date: Fri, 4 Jun 2021 15:37:54 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 MIME-Version: 1.0 In-Reply-To: <20210518205613.1487824-14-adhemerval.zanella@linaro.org> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Jun 2021 19:38:11 -0000 On 5/18/21 4:56 PM, Adhemerval Zanella wrote: > From: Lukasz Majewski > > 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. Requesting a v3 please. Please add the __glibc_reserved* members to the structures to preserve maximum compatibility with the kernel structure. See review of patch 14/25 for more general details. I am almost OK with this change as-is because in general everyone should be using statx at this point with the ability to extend and provide more information. However because the kernel contains: 24 struct stat { 25 unsigned long st_dev; /* Device. */ 26 unsigned long st_ino; /* File serial number. */ 27 unsigned int st_mode; /* File mode. */ 28 unsigned int st_nlink; /* Link count. */ 29 unsigned int st_uid; /* User ID of the file's owner. */ 30 unsigned int st_gid; /* Group ID of the file's group. */ 31 unsigned long st_rdev; /* Device number, if device. */ 32 unsigned long __pad1; 33 long st_size; /* Size of file, in bytes. */ 34 int st_blksize; /* Optimal block size for I/O. */ 35 int __pad2; 36 long st_blocks; /* Number 512-byte blocks allocated. */ 37 long st_atime; /* Time of last access. */ 38 unsigned long st_atime_nsec; 39 long st_mtime; /* Time of last modification. */ 40 unsigned long st_mtime_nsec; 41 long st_ctime; /* Time of last status change. */ 42 unsigned long st_ctime_nsec; 43 unsigned int __unused4; 44 unsigned int __unused5; 45 }; With __unused4 and __unused5. I think we should match this ABI as closely as we can to avoid future compatibility issues with legacy APIs. > --- > sysdeps/unix/sysv/linux/Makefile | 3 +- > sysdeps/unix/sysv/linux/bits/struct_stat.h | 51 ++++++----- > .../linux/bits/struct_stat_time64_helper.h | 63 +++++++++++++ > .../unix/sysv/linux/m68k/bits/struct_stat.h | 50 ++++++----- > .../sysv/linux/microblaze/bits/struct_stat.h | 48 ++++++---- > .../unix/sysv/linux/mips/bits/struct_stat.h | 89 ++++++++++-------- > .../sysv/linux/powerpc/bits/struct_stat.h | 52 ++++++----- > .../unix/sysv/linux/s390/bits/struct_stat.h | 56 +++++++----- > sysdeps/unix/sysv/linux/struct_stat_time64.h | 59 +----------- > .../unix/sysv/linux/x86/bits/struct_stat.h | 90 ++++++++++--------- > 10 files changed, 317 insertions(+), 244 deletions(-) > create mode 100644 sysdeps/unix/sysv/linux/bits/struct_stat_time64_helper.h > > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > index e28f6470e3..f83f147ed1 100644 > --- a/sysdeps/unix/sysv/linux/Makefile > +++ b/sysdeps/unix/sysv/linux/Makefile > @@ -100,7 +100,8 @@ sysdep_headers += sys/mount.h sys/acct.h \ > bits/types/struct_msqid_ds.h \ > bits/types/struct_shmid_ds.h \ > bits/ipc-perm.h \ > - bits/struct_stat.h > + bits/struct_stat.h \ > + bits/struct_stat_time64_helper.h OK. Add new helper header. > > tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \ > tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \ > diff --git a/sysdeps/unix/sysv/linux/bits/struct_stat.h b/sysdeps/unix/sysv/linux/bits/struct_stat.h > index b852ee256e..ba41f86142 100644 > --- a/sysdeps/unix/sysv/linux/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/bits/struct_stat.h > @@ -28,32 +28,35 @@ > > struct stat > { > +#ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +#else > __dev_t st_dev; /* Device. */ > unsigned short int __pad1; > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __ino_t st_ino; /* File serial number. */ > -#else > +# else > __ino_t __st_ino; /* 32bit file serial number. */ > -#endif > +# endif > __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. */ > unsigned short int __pad2; > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __off_t st_size; /* Size of file, in bytes. */ > -#else > +# else > __off64_t st_size; /* Size of file, in bytes. */ > -#endif > +# endif > __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. */ > -#else > +# else > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -#endif > -#ifdef __USE_XOPEN2K8 > +# endif > +# 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 > @@ -63,28 +66,32 @@ struct stat > 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 > +# 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 > -#ifndef __USE_FILE_OFFSET64 > +# endif > +# ifndef __USE_FILE_OFFSET64 > unsigned long int __glibc_reserved4; > unsigned long int __glibc_reserved5; > -#else > +# else > __ino64_t st_ino; /* File serial number. */ > -#endif > +# endif > +#endif /* __USE_TIME_BITS64 */ > }; > > #ifdef __USE_LARGEFILE64 > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include > +# else > __dev_t st_dev; /* Device. */ > unsigned int __pad1; > > @@ -99,7 +106,7 @@ struct stat64 > __blksize_t st_blksize; /* Optimal block size for I/O. */ > > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -# ifdef __USE_XOPEN2K8 > +# 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 > @@ -109,15 +116,16 @@ struct stat64 > struct timespec st_atim; /* Time of last access. */ > struct timespec st_mtim; /* Time of last modification. */ > struct timespec st_ctim; /* Time of last status change. */ > -# else > +# 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 > __ino64_t st_ino; /* File serial number. */ > +# endif /* __USE_TIME_BITS64 */ OK. Reindent. > }; > #endif > > @@ -127,5 +135,4 @@ struct stat64 > /* Nanosecond resolution time values are supported. */ > #define _STATBUF_ST_NSEC > > - Please avoid spurious empty line removal when not related to the patch at hand. > #endif /* _BITS_STRUCT_STAT_H */ > diff --git a/sysdeps/unix/sysv/linux/bits/struct_stat_time64_helper.h b/sysdeps/unix/sysv/linux/bits/struct_stat_time64_helper.h > new file mode 100644 > index 0000000000..77385e9073 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/bits/struct_stat_time64_helper.h > @@ -0,0 +1,63 @@ > +/* Definition for helper to define struct stat with 64 bit time. OK. > + 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 > + . */ > + Reviewing... > + /* Content of internal __stat64_t64 struct. */ > + __dev_t st_dev; /* Device. */ OK. > + __ino64_t st_ino; /* file serial number. */ OK. > + __mode_t st_mode; /* File mode. */ OK. > + __nlink_t st_nlink; /* Link count. */ OK. > + __uid_t st_uid; /* User ID of the file's owner. */ > + __gid_t st_gid; /* Group ID of the file's group. */ OK uid/gid. > + __dev_t st_rdev; /* Device number, if device. */ OK. > + __off64_t st_size; /* Size of file, in bytes. */ OK. > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ OK. Plase add __glibc_reserved4 and __glibc_reserved5 here. > +#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 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 OK. > +#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); OK. > + > +# undef __fieldts64 > +#endif > diff --git a/sysdeps/unix/sysv/linux/m68k/bits/struct_stat.h b/sysdeps/unix/sysv/linux/m68k/bits/struct_stat.h > index 4ae7506eb5..0512ecc3bc 100644 > --- a/sysdeps/unix/sysv/linux/m68k/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/m68k/bits/struct_stat.h > @@ -25,32 +25,35 @@ > > struct stat > { > +#ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +#else > __dev_t st_dev; /* Device. */ > unsigned short int __pad1; > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __ino_t st_ino; /* File serial number. */ > -#else > +# else > __ino_t __st_ino; /* 32bit file serial number. */ > -#endif > +# endif > __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. */ > unsigned short int __pad2; > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __off_t st_size; /* Size of file, in bytes. */ > -#else > +# else > __off64_t st_size; /* Size of file, in bytes. */ > -#endif > +# endif > __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. */ > -#else > +# else > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -#endif > -#ifdef __USE_XOPEN2K8 > +# endif > +# 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 > @@ -60,28 +63,32 @@ struct stat > 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 > +# 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 > -#ifndef __USE_FILE_OFFSET64 > +# endif > +# ifndef __USE_FILE_OFFSET64 > unsigned long int __glibc_reserved4; > unsigned long int __glibc_reserved5; > -#else > +# else > __ino64_t st_ino; /* File serial number. */ > -#endif > +# endif > +#endif /* __USE_TIME_BITS64 */ > }; > > #ifdef __USE_LARGEFILE64 > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper again. > +# else > __dev_t st_dev; /* Device. */ > unsigned short int __pad1; > > @@ -96,7 +103,7 @@ struct stat64 > __blksize_t st_blksize; /* Optimal block size for I/O. */ > > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -# ifdef __USE_XOPEN2K8 > +# 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 > @@ -106,15 +113,16 @@ struct stat64 > struct timespec st_atim; /* Time of last access. */ > struct timespec st_mtim; /* Time of last modification. */ > struct timespec st_ctim; /* Time of last status change. */ > -# else > +# 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 > __ino64_t st_ino; /* File serial number. */ > +# endif /* __USE_TIME_BITS64 */ > }; > #endif > > diff --git a/sysdeps/unix/sysv/linux/microblaze/bits/struct_stat.h b/sysdeps/unix/sysv/linux/microblaze/bits/struct_stat.h > index be1bdc3557..0284d4b2b2 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/microblaze/bits/struct_stat.h > @@ -26,6 +26,9 @@ > #ifndef __USE_FILE_OFFSET64 > struct stat > { > +#ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +#else > __dev_t st_dev; /* Device. */ > __ino_t st_ino; /* File serial number. */ > __mode_t st_mode; /* File mode. */ > @@ -38,7 +41,7 @@ struct stat > __blksize_t st_blksize; /* Optimal block size for I/O. */ > int __pad3; > __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ > -#ifdef __USE_XOPEN2K8 > +# 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 > @@ -48,19 +51,20 @@ struct stat > 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 > +# 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 int __glibc_reserved4; > unsigned int __glibc_reserved5; > +#endif /* __USE_TIME_BITS64 */ > }; > #else /* __USE_FILE_OFFSET64 */ > /* 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. */ > struct stat > { > +#ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +#else > unsigned long long st_dev; /* Device. */ > __ino64_t st_ino; /* 32bit file serial number. */ > __mode_t st_mode; /* File mode. */ > @@ -82,7 +89,7 @@ struct stat > __blksize_t st_blksize; /* Optimal block size for I/O. */ > int __pad3; > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -#ifdef __USE_MISC > +# 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 > @@ -92,25 +99,29 @@ struct stat > 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 > +# 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 int __glibc_reserved4; > unsigned int __glibc_reserved5; > +# endif /* __USE_TIME_BITS64 */ > }; > #endif /* __USE_FILE_OFFSET64 */ > > #ifdef __USE_LARGEFILE64 > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > unsigned long long st_dev; /* Device. */ > __ino64_t st_ino; /* 32bit file serial number. */ > __mode_t st_mode; /* File mode. */ > @@ -123,7 +134,7 @@ struct stat64 > __blksize_t st_blksize; /* Optimal block size for I/O. */ > int __pad3; > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -#ifdef __USE_XOPEN2K8 > +# 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 > @@ -133,19 +144,20 @@ struct stat64 > 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 > +# 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 int __glibc_reserved4; > unsigned int __glibc_reserved5; > +# endif /* __USE_TIME_BITS64 */ > }; > #endif > > diff --git a/sysdeps/unix/sysv/linux/mips/bits/struct_stat.h b/sysdeps/unix/sysv/linux/mips/bits/struct_stat.h > index 7ae4c10827..ab9f474cbc 100644 > --- a/sysdeps/unix/sysv/linux/mips/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/mips/bits/struct_stat.h > @@ -29,28 +29,31 @@ > /* Structure describing file characteristics. */ > struct stat > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > unsigned long int st_dev; > long int st_pad1[3]; > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __ino_t st_ino; /* File serial number. */ > -#else > +# else > __ino64_t st_ino; /* File serial number. */ > -#endif > +# endif > __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.*/ > unsigned long int st_rdev; /* Device number, if device. */ > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > long int st_pad2[2]; > __off_t st_size; /* Size of file, in bytes. */ > /* SVR4 added this extra long to allow for expansion of off_t. */ > long int st_pad3; > -#else > +# else > long int st_pad2[3]; > __off64_t st_size; /* Size of file, in bytes. */ > -#endif > -#ifdef __USE_XOPEN2K8 > +# endif > +# 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 > @@ -60,30 +63,34 @@ struct stat > 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 > +# 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 > __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. */ > -#else > +# else > long int st_pad4; > __blkcnt64_t st_blocks; /* Number of 512-byte blocks allocated. */ > -#endif > +# endif > long int st_pad5[14]; > +# endif /* __USE_TIME_BITS64 */ > }; > > -#ifdef __USE_LARGEFILE64 > +# ifdef __USE_LARGEFILE64 > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > unsigned long int st_dev; > long int st_pad1[3]; > __ino64_t st_ino; /* File serial number. */ > @@ -94,7 +101,7 @@ struct stat64 > unsigned long int st_rdev; /* Device number, if device. */ > long int st_pad2[3]; > __off64_t st_size; /* Size of file, in bytes. */ > -# ifdef __USE_XOPEN2K8 > +# 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 > @@ -104,44 +111,47 @@ struct stat64 > struct timespec st_atim; /* Time of last access. */ > struct timespec st_mtim; /* Time of last modification. */ > struct timespec st_ctim; /* Time of last status change. */ > -# else > +# 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 > __blksize_t st_blksize; /* Optimal block size for I/O. */ > long int st_pad3; > __blkcnt64_t st_blocks; /* Number of 512-byte blocks allocated. */ > long int st_pad4[14]; > +# endif /* __USE_TIME_BITS64 */ > }; > -#endif > -#else > +# endif /* __USE_LARGEFILE64 */ > + > +#else /* _MIPS_SIM != _ABIO32 */ > + > struct stat > { > __dev_t st_dev; > int st_pad1[3]; /* Reserved for st_dev expansion */ > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __ino_t st_ino; > -#else > +# else > __ino64_t st_ino; > -#endif > +# endif > __mode_t st_mode; > __nlink_t st_nlink; > __uid_t st_uid; > __gid_t st_gid; > __dev_t st_rdev; > -#if !defined __USE_FILE_OFFSET64 > +# if !defined __USE_FILE_OFFSET64 > unsigned int st_pad2[2]; /* Reserved for st_rdev expansion */ > __off_t st_size; > int st_pad3; > -#else > +# else > unsigned int st_pad2[3]; /* Reserved for st_rdev expansion */ > __off64_t st_size; > -#endif > -#ifdef __USE_XOPEN2K8 > +# endif > +# 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 > @@ -151,24 +161,24 @@ struct stat > 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 > +# 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 > __blksize_t st_blksize; > unsigned int st_pad4; > -#ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __blkcnt_t st_blocks; > -#else > +# else > __blkcnt64_t st_blocks; > -#endif > +# endif > int st_pad5[14]; > }; > > @@ -185,7 +195,7 @@ struct stat64 > __dev_t st_rdev; > unsigned int st_pad2[3]; /* Reserved for st_rdev expansion */ > __off64_t st_size; > -# ifdef __USE_XOPEN2K8 > +# 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 > @@ -195,20 +205,21 @@ struct stat64 > struct timespec st_atim; /* Time of last access. */ > struct timespec st_mtim; /* Time of last modification. */ > struct timespec st_ctim; /* Time of last status change. */ > -# else > +# 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 > __blksize_t st_blksize; > unsigned int st_pad3; > __blkcnt64_t st_blocks; > int st_pad4[14]; > }; > #endif > + > #endif > > /* Tell code we have these members. */ > diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/struct_stat.h b/sysdeps/unix/sysv/linux/powerpc/bits/struct_stat.h > index 12caab2790..f55eb658a2 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/powerpc/bits/struct_stat.h > @@ -26,35 +26,37 @@ > #include > > #if __WORDSIZE == 32 > - > struct stat > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > __dev_t st_dev; /* Device. */ > -# ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > unsigned short int __pad1; > __ino_t st_ino; /* File serial number. */ > -# else > +# else > __ino64_t st_ino; /* File serial number. */ > -# endif > +# endif > __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. */ > unsigned short int __pad2; > -# ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __off_t st_size; /* Size of file, in bytes. */ > -# else > +# else > __off64_t st_size; /* Size of file, in bytes. */ > -# endif > +# endif > __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. */ > -# else > +# else > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -# endif > -# ifdef __USE_XOPEN2K8 > +# endif > +# 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 > @@ -64,25 +66,28 @@ struct stat > 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 > +# 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 __glibc_reserved4; > unsigned long int __glibc_reserved5; > +# endif /* __USE_TIME_BITS64 */ > }; > > - > # ifdef __USE_LARGEFILE64 > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > __dev_t st_dev; /* Device. */ > __ino64_t st_ino; /* File serial number. */ > __mode_t st_mode; /* File mode. */ > @@ -94,7 +99,7 @@ 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_XOPEN2K8 > +# 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 > @@ -104,19 +109,20 @@ struct stat64 > 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 > +# 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 __glibc_reserved4; > unsigned long int __glibc_reserved5; > +# endif /* __USE_TIME_BITS64 */ > }; > # endif /* __USE_LARGEFILE64 */ > > diff --git a/sysdeps/unix/sysv/linux/s390/bits/struct_stat.h b/sysdeps/unix/sysv/linux/s390/bits/struct_stat.h > index a733622cf5..f2933b8b12 100644 > --- a/sysdeps/unix/sysv/linux/s390/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/s390/bits/struct_stat.h > @@ -65,32 +65,35 @@ struct stat > #else > struct stat > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > __dev_t st_dev; /* Device. */ > unsigned int __pad1; > -# ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __ino_t st_ino; /* File serial number. */ > -# else > +# else > __ino_t __st_ino; /* 32bit file serial number. */ > -# endif > +# endif > __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. */ > unsigned int __pad2; > -# ifndef __USE_FILE_OFFSET64 > +# ifndef __USE_FILE_OFFSET64 > __off_t st_size; /* Size of file, in bytes. */ > -# else > +# else > __off64_t st_size; /* Size of file, in bytes. */ > -# endif > +# endif > __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. */ > -# else > +# else > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -# endif > -# ifdef __USE_XOPEN2K8 > +# endif > +# 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 > @@ -100,25 +103,26 @@ struct stat > 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 > +# 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 > -# ifndef __USE_FILE_OFFSET64 > +# endif > +# ifndef __USE_FILE_OFFSET64 > unsigned long int __glibc_reserved4; > unsigned long int __glibc_reserved5; > -# else > +# else > __ino64_t st_ino; /* File serial number. */ > +# endif > # endif > }; > -#endif > +# endif > > #ifdef __USE_LARGEFILE64 > # if __WORDSIZE == 64 > @@ -162,6 +166,9 @@ struct stat64 > # else > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > __dev_t st_dev; /* Device. */ > unsigned int __pad1; > > @@ -176,7 +183,7 @@ struct stat64 > __blksize_t st_blksize; /* Optimal block size for I/O. */ > > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -# ifdef __USE_XOPEN2K8 > +# 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 > @@ -186,18 +193,19 @@ struct stat64 > 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 > +# 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 > __ino64_t st_ino; /* File serial number. */ > +# endif > }; > # endif > #endif > diff --git a/sysdeps/unix/sysv/linux/struct_stat_time64.h b/sysdeps/unix/sysv/linux/struct_stat_time64.h > index f0a29d7fe5..260d1812be 100644 > --- a/sysdeps/unix/sysv/linux/struct_stat_time64.h > +++ b/sysdeps/unix/sysv/linux/struct_stat_time64.h > @@ -22,64 +22,13 @@ > #if __TIMESIZE == 64 > # define __stat64_t64 stat64 > #else OK. We should be removing much of this file because it was refactored into the helper. > -# ifdef __USE_LARGEFILE64 > -# include > - > -/* 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 > +# include > > struct __stat64_t64 > { > - __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 > - /* 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 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 */ > +# define __struct_timespec struct __timespec64 > +# include OK. As expected, refactored away. > }; > - > -# define _STATBUF_ST_BLKSIZE > -# define _STATBUF_ST_RDEV > -# define _STATBUF_ST_NSEC > - > -# undef __fieldts64 > - > -# endif /* __USE_LARGEFILE64 */ > - > -# endif /* __TIMESIZE == 64 */ > +#endif /* __TIMESIZE == 64 */ > > #endif /* _BITS_STRUCT_STAT_TIME64_H */ > diff --git a/sysdeps/unix/sysv/linux/x86/bits/struct_stat.h b/sysdeps/unix/sysv/linux/x86/bits/struct_stat.h > index 6ddd01db46..01ee7ff6b3 100644 > --- a/sysdeps/unix/sysv/linux/x86/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/x86/bits/struct_stat.h > @@ -25,43 +25,46 @@ > > struct stat > { > +#ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +#else > __dev_t st_dev; /* Device. */ > -#ifndef __x86_64__ > +# ifndef __x86_64__ > unsigned short int __pad1; > -#endif > -#if defined __x86_64__ || !defined __USE_FILE_OFFSET64 > +# endif > +# if defined __x86_64__ || !defined __USE_FILE_OFFSET64 > __ino_t st_ino; /* File serial number. */ > -#else > +# else > __ino_t __st_ino; /* 32bit file serial number. */ > -#endif > -#ifndef __x86_64__ > +# endif > +# ifndef __x86_64__ > __mode_t st_mode; /* File mode. */ > __nlink_t st_nlink; /* Link count. */ > -#else > +# else > __nlink_t st_nlink; /* Link count. */ > __mode_t st_mode; /* File mode. */ > -#endif > +# endif > __uid_t st_uid; /* User ID of the file's owner. */ > __gid_t st_gid; /* Group ID of the file's group.*/ > -#ifdef __x86_64__ > +# ifdef __x86_64__ > int __pad0; > -#endif > +# endif > __dev_t st_rdev; /* Device number, if device. */ > -#ifndef __x86_64__ > +# ifndef __x86_64__ > unsigned short int __pad2; > -#endif > -#if defined __x86_64__ || !defined __USE_FILE_OFFSET64 > +# endif > +# if defined __x86_64__ || !defined __USE_FILE_OFFSET64 > __off_t st_size; /* Size of file, in bytes. */ > -#else > +# else > __off64_t st_size; /* Size of file, in bytes. */ > -#endif > +# endif > __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. */ > -#else > +# else > __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -#endif > -#ifdef __USE_XOPEN2K8 > +# endif > +# 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 > @@ -71,58 +74,62 @@ struct stat > 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 > +# 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. */ > __syscall_ulong_t st_atimensec; /* Nscecs of last access. */ > __time_t st_mtime; /* Time of last modification. */ > __syscall_ulong_t st_mtimensec; /* Nsecs of last modification. */ > __time_t st_ctime; /* Time of last status change. */ > __syscall_ulong_t st_ctimensec; /* Nsecs of last status change. */ > -#endif > -#ifdef __x86_64__ > +# endif > +# ifdef __x86_64__ > __syscall_slong_t __glibc_reserved[3]; > -#else > -# ifndef __USE_FILE_OFFSET64 > +# else > +# ifndef __USE_FILE_OFFSET64 > unsigned long int __glibc_reserved4; > unsigned long int __glibc_reserved5; > -# else > +# else > __ino64_t st_ino; /* File serial number. */ > +# endif > # endif > -#endif > +#endif /* __USE_TIME_BITS64 */ > }; > > #ifdef __USE_LARGEFILE64 > /* Note stat64 has the same shape as stat for x86-64. */ > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include OK. Use helper. > +# else > __dev_t st_dev; /* Device. */ > -# ifdef __x86_64__ > +# ifdef __x86_64__ > __ino64_t st_ino; /* File serial number. */ > __nlink_t st_nlink; /* Link count. */ > __mode_t st_mode; /* File mode. */ > -# else > +# else > unsigned int __pad1; > __ino_t __st_ino; /* 32bit file serial number. */ > __mode_t st_mode; /* File mode. */ > __nlink_t st_nlink; /* Link count. */ > -# endif > +# endif > __uid_t st_uid; /* User ID of the file's owner. */ > __gid_t st_gid; /* Group ID of the file's group.*/ > -# ifdef __x86_64__ > +# ifdef __x86_64__ > int __pad0; > __dev_t st_rdev; /* Device number, if device. */ > __off_t st_size; /* Size of file, in bytes. */ > -# else > +# else > __dev_t st_rdev; /* Device number, if device. */ > unsigned int __pad2; > __off64_t st_size; /* Size of file, in bytes. */ > -# endif > +# endif > __blksize_t st_blksize; /* Optimal block size for I/O. */ > __blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */ > -# ifdef __USE_XOPEN2K8 > +# 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 > @@ -132,19 +139,20 @@ struct stat64 > struct timespec st_atim; /* Time of last access. */ > struct timespec st_mtim; /* Time of last modification. */ > struct timespec st_ctim; /* Time of last status change. */ > -# else > +# else > __time_t st_atime; /* Time of last access. */ > __syscall_ulong_t st_atimensec; /* Nscecs of last access. */ > __time_t st_mtime; /* Time of last modification. */ > __syscall_ulong_t st_mtimensec; /* Nsecs of last modification. */ > __time_t st_ctime; /* Time of last status change. */ > __syscall_ulong_t st_ctimensec; /* Nsecs of last status change. */ > -# endif > -# ifdef __x86_64__ > +# endif > +# ifdef __x86_64__ > __syscall_slong_t __glibc_reserved[3]; > -# else > +# else > __ino64_t st_ino; /* File serial number. */ > -# endif > +# endif > +# endif /* __USE_TIME_BITS64 */ > }; > #endif > > -- Cheers, Carlos.