chiark / gitweb /
Merge branch 'master' of metalzone.distorted.org.uk:~mdw/public-git/lisp
[lisp] / safely.lisp
index 8cd0f9a635dd6e137414f46448bba475a23e473a..84a06c4a6cd65649c745410327c9e388d24c761f 100644 (file)
@@ -33,7 +33,13 @@ (in-package #:safely)
 #+(or cmu sbcl)
 (eval-when (:compile-toplevel :execute)
   (import #+cmu '(ext:unix-namestring unix:unix-link)
-         #+sbcl '(sb-int:unix-namestring)))
+         #+sbcl '(sb-ext:native-namestring)))
+#+cmu
+(progn
+  (declaim (inline unix-namestring))
+  (defun native-namestring (pathname &key as-file)
+    (declare (ignore as-file))
+    (unix-namestring pathname nil)))
 
 (defstruct (safely (:predicate safelyp))
   "Stores information about how to commit or undo safe writes."
@@ -158,17 +164,21 @@ (defun safe-copy (file tag)
   ;; Use link(2) where available.
   (generate-fresh-file-name file tag
                            (lambda (name)
-                             (let ((from (unix-namestring file t))
-                                   (to (unix-namestring name nil)))
+                             (let ((from (native-namestring file
+                                                            :as-file t))
+                                   (to (native-namestring name
+                                                          :as-file t)))
                                (and from to
                                     (unix-link from to)))))
 
   #+clisp
   (generate-fresh-file-name file tag
                            (lambda (name)
-                             (>= (unix:link (namestring file) 
-                                            (namestring name))
-                                 0)))
+                             (posix:copy-file (namestring file)
+                                              (namestring name)
+                                              :method :hardlink
+                                              :if-exists nil)))
+
 
 
   #-(or cmu sbcl)