From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS17314 8.43.84.0/22 X-Spam-Status: No, score=-4.2 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI,NICE_REPLY_A, RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id DA1D11F601 for ; Mon, 5 Dec 2022 16:40:02 +0000 (UTC) Authentication-Results: dcvr.yhbt.net; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="BiVRV1XR"; dkim-atps=neutral Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C6716393BC21 for ; Mon, 5 Dec 2022 16:40:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C6716393BC21 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670258401; bh=xFeliTXJOvV7HZz73vHPQZlEAkJfbs44sOGskrLcxWY=; h=Date:Subject:To:References:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=BiVRV1XRLoVlZHgtC4SRxIE3v2wYua+SQu3LVH+UqvimSs+4x02mIP7eLxok6oqO3 ismIVlsJE2Z+grSAtpzNjzhU8zSeOknfiUgmcmIQebOwF38DpSjNzWJQkAwRFCF8Xf LzNX2Fj3JGU/AClJJ0Dyui5NsLzoAtqpORBJk7kA= Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 5055E393FC2E for ; Mon, 5 Dec 2022 16:39:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5055E393FC2E Received: from mail-io1-f69.google.com (mail-io1-f69.google.com [209.85.166.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-210-EyaaQ6rcMnSvHFl_W1OLkQ-1; Mon, 05 Dec 2022 11:39:35 -0500 X-MC-Unique: EyaaQ6rcMnSvHFl_W1OLkQ-1 Received: by mail-io1-f69.google.com with SMTP id p3-20020a6bfa03000000b006df8582e11cso10261622ioh.22 for ; Mon, 05 Dec 2022 08:39:35 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=xFeliTXJOvV7HZz73vHPQZlEAkJfbs44sOGskrLcxWY=; b=df0KF5l5Oo0heeWScyB6o30kDuE+GMl1JS9slJ+T7x50GVqJBFqxE3i25VfWx/tIgN QK2N3wt8ibUdIaJj38oyJdCG3tePsERBK8wgmWYbnkrmQOkUk2P8QkXEkfqCov99Zs49 xb6ejehMYoeUAWlw3QzWVqO5mKY7h95gkPnPO0905R+ZdxPI9lzObpPAg4A1IpZ8nzMd QVhc1a+g6pzz7yyN5Jr1TUrPJJTXoZmtOLKQqcUXj1kI7Uxts+2uiruUHJ/YVldZ0mXH X66l4qOXreJLQ/7cKg69VgBDzGOcHfxauEHhLdtoBGkFdqTLZCcjmXSMWmM5sh5EaP13 5hIA== X-Gm-Message-State: ANoB5pl0Q//hhJUTV3kN2t1lFMxU/vmREHY+VZps32eSuqxki+X8TTmk HGzZvLfs2iSE+dWak0qZ4KUM0Nm3VG7D7Ku1rfvdZf5ceh9R/PAGRu98gcpr+m9iVMgPlVLaE0q R5yP5ch0sHQED3UaHFbdC X-Received: by 2002:a05:6638:3783:b0:374:f6b1:d5e5 with SMTP id w3-20020a056638378300b00374f6b1d5e5mr31053833jal.114.1670258373578; Mon, 05 Dec 2022 08:39:33 -0800 (PST) X-Google-Smtp-Source: AA0mqf51XIKQkb5mSVfj1x24PMMqNNW+gDK4jHhRZA489JEFOzOkTXU7i01T+o1gUhBwhVadkRZ3WA== X-Received: by 2002:a05:6638:3783:b0:374:f6b1:d5e5 with SMTP id w3-20020a056638378300b00374f6b1d5e5mr31053816jal.114.1670258372865; Mon, 05 Dec 2022 08:39:32 -0800 (PST) Received: from [192.168.0.241] (192-0-145-146.cpe.teksavvy.com. [192.0.145.146]) by smtp.gmail.com with ESMTPSA id b6-20020a926706000000b003033505d81esm4248581ilc.58.2022.12.05.08.39.31 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 05 Dec 2022 08:39:32 -0800 (PST) Message-ID: <42e229d9-a57c-6632-2ef3-8c5982797016@redhat.com> Date: Mon, 5 Dec 2022 11:39:31 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.0 Subject: Re: [PATCH 01/30] linux: Fix generic struct_stat for 64 bit time (BZ# 29657) To: Adhemerval Zanella , libc-alpha@sourceware.org References: <20221019221433.1082017-1-adhemerval.zanella@linaro.org> <20221019221433.1082017-2-adhemerval.zanella@linaro.org> Organization: Red Hat In-Reply-To: <20221019221433.1082017-2-adhemerval.zanella@linaro.org> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit 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: , From: Carlos O'Donell via Libc-alpha Reply-To: Carlos O'Donell Errors-To: libc-alpha-bounces+e=80x24.org@sourceware.org Sender: "Libc-alpha" On 10/19/22 18:14, Adhemerval Zanella via Libc-alpha wrote: > The generic Linux struct_stat misses the conditionals to use > bits/struct_stat_time64_helper.h in the __USE_TIME_BITS64 for > architecture that uses __TIMESIZE == 32 (currently csky and nios2). > > Since newer ports should not support 32 bit time_t, the generic > implementation should be used as default. Agreed. > For arm, hppa, and sh a copy of default struct_stat is added, > while for cky and nios a new one based on generic is used, along > with conditionals to use bits/struct_stat_time64_helper.h. > > The default struct_stat is also replaced with the generic one. > > Checked on aarch64-linux-gnu and arm-linux-gnueabihf. LGTM. No regressions on x86_64 and i686. Reviewed-by: Carlos O'Donell Tested-by: Carlos O'Donell > --- > .../unix/sysv/linux/arm/bits/struct_stat.h | 139 ++++++++++++++++++ > sysdeps/unix/sysv/linux/bits/struct_stat.h | 116 +++++++-------- > .../{generic => csky}/bits/struct_stat.h | 28 ++-- > .../unix/sysv/linux/hppa/bits/struct_stat.h | 139 ++++++++++++++++++ > .../unix/sysv/linux/nios2/bits/struct_stat.h | 135 +++++++++++++++++ > sysdeps/unix/sysv/linux/sh/bits/struct_stat.h | 139 ++++++++++++++++++ > 6 files changed, 622 insertions(+), 74 deletions(-) > create mode 100644 sysdeps/unix/sysv/linux/arm/bits/struct_stat.h > rename sysdeps/unix/sysv/linux/{generic => csky}/bits/struct_stat.h (92%) > create mode 100644 sysdeps/unix/sysv/linux/hppa/bits/struct_stat.h > create mode 100644 sysdeps/unix/sysv/linux/nios2/bits/struct_stat.h > create mode 100644 sysdeps/unix/sysv/linux/sh/bits/struct_stat.h > > diff --git a/sysdeps/unix/sysv/linux/arm/bits/struct_stat.h b/sysdeps/unix/sysv/linux/arm/bits/struct_stat.h > new file mode 100644 > index 0000000000..30ee6279d2 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/arm/bits/struct_stat.h > @@ -0,0 +1,139 @@ > +/* Definition for struct stat. Linux/arm version. > + Copyright (C) 2020-2022 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 > + . */ > + > +#if !defined _SYS_STAT_H && !defined _FCNTL_H > +# error "Never include directly; use instead." > +#endif > + > +#ifndef _BITS_STRUCT_STAT_H > +#define _BITS_STRUCT_STAT_H 1 > + > +#include > +#include > + > +struct stat > + { > +#ifdef __USE_TIME_BITS64 > +# include > +#else > + __dev_t st_dev; /* Device. */ > + unsigned short int __pad1; > +# ifndef __USE_FILE_OFFSET64 > + __ino_t st_ino; /* File serial number. */ > +# else > + __ino_t __st_ino; /* 32bit file serial number. */ > +# 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 > + __off_t st_size; /* Size of file, in bytes. */ > +# else > + __off64_t st_size; /* Size of file, in bytes. */ > +# endif > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + > +# ifndef __USE_FILE_OFFSET64 > + __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ > +# else > + __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > +# 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 > + 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; /* 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 > +# ifndef __USE_FILE_OFFSET64 > + unsigned long int __glibc_reserved4; > + unsigned long int __glibc_reserved5; > +# else > + __ino64_t st_ino; /* File serial number. */ > +# endif > +#endif /* __USE_TIME_BITS64 */ > + }; > + > +#ifdef __USE_LARGEFILE64 > +struct stat64 > + { > +# ifdef __USE_TIME_BITS64 > +# include > +# else > + __dev_t st_dev; /* Device. */ > + unsigned int __pad1; > + > + __ino_t __st_ino; /* 32bit 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. */ > + unsigned int __pad2; > + __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 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 > + __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 > + __ino64_t st_ino; /* File serial number. */ > +# endif /* __USE_TIME_BITS64 */ > + }; > +#endif > + > +/* Tell code we have these members. */ > +#define _STATBUF_ST_BLKSIZE > +#define _STATBUF_ST_RDEV > +/* Nanosecond resolution time values are supported. */ > +#define _STATBUF_ST_NSEC > + > + > +#endif /* _BITS_STRUCT_STAT_H */ > diff --git a/sysdeps/unix/sysv/linux/bits/struct_stat.h b/sysdeps/unix/sysv/linux/bits/struct_stat.h > index 25bd6cb638..fb11a3fba4 100644 > --- a/sysdeps/unix/sysv/linux/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/bits/struct_stat.h > @@ -26,37 +26,36 @@ > #include > #include > > -struct stat > - { > -#ifdef __USE_TIME_BITS64 > -# include > -#else > - __dev_t st_dev; /* Device. */ > - unsigned short int __pad1; > -# ifndef __USE_FILE_OFFSET64 > - __ino_t st_ino; /* File serial number. */ > -# else > - __ino_t __st_ino; /* 32bit file serial number. */ > +#if defined __USE_FILE_OFFSET64 > +# define __field64(type, type64, name) type64 name > +#elif __WORDSIZE == 64 || defined __INO_T_MATCHES_INO64_T > +# if defined __INO_T_MATCHES_INO64_T && !defined __OFF_T_MATCHES_OFF64_T > +# error "ino_t and off_t must both be the same type" > # 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 > - __off_t st_size; /* Size of file, in bytes. */ > -# else > - __off64_t st_size; /* Size of file, in bytes. */ > -# endif > - __blksize_t st_blksize; /* Optimal block size for I/O. */ > +# define __field64(type, type64, name) type name > +#elif __BYTE_ORDER == __LITTLE_ENDIAN > +# define __field64(type, type64, name) \ > + type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad > +#else > +# define __field64(type, type64, name) \ > + int __##name##_pad __attribute__((__aligned__ (__alignof__ (type64)))); type name > +#endif > > -# ifndef __USE_FILE_OFFSET64 > - __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ > -# else > - __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > -# endif > -# ifdef __USE_XOPEN2K8 > +struct stat > + { > + __dev_t st_dev; /* Device. */ > + __field64(__ino_t, __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. */ > + __dev_t __pad1; > + __field64(__off_t, __off64_t, st_size); /* Size of file, in bytes. */ > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + int __pad2; > + __field64(__blkcnt_t, __blkcnt64_t, st_blocks); /* 512-byte blocks */ > +#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 > @@ -66,47 +65,38 @@ 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 > - unsigned long int __glibc_reserved4; > - unsigned long int __glibc_reserved5; > -# else > - __ino64_t st_ino; /* File serial number. */ > -# endif > -#endif /* __USE_TIME_BITS64 */ > +#endif > + int __glibc_reserved[2]; > }; > > +#undef __field64 > + > #ifdef __USE_LARGEFILE64 > struct stat64 > { > -# ifdef __USE_TIME_BITS64 > -# include > -# else > - __dev_t st_dev; /* Device. */ > - unsigned int __pad1; > - > - __ino_t __st_ino; /* 32bit 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. */ > - unsigned int __pad2; > - __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 > + __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. */ > + __dev_t __pad1; > + __off64_t st_size; /* Size of file, in bytes. */ > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + int __pad2; > + __blkcnt64_t st_blocks; /* Nr. 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 > @@ -116,16 +106,15 @@ 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 > - __ino64_t st_ino; /* File serial number. */ > -# endif /* __USE_TIME_BITS64 */ > +#endif > + int __glibc_reserved[2]; > }; > #endif > > @@ -135,5 +124,4 @@ struct stat64 > /* Nanosecond resolution time values are supported. */ > #define _STATBUF_ST_NSEC > > - > #endif /* _BITS_STRUCT_STAT_H */ > diff --git a/sysdeps/unix/sysv/linux/generic/bits/struct_stat.h b/sysdeps/unix/sysv/linux/csky/bits/struct_stat.h > similarity index 92% > rename from sysdeps/unix/sysv/linux/generic/bits/struct_stat.h > rename to sysdeps/unix/sysv/linux/csky/bits/struct_stat.h > index fb11a3fba4..f0ee455748 100644 > --- a/sysdeps/unix/sysv/linux/generic/bits/struct_stat.h > +++ b/sysdeps/unix/sysv/linux/csky/bits/struct_stat.h > @@ -1,4 +1,4 @@ > -/* Definition for struct stat. > +/* Definition for struct stat. Linux/csky version. > Copyright (C) 2020-2022 Free Software Foundation, Inc. > This file is part of the GNU C Library. > > @@ -43,6 +43,9 @@ > > struct stat > { > +#ifdef __USE_TIME_BITS64 > +# include > +#else > __dev_t st_dev; /* Device. */ > __field64(__ino_t, __ino64_t, st_ino); /* File serial number. */ > __mode_t st_mode; /* File mode. */ > @@ -55,7 +58,7 @@ struct stat > __blksize_t st_blksize; /* Optimal block size for I/O. */ > int __pad2; > __field64(__blkcnt_t, __blkcnt64_t, st_blocks); /* 512-byte blocks */ > -#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 > @@ -65,18 +68,19 @@ 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 > int __glibc_reserved[2]; > +#endif > }; > > #undef __field64 > @@ -84,6 +88,9 @@ struct stat > #ifdef __USE_LARGEFILE64 > struct stat64 > { > +# ifdef __USE_TIME_BITS64 > +# include > +# else > __dev_t st_dev; /* Device. */ > __ino64_t st_ino; /* File serial number. */ > __mode_t st_mode; /* File mode. */ > @@ -96,7 +103,7 @@ struct stat64 > __blksize_t st_blksize; /* Optimal block size for I/O. */ > int __pad2; > __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 > @@ -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 > int __glibc_reserved[2]; > +# endif > }; > #endif > > diff --git a/sysdeps/unix/sysv/linux/hppa/bits/struct_stat.h b/sysdeps/unix/sysv/linux/hppa/bits/struct_stat.h > new file mode 100644 > index 0000000000..38b6e13e68 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/hppa/bits/struct_stat.h > @@ -0,0 +1,139 @@ > +/* Definition for struct stat. Linux/hppa version. > + Copyright (C) 2020-2022 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 > + . */ > + > +#if !defined _SYS_STAT_H && !defined _FCNTL_H > +# error "Never include directly; use instead." > +#endif > + > +#ifndef _BITS_STRUCT_STAT_H > +#define _BITS_STRUCT_STAT_H 1 > + > +#include > +#include > + > +struct stat > + { > +#ifdef __USE_TIME_BITS64 > +# include > +#else > + __dev_t st_dev; /* Device. */ > + unsigned short int __pad1; > +# ifndef __USE_FILE_OFFSET64 > + __ino_t st_ino; /* File serial number. */ > +# else > + __ino_t __st_ino; /* 32bit file serial number. */ > +# 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 > + __off_t st_size; /* Size of file, in bytes. */ > +# else > + __off64_t st_size; /* Size of file, in bytes. */ > +# endif > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + > +# ifndef __USE_FILE_OFFSET64 > + __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ > +# else > + __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > +# 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 > + 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; /* 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 > +# ifndef __USE_FILE_OFFSET64 > + unsigned long int __glibc_reserved4; > + unsigned long int __glibc_reserved5; > +# else > + __ino64_t st_ino; /* File serial number. */ > +# endif > +#endif /* __USE_TIME_BITS64 */ > + }; > + > +#ifdef __USE_LARGEFILE64 > +struct stat64 > + { > +# ifdef __USE_TIME_BITS64 > +# include > +# else > + __dev_t st_dev; /* Device. */ > + unsigned int __pad1; > + > + __ino_t __st_ino; /* 32bit 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. */ > + unsigned int __pad2; > + __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 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 > + __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 > + __ino64_t st_ino; /* File serial number. */ > +# endif /* __USE_TIME_BITS64 */ > + }; > +#endif > + > +/* Tell code we have these members. */ > +#define _STATBUF_ST_BLKSIZE > +#define _STATBUF_ST_RDEV > +/* Nanosecond resolution time values are supported. */ > +#define _STATBUF_ST_NSEC > + > + > +#endif /* _BITS_STRUCT_STAT_H */ > diff --git a/sysdeps/unix/sysv/linux/nios2/bits/struct_stat.h b/sysdeps/unix/sysv/linux/nios2/bits/struct_stat.h > new file mode 100644 > index 0000000000..e00e71173e > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/nios2/bits/struct_stat.h > @@ -0,0 +1,135 @@ > +/* Definition for struct stat. Linux/nios2 version. > + Copyright (C) 2020-2022 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 > + . */ > + > +#if !defined _SYS_STAT_H && !defined _FCNTL_H > +# error "Never include directly; use instead." > +#endif > + > +#ifndef _BITS_STRUCT_STAT_H > +#define _BITS_STRUCT_STAT_H 1 > + > +#include > +#include > + > +#if defined __USE_FILE_OFFSET64 > +# define __field64(type, type64, name) type64 name > +#elif __WORDSIZE == 64 || defined __INO_T_MATCHES_INO64_T > +# if defined __INO_T_MATCHES_INO64_T && !defined __OFF_T_MATCHES_OFF64_T > +# error "ino_t and off_t must both be the same type" > +# endif > +# define __field64(type, type64, name) type name > +#elif __BYTE_ORDER == __LITTLE_ENDIAN > +# define __field64(type, type64, name) \ > + type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad > +#else > +# define __field64(type, type64, name) \ > + int __##name##_pad __attribute__((__aligned__ (__alignof__ (type64)))); type name > +#endif > + > +struct stat > + { > +#ifdef __USE_TIME_BITS64 > +# include > +#else > + __dev_t st_dev; /* Device. */ > + __field64(__ino_t, __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. */ > + __dev_t __pad1; > + __field64(__off_t, __off64_t, st_size); /* Size of file, in bytes. */ > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + int __pad2; > + __field64(__blkcnt_t, __blkcnt64_t, st_blocks); /* 512-byte blocks */ > +# 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 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 > + int __glibc_reserved[2]; > +#endif > + }; > + > +#undef __field64 > + > +#ifdef __USE_LARGEFILE64 > +struct stat64 > + { > +# ifdef __USE_TIME_BITS64 > +# include > +# else > + __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. */ > + __dev_t __pad1; > + __off64_t st_size; /* Size of file, in bytes. */ > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + int __pad2; > + __blkcnt64_t st_blocks; /* Nr. 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 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 > + __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 > + int __glibc_reserved[2]; > +# endif > + }; > +#endif > + > +/* Tell code we have these members. */ > +#define _STATBUF_ST_BLKSIZE > +#define _STATBUF_ST_RDEV > +/* Nanosecond resolution time values are supported. */ > +#define _STATBUF_ST_NSEC > + > +#endif /* _BITS_STRUCT_STAT_H */ > diff --git a/sysdeps/unix/sysv/linux/sh/bits/struct_stat.h b/sysdeps/unix/sysv/linux/sh/bits/struct_stat.h > new file mode 100644 > index 0000000000..0f7c9cdc89 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/sh/bits/struct_stat.h > @@ -0,0 +1,139 @@ > +/* Definition for struct stat. Linux/sh version. > + Copyright (C) 2020-2022 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 > + . */ > + > +#if !defined _SYS_STAT_H && !defined _FCNTL_H > +# error "Never include directly; use instead." > +#endif > + > +#ifndef _BITS_STRUCT_STAT_H > +#define _BITS_STRUCT_STAT_H 1 > + > +#include > +#include > + > +struct stat > + { > +#ifdef __USE_TIME_BITS64 > +# include > +#else > + __dev_t st_dev; /* Device. */ > + unsigned short int __pad1; > +# ifndef __USE_FILE_OFFSET64 > + __ino_t st_ino; /* File serial number. */ > +# else > + __ino_t __st_ino; /* 32bit file serial number. */ > +# 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 > + __off_t st_size; /* Size of file, in bytes. */ > +# else > + __off64_t st_size; /* Size of file, in bytes. */ > +# endif > + __blksize_t st_blksize; /* Optimal block size for I/O. */ > + > +# ifndef __USE_FILE_OFFSET64 > + __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ > +# else > + __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ > +# 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 > + 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; /* 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 > +# ifndef __USE_FILE_OFFSET64 > + unsigned long int __glibc_reserved4; > + unsigned long int __glibc_reserved5; > +# else > + __ino64_t st_ino; /* File serial number. */ > +# endif > +#endif /* __USE_TIME_BITS64 */ > + }; > + > +#ifdef __USE_LARGEFILE64 > +struct stat64 > + { > +# ifdef __USE_TIME_BITS64 > +# include > +# else > + __dev_t st_dev; /* Device. */ > + unsigned int __pad1; > + > + __ino_t __st_ino; /* 32bit 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. */ > + unsigned int __pad2; > + __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 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 > + __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 > + __ino64_t st_ino; /* File serial number. */ > +# endif /* __USE_TIME_BITS64 */ > + }; > +#endif > + > +/* Tell code we have these members. */ > +#define _STATBUF_ST_BLKSIZE > +#define _STATBUF_ST_RDEV > +/* Nanosecond resolution time values are supported. */ > +#define _STATBUF_ST_NSEC > + > + > +#endif /* _BITS_STRUCT_STAT_H */ -- Cheers, Carlos.