guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 04/04: Define AT_SYMLINK_NOFOLLOW et al.


From: Ludovic Courtès
Subject: [Guile-commits] 04/04: Define AT_SYMLINK_NOFOLLOW et al.
Date: Sun, 23 Sep 2018 10:42:03 -0400 (EDT)

civodul pushed a commit to branch stable-2.2
in repository guile.

commit 3ee7673cc98d2acca3144a81bfbe1351b2bbe0fd
Author: Ludovic Courtès <address@hidden>
Date:   Sun Sep 23 16:39:42 2018 +0200

    Define AT_SYMLINK_NOFOLLOW et al.
    
    * libguile/posix.c (scm_init_posix): Define AT_SYMLINK_NOFOLLOW,
    AT_SYMLINK_FOLLOW, AT_NO_AUTOMOUNT, and AT_EMPTY_PATH when available.
    (scm_utime): Mention AT_SYMLINK_NOFOLLOW.
    * doc/ref/posix.texi (File System): Update accordingly.
    * test-suite/tests/posix.test ("utime")["AT_SYMLINK_NOFOLLOW"]: New test.
---
 doc/ref/posix.texi          |  5 +++++
 libguile/posix.c            | 18 +++++++++++++++++-
 test-suite/tests/posix.test | 19 +++++++++++++++++--
 3 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/doc/ref/posix.texi b/doc/ref/posix.texi
index 5cb68a2..1470e5f 100644
--- a/doc/ref/posix.texi
+++ b/doc/ref/posix.texi
@@ -801,6 +801,11 @@ systems.
 @end lisp
 will set the access time to one hour in the past and the
 modification time to the current time.
+
address@hidden AT_SYMLINK_NOFOLLOW
+Last, @var{flags} may be either @code{0} or the
address@hidden constant, to set the time of
address@hidden even if it is a symbolic link.
 @end deffn
 
 @findex unlink
diff --git a/libguile/posix.c b/libguile/posix.c
index b0fcad5..d820092 100644
--- a/libguile/posix.c
+++ b/libguile/posix.c
@@ -1624,7 +1624,10 @@ SCM_DEFINE (scm_utime, "utime", 1, 5, 0,
            "(utime \"foo\" (- (current-time) 3600))\n"
            "@end lisp\n"
            "will set the access time to one hour in the past and the\n"
-           "modification time to the current time.")
+           "modification time to the current time.\n\n"
+            "Last, @var{flags} may be either @code{0} or the\n"
+            "@code{AT_SYMLINK_NOFOLLOW} constant, to set the time of\n"
+            "@var{pathname} even if it is a symbolic link.\n")
 #define FUNC_NAME s_scm_utime
 {
   int rv;
@@ -2433,6 +2436,19 @@ scm_init_posix ()
   scm_c_define ("LOCK_NB", scm_from_int (LOCK_NB));
 #endif
 
+#ifdef AT_SYMLINK_NOFOLLOW
+  scm_c_define ("AT_SYMLINK_NOFOLLOW", scm_from_int (AT_SYMLINK_NOFOLLOW));
+#endif
+#ifdef AT_SYMLINK_FOLLOW
+  scm_c_define ("AT_SYMLINK_FOLLOW", scm_from_int (AT_SYMLINK_FOLLOW));
+#endif
+#ifdef AT_NO_AUTOMOUNT
+  scm_c_define ("AT_NO_AUTOMOUNT", scm_from_int (AT_NO_AUTOMOUNT));
+#endif
+#ifdef AT_EMPTY_PATH
+  scm_c_define ("AT_EMPTY_PATH", scm_from_int (AT_EMPTY_PATH));
+#endif
+
 #include "libguile/cpp-SIG.c"
 #include "libguile/posix.x"
 
diff --git a/test-suite/tests/posix.test b/test-suite/tests/posix.test
index 4dadd77..63b4513 100644
--- a/test-suite/tests/posix.test
+++ b/test-suite/tests/posix.test
@@ -1,7 +1,7 @@
 ;;;; posix.test --- Test suite for Guile POSIX functions. -*- scheme -*-
 ;;;;
 ;;;; Copyright 2003, 2004, 2006, 2007, 2010, 2012,
-;;;;   2015, 2017 Free Software Foundation, Inc.
+;;;;   2015, 2017, 2018 Free Software Foundation, Inc.
 ;;;;
 ;;;; This library is free software; you can redistribute it and/or
 ;;;; modify it under the terms of the GNU Lesser General Public
@@ -181,7 +181,22 @@
               (and (= (stat:atime info) accessed)
                    (= (stat:mtime info) modified)))))
         (lambda ()
-          (delete-file file))))))
+          (delete-file file)))))
+
+  (pass-if-equal "AT_SYMLINK_NOFOLLOW"
+      '(1 1)
+    (if (defined? 'AT_SYMLINK_NOFOLLOW)
+        (let ((file "posix.test-utime"))
+          (dynamic-wind
+            (lambda ()
+              (symlink "/dev/null" file))
+            (lambda ()
+              (utime file 1 1 0 0 AT_SYMLINK_NOFOLLOW)
+              (let ((info (lstat file)))
+                (list (stat:atime info) (stat:mtime info))))
+            (lambda ()
+              (delete-file file))))
+        (throw 'unsupported))))
 
 ;;
 ;; affinity



reply via email to

[Prev in Thread] Current Thread [Next in Thread]