tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

sys/stat.h



Hi,

I am working on MINIX, which is using NetBSD code for the userland.
I am implementing utimens() and friends into MINIX, and while here I had
to look in deep at sys/stat.h, where the declarations are.

I noticed a number of small problems there; most (all?) are related to
compliance with the various standards, so I post here since I believe it
is the most appropriate place.

I believe the only change which is visible within _NETBSD_SOURCE is the
swap of the main name for the timespec members from st_xtimespec to
st_xtim as POSIX:2008 mandates, with a compatibility macro for the
alternate; I also applied the same change to st_birthtim.
Something I did not change but you might consider is the #define
st_birthtimensec which is using a space, not a tab. Purely cosmetic.


Please check before applying anything that the resulting code is OK with
your tree: my work is mainly done on MINIX not on NetBSD-current, so I
do not have the same stable base as you.

I hope this will improve both projects.


Antoine
Index: stat.h
===================================================================
RCS file: /cvsroot/src/sys/sys/stat.h,v
retrieving revision 1.65
diff -u -r1.65 stat.h
--- stat.h      1 Dec 2012 08:20:55 -0000       1.65
+++ stat.h      5 Apr 2013 21:45:20 -0000
@@ -44,6 +44,17 @@
 
 #if defined(_NETBSD_SOURCE)
 #include <sys/time.h>
+#elif (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0) >= 700
+/*
+ * POSIX:2008 / XPG7 requires struct timespec to be declared in
+ * this header, but does not provide the usual exemption
+ * "inclusion of this header may make visible symbols defined in <time.h>".
+ *
+ * This is a Standard omission, acknowledged by the committee and
+ * scheduled to be corrected in Technical Corrigendum 2, according to
+ * http://austingroupbugs.net/view.php?id=531
+ */
+#include <sys/time.h>
 #endif
 
 struct stat {
@@ -54,11 +65,12 @@
        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 type */
-#if defined(_NETBSD_SOURCE)
-       struct    timespec st_atimespec;/* time of last access */
-       struct    timespec st_mtimespec;/* time of last data modification */
-       struct    timespec st_ctimespec;/* time of last file status change */
-       struct    timespec st_birthtimespec; /* time of creation */
+#if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0) >= 700 || \
+    defined(_NETBSD_SOURCE)
+       struct    timespec st_atim;     /* time of last access */
+       struct    timespec st_mtim;     /* time of last data modification */
+       struct    timespec st_ctim;     /* time of last file status change */
+       struct    timespec st_birthtim; /* time of creation */
 #else
        time_t    st_atime;             /* time of last access */
        long      st_atimensec;         /* nsec of last access */
@@ -77,14 +89,23 @@
        uint32_t  st_spare[2];
 };
 
+#if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0) >= 700 || \
+    defined(_NETBSD_SOURCE)
+/* Standard-mandated compatibility */
+#define        st_atime                st_atim.tv_sec
+#define        st_mtime                st_mtim.tv_sec
+#define        st_ctime                st_ctim.tv_sec
+#define        st_birthtime            st_birthtim.tv_sec
+#endif
+
 #if defined(_NETBSD_SOURCE)
-#define        st_atime                st_atimespec.tv_sec
+#define        st_atimespec            st_atim
 #define        st_atimensec            st_atimespec.tv_nsec
-#define        st_mtime                st_mtimespec.tv_sec
+#define        st_mtimespec            st_mtim
 #define        st_mtimensec            st_mtimespec.tv_nsec
-#define        st_ctime                st_ctimespec.tv_sec
+#define        st_ctimespec            st_ctim
 #define        st_ctimensec            st_ctimespec.tv_nsec
-#define st_birthtime           st_birthtimespec.tv_sec
+#define        st_birthtimespec        st_birthtim
 #define st_birthtimensec       st_birthtimespec.tv_nsec
 #endif
 
@@ -207,11 +228,14 @@
 #endif /* _KERNEL */
 #endif /* _NETBSD_SOURCE */
 
+#if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0) >= 700 || \
+    defined(_NETBSD_SOURCE)
 /*
  * Special values for utimensat and futimens
  */
 #define UTIME_NOW      ((1 << 30) - 1)
 #define UTIME_OMIT     ((1 << 30) - 2)
+#endif
 
 #if !defined(_KERNEL) && !defined(_STANDALONE)
 #include <sys/cdefs.h>
@@ -225,10 +249,15 @@
 int    fstat(int, struct stat *) __RENAME(__fstat50);
 #endif
 mode_t umask(mode_t);
+#if (_POSIX_C_SOURCE - 0) >= 200112L || defined(_XOPEN_SOURCE) || \
+    defined(_NETBSD_SOURCE)
+#ifndef __LIBC12_SOURCE__
+int    lstat(const char *, struct stat *) __RENAME(__lstat50);
+#endif
+#endif /* _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE || _NETBSD_SOURCE */
 #if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
 int    fchmod(int, mode_t);
 #ifndef __LIBC12_SOURCE__
-int    lstat(const char *, struct stat *) __RENAME(__lstat50);
 int    mknod(const char *, mode_t, dev_t) __RENAME(__mknod50);
 #endif
 #endif /* defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) */
@@ -244,7 +273,7 @@
 /*
  * X/Open Extended API set 2 (a.k.a. C063)
  */
-#if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0 >= 700) || \
+#if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0) >= 700 || \
     defined(_INCOMPLETE_XOPEN_C063) || defined(_NETBSD_SOURCE)
 int     fstatat(int, const char *, struct stat *, int);
 int     utimensat(int, const char *, const struct timespec *, int);
@@ -254,8 +283,11 @@
 int utimens(const char *, const struct timespec *);
 int lutimens(const char *, const struct timespec *);
 #endif
+#if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0) >= 700 || \
+    defined(_NETBSD_SOURCE)
 int futimens(int, const struct timespec *);
 #endif
+#endif
 
 __END_DECLS
 


Home | Main Index | Thread Index | Old Index