[PATCH] Make st_*tim visible in stat for POSIX.1-2008
Dionna Amalie Glaze via newlib
newlib@sourceware.org
Wed Aug 14 19:50:00 GMT 2019
Fixed the __MISC_VISIBLE part.
I'm not sure I understand your question. I'm just restructuring how that
code gets exposed. Where previously the timespec and blocks were defined if
rtems, and otherwise just the timespec if srv4 etc, I've changed the
timespec declarations to all be grouped together. The block declarations
are separate because only the #else after defined(__rtems__) is evaluated
false and `defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)` is
evaluated false.
---
newlib/libc/include/sys/stat.h | 64 ++++++++++++++++++----------------
1 file changed, 34 insertions(+), 30 deletions(-)
diff --git a/newlib/libc/include/sys/stat.h b/newlib/libc/include/sys/stat.h
index eee98db64..d7d08e830 100644
--- a/newlib/libc/include/sys/stat.h
+++ b/newlib/libc/include/sys/stat.h
@@ -24,7 +24,7 @@ extern "C" {
#define stat64 stat
#endif
#else
-struct stat
+struct stat
{
dev_t st_dev;
ino_t st_ino;
@@ -34,15 +34,11 @@ struct stat
gid_t st_gid;
dev_t st_rdev;
off_t st_size;
-#if defined(__rtems__)
+#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || defined(__rtems__)
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
- blksize_t st_blksize;
- blkcnt_t st_blocks;
-#else
- /* SysV/sco doesn't have the rest... But Solaris, eabi does. */
-#if defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)
+#elif defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
@@ -53,14 +49,19 @@ struct stat
long st_spare2;
time_t st_ctime;
long st_spare3;
+#endif
+#if defined(__rtems__)
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+/* SysV/sco doesn't have the rest... But Solaris, eabi does. */
+#elif !defined(__svr4__) || defined(__PPC__) || defined(__sun__)
blksize_t st_blksize;
blkcnt_t st_blocks;
long st_spare4[2];
#endif
-#endif
};
-#if defined(__rtems__)
+#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || defined(__rtems__)
On Wed, Aug 14, 2019 at 12:25 PM Yaakov Selkowitz <yselkowi@redhat.com>
wrote:
> On Wed, 2019-08-14 at 12:06 -0700, Dionna Amalie Glaze wrote:
> > Ah you're right, I didn't properly handle the block size definitions.
> > Here's another go at it that splits the timestamp declarations from the
> > blocksize declarations.
> >
> > ---
> > newlib/libc/include/sys/stat.h | 64 ++++++++++++++++++----------------
> > 1 file changed, 34 insertions(+), 30 deletions(-)
> >
> > diff --git a/newlib/libc/include/sys/stat.h
> b/newlib/libc/include/sys/stat.h
> > index eee98db64..4a05081e4 100644
> > --- a/newlib/libc/include/sys/stat.h
> > +++ b/newlib/libc/include/sys/stat.h
> > @@ -24,7 +24,7 @@ extern "C" {
> > #define stat64 stat
> > #endif
> > #else
> > -struct stat
> > +struct stat
> > {
> > dev_t st_dev;
> > ino_t st_ino;
> > @@ -34,15 +34,11 @@ struct stat
> > gid_t st_gid;
> > dev_t st_rdev;
> > off_t st_size;
> > -#if defined(__rtems__)
> > +#if defined(__MISC_VISIBLE) || __POSIX_VISIBLE >= 200809 ||
> defined(__rtems__)
>
> The __*_VISIBLE macros are *always* defined, question is to what.
> These must therefore be used as #if __MISC_VISIBLE etc.
>
> > struct timespec st_atim;
> > struct timespec st_mtim;
> > struct timespec st_ctim;
> > - blksize_t st_blksize;
> > - blkcnt_t st_blocks;
> > -#else
> > - /* SysV/sco doesn't have the rest... But Solaris, eabi does. */
> > -#if defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)
> > +#elif defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)
>
> What defined __srv4__ that should trigger this section? It probably
> needs to be moved before the #if __MISC_VISIBLE etc. hunk.
>
> > time_t st_atime;
> > time_t st_mtime;
> > time_t st_ctime;
> > @@ -53,14 +49,19 @@ struct stat
> > long st_spare2;
> > time_t st_ctime;
> > long st_spare3;
> > +#endif
> > +#if defined(__rtems__)
> > + blksize_t st_blksize;
> > + blkcnt_t st_blocks;
> > +/* SysV/sco doesn't have the rest... But Solaris, eabi does. */
> > +#elif !defined(__svr4__) || defined(__PPC__) || defined(__sun__)
> > blksize_t st_blksize;
> > blkcnt_t st_blocks;
> > long st_spare4[2];
> > #endif
> > -#endif
> > };
> >
> > -#if defined(__rtems__)
> > +#if __POSIX_VISIBLE >= 200809 || defined(__rtems__)
> >
> > On Wed, Aug 14, 2019 at 11:53 AM Yaakov Selkowitz wrote:
> > > On Tue, 2019-08-13 at 11:29 -0700, Dionna Amalie Glaze via newlib
> > > wrote:
> > > > The st_{a,c,m}tim fields are needed for POSIX.1-2008, not just RTEMS.
> > > >
> > > > Signed-off-by: Dionna Glaze <dionnaglaze@google.com>
> > > > ---
> > > > newlib/libc/include/sys/stat.h | 6 ++++--
> > > > 1 file changed, 4 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/newlib/libc/include/sys/stat.h
> > > b/newlib/libc/include/sys/stat.h
> > > > index eee98db64..052ef5a66 100644
> > > > --- a/newlib/libc/include/sys/stat.h
> > > > +++ b/newlib/libc/include/sys/stat.h
> > > > @@ -34,10 +34,12 @@ struct stat
> > > > gid_t st_gid;
> > > > dev_t st_rdev;
> > > > off_t st_size;
> > > > -#if defined(__rtems__)
> > > > +#if defined(__USE_MISC) || __POSIX_VISIBLE >= 200809
> > >
> > > Nak.
> > >
> > > 1) __USE_MISC is a glibc internal and has no meaning within Newlib.
> > > The proper guards must be used.
> > >
> > > 2) This would cause the struct size to vary based on FTMs. This is a
> > > big no-no. There needs to be size equivalent no-ops in an #else chunk
> > > to match this.
> > >
> > > > struct timespec st_atim;
> > > > struct timespec st_mtim;
> > > > struct timespec st_ctim;
> > > > +#endif
> > > > +#if defined(__rtems__)
> > > > blksize_t st_blksize;
> > > > blkcnt_t st_blocks;
> > > > #else
> > > > @@ -60,7 +62,7 @@ struct stat
> > > > #endif
> > > > };
> > > >
> > > > -#if defined(__rtems__)
> > > > +#if __POSIX_VISIBLE >= 200809
> > > > #define st_atime st_atim.tv_sec
> > > > #define st_ctime st_ctim.tv_sec
> > > > #define st_mtime st_mtim.tv_sec
>
> --
> Yaakov Selkowitz
> Senior Software Engineer - Platform Enablement
> Red Hat, Inc.
>
>
>
--
-Dionna Glaze, PhD (she/her)
More information about the Newlib
mailing list