]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Use utimes(2) where available to support microsecond timestamps.
authorMartin v. Löwis <martin@v.loewis.de>
Tue, 10 Sep 2002 09:16:13 +0000 (09:16 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Tue, 10 Sep 2002 09:16:13 +0000 (09:16 +0000)
Modules/posixmodule.c
configure
configure.in
pyconfig.h.in

index 0c409aeabd512cf3be138e684a457908696650b5..e442e7907b34177a613c0a0893aa9679944471d2 100644 (file)
@@ -1400,6 +1400,31 @@ posix_uname(PyObject *self, PyObject *args)
 }
 #endif /* HAVE_UNAME */
 
+static int
+extract_time(PyObject *t, long* sec, long* usec)
+{
+       long intval;
+       if (PyFloat_Check(t)) {
+               double tval = PyFloat_AsDouble(t);
+               PyObject *intobj = t->ob_type->tp_as_number->nb_int(t);
+               if (!intobj)
+                       return -1;
+               intval = PyInt_AsLong(intobj);
+               Py_DECREF(intobj);
+               *sec = intval;
+               *usec = (tval - intval) * 1e6;
+               if (*usec < 0)
+                       /* If rounding gave us a negative number,
+                          truncate.  */
+                       *usec = 0;
+               return 0;
+       }
+       intval = PyInt_AsLong(t);
+       if (intval == -1 && PyErr_Occurred())
+               return -1;
+       *sec = intval;
+       *usec = 0;
+}
 
 PyDoc_STRVAR(posix_utime__doc__,
 "utime(path, (atime, utime))\n\
@@ -1411,22 +1436,26 @@ static PyObject *
 posix_utime(PyObject *self, PyObject *args)
 {
        char *path;
-       long atime, mtime;
+       long atime, mtime, ausec, musec;
        int res;
        PyObject* arg;
 
+#if defined(HAVE_UTIMES)
+       struct timeval buf[2];
+#define ATIME buf[0].tv_sec
+#define MTIME buf[1].tv_sec
+#elif defined(HAVE_UTIME_H)
 /* XXX should define struct utimbuf instead, above */
-#ifdef HAVE_UTIME_H
        struct utimbuf buf;
 #define ATIME buf.actime
 #define MTIME buf.modtime
 #define UTIME_ARG &buf
-#else /* HAVE_UTIME_H */
+#else /* HAVE_UTIMES */
        time_t buf[2];
 #define ATIME buf[0]
 #define MTIME buf[1]
 #define UTIME_ARG buf
-#endif /* HAVE_UTIME_H */
+#endif /* HAVE_UTIMES */
 
        if (!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
                return NULL;
@@ -1436,17 +1465,31 @@ posix_utime(PyObject *self, PyObject *args)
                res = utime(path, NULL);
                Py_END_ALLOW_THREADS
        }
-       else if (!PyArg_Parse(arg, "(ll)", &atime, &mtime)) {
+       else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
                PyErr_SetString(PyExc_TypeError,
                                "utime() arg 2 must be a tuple (atime, mtime)");
                return NULL;
        }
        else {
+               if (extract_time(PyTuple_GET_ITEM(arg, 0),
+                                &atime, &ausec) == -1)
+                       return NULL;
+               if (extract_time(PyTuple_GET_ITEM(arg, 1),
+                                &mtime, &musec) == -1)
+                       return NULL;
                ATIME = atime;
                MTIME = mtime;
+#ifdef HAVE_UTIMES
+               buf[0].tv_usec = ausec;
+               buf[1].tv_usec = musec;
+               Py_BEGIN_ALLOW_THREADS
+               res = utimes(path, buf);
+               Py_END_ALLOW_THREADS
+#else
                Py_BEGIN_ALLOW_THREADS
                res = utime(path, UTIME_ARG);
                Py_END_ALLOW_THREADS
+#endif
        }
        if (res < 0)
                return posix_error_with_filename(path);
index c23b45fa7682402af0fca70f8f7ce8654014ccfa..e3100a8f46d2c98c9d1cb0dbc320bcc38f0b0e42 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.in Revision: 1.342 .
+# From configure.in Revision: 1.343 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.53.
 #
@@ -11531,6 +11531,7 @@ echo "${ECHO_T}MACHDEP_OBJS" >&6
 
 
 
+
 
 
 for ac_func in alarm chown chroot clock confstr ctermid ctermid_r execv \
@@ -11543,7 +11544,7 @@ for ac_func in alarm chown chroot clock confstr ctermid ctermid_r execv \
  setlocale setregid setreuid setsid setpgid setuid setvbuf snprintf \
  sigaction siginterrupt sigrelse strftime strptime symlink \
  sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
- truncate uname unsetenv waitpid _getpty getpriority
+ truncate uname unsetenv utimes waitpid _getpty getpriority
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 echo "$as_me:$LINENO: checking for $ac_func" >&5
index 037dc45c7a36f5f4e746493f74849e66101ef508..2954255b1c28d88928d51a4ee0b8218949eb3a24 100644 (file)
@@ -1644,7 +1644,7 @@ AC_CHECK_FUNCS(alarm chown chroot clock confstr ctermid ctermid_r execv \
  setlocale setregid setreuid setsid setpgid setuid setvbuf snprintf \
  sigaction siginterrupt sigrelse strftime strptime symlink \
  sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
- truncate uname unsetenv waitpid _getpty getpriority)
+ truncate uname unsetenv utimes waitpid _getpty getpriority)
 
 # check for openpty and forkpty
 
index d664860f0f05bfc8e8539893fe58578c81155baf..3622be8f5a1bec12189503291d14222921d126a9 100644 (file)
    wchar_t must be 16-bit unsigned type. (see Include/unicodeobject.h). */
 #undef HAVE_USABLE_WCHAR_T
 
+/* Define to 1 if you have the `utimes' function. */
+#undef HAVE_UTIMES
+
 /* Define to 1 if you have the <utime.h> header file. */
 #undef HAVE_UTIME_H