]> arthur.barton.de Git - bup.git/commitdiff
Test for available nanosecond stat timestamp members.
authorRob Browning <rlb@defaultvalue.org>
Wed, 1 Jun 2011 00:49:32 +0000 (19:49 -0500)
committerAvery Pennarun <apenwarr@gmail.com>
Thu, 9 Jun 2011 03:12:24 +0000 (23:12 -0400)
Use st_atim, st_mtim, and st_ctim when available, and fall back to
st_atimensec, st_mtimensec, and st_ctimensec.  If neither are
available, return 0 ns values.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
config/configure
lib/bup/_helpers.c

index feb2a28b27316d9b1a5c840623c67ae88559ff07..20b1b0101b4f1d2ac1d9b4294ddd08e408815964 100755 (executable)
@@ -50,7 +50,10 @@ MF_PATH_INCLUDE GIT git
 MF_PATH_INCLUDE TAR tar gtar
 MF_PATH_INCLUDE PYTHON python
 
-AC_CHECK_HEADERS sys/stat.h 
+# For stat.
+AC_CHECK_HEADERS sys/stat.h
+AC_CHECK_HEADERS sys/types.h
+AC_CHECK_HEADERS unistd.h
 
 # For FS_IOC_GETFLAGS and FS_IOC_SETFLAGS.
 AC_CHECK_HEADERS linux/fs.h
@@ -59,4 +62,12 @@ AC_CHECK_HEADERS sys/ioctl.h
 AC_CHECK_FUNCS utimensat 
 AC_CHECK_FUNCS utime
 
+AC_CHECK_FIELD stat st_atim sys/types.h sys/stat.h unistd.h
+AC_CHECK_FIELD stat st_mtim sys/types.h sys/stat.h unistd.h
+AC_CHECK_FIELD stat st_ctim sys/types.h sys/stat.h unistd.h
+
+AC_CHECK_FIELD stat st_atimensec sys/types.h sys/stat.h unistd.h
+AC_CHECK_FIELD stat st_mtimensec sys/types.h sys/stat.h unistd.h
+AC_CHECK_FIELD stat st_ctimensec sys/types.h sys/stat.h unistd.h
+
 AC_OUTPUT config.vars
index 2dd2ef25389104413f6cd63cb51c8963f23b2dcf..3b9fcc130b33d5cf1b8375e937d578d5307b1e82 100644 (file)
@@ -8,11 +8,18 @@
 #include <fcntl.h>
 #include <arpa/inet.h>
 #include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
+#endif
 
 #ifdef HAVE_LINUX_FS_H
 #include <linux/fs.h>
@@ -767,20 +774,40 @@ static PyObject *bup_utimensat(PyObject *self, PyObject *args)
           || _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L */
 #endif /* HAVE_UTIMENSAT */
 
+
+#ifdef HAVE_STAT_ST_ATIM
+# define BUP_STAT_ATIME_NS(st) (st)->st_atim.tv_nsec
+# define BUP_STAT_MTIME_NS(st) (st)->st_mtim.tv_nsec
+# define BUP_STAT_CTIME_NS(st) (st)->st_ctim.tv_nsec
+#elif defined HAVE_STAT_ST_ATIMENSEC
+# define BUP_STAT_ATIME_NS(st) (st)->st_atimespec.tv_nsec
+# define BUP_STAT_MTIME_NS(st) (st)->st_mtimespec.tv_nsec
+# define BUP_STAT_CTIME_NS(st) (st)->st_ctimespec.tv_nsec
+#else
+# define BUP_STAT_ATIME_NS(st) 0
+# define BUP_STAT_MTIME_NS(st) 0
+# define BUP_STAT_CTIME_NS(st) 0
+#endif
+
+
 static PyObject *stat_struct_to_py(const struct stat *st)
 {
+    long atime_ns = BUP_STAT_ATIME_NS(st);
+    long mtime_ns = BUP_STAT_MTIME_NS(st);
+    long ctime_ns = BUP_STAT_CTIME_NS(st);
+
     /* Enforce the current timespec nanosecond range expectations. */
-    if (st->st_atim.tv_nsec < 0 || st->st_atim.tv_nsec > 999999999)
+    if (atime_ns < 0 || atime_ns > 999999999)
     {
         PyErr_SetString(PyExc_ValueError, "invalid atime timespec nanoseconds");
         return NULL;
     }
-    if (st->st_mtim.tv_nsec < 0 || st->st_mtim.tv_nsec > 999999999)
+    if (mtime_ns < 0 || mtime_ns > 999999999)
     {
         PyErr_SetString(PyExc_ValueError, "invalid mtime timespec nanoseconds");
         return NULL;
     }
-    if (st->st_ctim.tv_nsec < 0 || st->st_ctim.tv_nsec > 999999999)
+    if (ctime_ns < 0 || ctime_ns > 999999999)
     {
         PyErr_SetString(PyExc_ValueError, "invalid ctime timespec nanoseconds");
         return NULL;
@@ -796,11 +823,11 @@ static PyObject *stat_struct_to_py(const struct stat *st)
                          (unsigned long) st->st_rdev,
                          (unsigned long) st->st_size,
                          (long long) st->st_atime,
-                         (long) st->st_atim.tv_nsec,
+                         (long) atime_ns,
                          (long long) st->st_mtime,
-                         (long) st->st_mtim.tv_nsec,
+                         (long) mtime_ns,
                          (long long) st->st_ctime,
-                         (long) st->st_ctim.tv_nsec);
+                         (long) ctime_ns);
 }