[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