NEWS.stable: log cherry-pick [e446f25]->[c092018] relocatable-shell: Update suggested...
[gnulib.git] / lib / stat-time.h
index 6b02e4c..b3df6eb 100644 (file)
@@ -1,6 +1,6 @@
 /* stat-related time functions.
 
 /* stat-related time functions.
 
-   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007, 2009-2014 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #include <sys/stat.h>
 #include <time.h>
 
 #include <sys/stat.h>
 #include <time.h>
 
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_STAT_TIME_INLINE
+# define _GL_STAT_TIME_INLINE _GL_INLINE
+#endif
+
 /* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
    struct timespec, if available.  If not, then STAT_TIMESPEC_NS (ST,
    ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
 /* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
    struct timespec, if available.  If not, then STAT_TIMESPEC_NS (ST,
    ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
@@ -46,7 +54,7 @@
 #endif
 
 /* Return the nanosecond component of *ST's access time.  */
 #endif
 
 /* Return the nanosecond component of *ST's access time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_atime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
 get_stat_atime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
@@ -59,7 +67,7 @@ get_stat_atime_ns (struct stat const *st)
 }
 
 /* Return the nanosecond component of *ST's status change time.  */
 }
 
 /* Return the nanosecond component of *ST's status change time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_ctime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
 get_stat_ctime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
@@ -72,7 +80,7 @@ get_stat_ctime_ns (struct stat const *st)
 }
 
 /* Return the nanosecond component of *ST's data modification time.  */
 }
 
 /* Return the nanosecond component of *ST's data modification time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_mtime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
 get_stat_mtime_ns (struct stat const *st)
 {
 # if defined STAT_TIMESPEC
@@ -85,7 +93,7 @@ get_stat_mtime_ns (struct stat const *st)
 }
 
 /* Return the nanosecond component of *ST's birth time.  */
 }
 
 /* Return the nanosecond component of *ST's birth time.  */
-static inline long int
+_GL_STAT_TIME_INLINE long int
 get_stat_birthtime_ns (struct stat const *st)
 {
 # if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
 get_stat_birthtime_ns (struct stat const *st)
 {
 # if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
@@ -93,12 +101,14 @@ get_stat_birthtime_ns (struct stat const *st)
 # elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
   return STAT_TIMESPEC_NS (st, st_birthtim);
 # else
 # elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
   return STAT_TIMESPEC_NS (st, st_birthtim);
 # else
+  /* Avoid a "parameter unused" warning.  */
+  (void) st;
   return 0;
 # endif
 }
 
 /* Return *ST's access time.  */
   return 0;
 # endif
 }
 
 /* Return *ST's access time.  */
-static inline struct timespec
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_atime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
 get_stat_atime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
@@ -112,7 +122,7 @@ get_stat_atime (struct stat const *st)
 }
 
 /* Return *ST's status change time.  */
 }
 
 /* Return *ST's status change time.  */
-static inline struct timespec
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_ctime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
 get_stat_ctime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
@@ -126,7 +136,7 @@ get_stat_ctime (struct stat const *st)
 }
 
 /* Return *ST's data modification time.  */
 }
 
 /* Return *ST's data modification time.  */
-static inline struct timespec
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_mtime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
 get_stat_mtime (struct stat const *st)
 {
 #ifdef STAT_TIMESPEC
@@ -140,8 +150,8 @@ get_stat_mtime (struct stat const *st)
 }
 
 /* Return *ST's birth time, if available; otherwise return a value
 }
 
 /* Return *ST's birth time, if available; otherwise return a value
-   with negative tv_nsec.  */
-static inline struct timespec
+   with tv_sec and tv_nsec both equal to -1.  */
+_GL_STAT_TIME_INLINE struct timespec
 get_stat_birthtime (struct stat const *st)
 {
   struct timespec t;
 get_stat_birthtime (struct stat const *st)
 {
   struct timespec t;
@@ -153,15 +163,17 @@ get_stat_birthtime (struct stat const *st)
   t.tv_sec = st->st_birthtime;
   t.tv_nsec = st->st_birthtimensec;
 #elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
   t.tv_sec = st->st_birthtime;
   t.tv_nsec = st->st_birthtimensec;
 #elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
-  /* Woe32 native platforms (but not Cygwin) put the "file creation
+  /* Native Windows platforms (but not Cygwin) put the "file creation
      time" in st_ctime (!).  See
      <http://msdn2.microsoft.com/de-de/library/14h5k7ff(VS.80).aspx>.  */
   t.tv_sec = st->st_ctime;
   t.tv_nsec = 0;
 #else
      time" in st_ctime (!).  See
      <http://msdn2.microsoft.com/de-de/library/14h5k7ff(VS.80).aspx>.  */
   t.tv_sec = st->st_ctime;
   t.tv_nsec = 0;
 #else
-  /* Birth time is not supported.  Set tv_sec to avoid undefined behavior.  */
+  /* Birth time is not supported.  */
   t.tv_sec = -1;
   t.tv_nsec = -1;
   t.tv_sec = -1;
   t.tv_nsec = -1;
+  /* Avoid a "parameter unused" warning.  */
+  (void) st;
 #endif
 
 #if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
 #endif
 
 #if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
@@ -171,13 +183,17 @@ get_stat_birthtime (struct stat const *st)
      using zero.  Attempt to work around this problem.  Alas, this can
      report failure even for valid time stamps.  Also, NetBSD
      sometimes returns junk in the birth time fields; work around this
      using zero.  Attempt to work around this problem.  Alas, this can
      report failure even for valid time stamps.  Also, NetBSD
      sometimes returns junk in the birth time fields; work around this
-     bug if it it is detected.  There's no need to detect negative
-     tv_nsec junk as negative tv_nsec already indicates an error.  */
-  if (t.tv_sec == 0 || 1000000000 <= t.tv_nsec)
-    t.tv_nsec = -1;
+     bug if it is detected.  */
+  if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000))
+    {
+      t.tv_sec = -1;
+      t.tv_nsec = -1;
+    }
 #endif
 
   return t;
 }
 
 #endif
 
   return t;
 }
 
+_GL_INLINE_HEADER_END
+
 #endif
 #endif