chiark
/
gitweb
/
~mdw
/
lisp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mdw-base.lisp: Fix `inline' proclamation for `ref'.
[lisp]
/
safely.lisp
diff --git
a/safely.lisp
b/safely.lisp
index 9809f07ee5bf87fe257131a66a0012c28b57cf4e..43ea4fed73a9f48918a378c22b0942884da7b90d 100644
(file)
--- a/
safely.lisp
+++ b/
safely.lisp
@@
-110,12
+110,26
@@
(defun safely-open-output-stream (safe file &rest open-args)
(safely-trail safe))
stream))
(safely-trail safe))
stream))
+#+clisp
+(progn
+ (ffi:def-call-out %rename (:name "rename")
+ (:language :stdc)
+ (:library "libc.so.6")
+ (:arguments (from ffi:c-string)
+ (to ffi:c-string))
+ (:return-type ffi:int)))
+
(declaim (inline rename))
(defun rename (old new)
(declaim (inline rename))
(defun rename (old new)
+ #-clisp
(let ((target (make-pathname :directory '(:relative)
:defaults new)))
(let ((target (make-pathname :directory '(:relative)
:defaults new)))
- #-clisp (rename-file old target)
- #+clisp (rename-file old target :if-exists :overwrite)))
+ (rename-file old target))
+
+ #+clisp
+ (let ((rc (%rename (namestring old) (namestring new))))
+ (when (= rc -1)
+ (error "Failed to rename ~S to ~S: ~A" old new (posix:strerror)))))
(defun delete-file-without-moaning (file)
"Delete the FILE, ignoring errors."
(defun delete-file-without-moaning (file)
"Delete the FILE, ignoring errors."
@@
-181,9
+195,7
@@
(defun safe-copy (file tag)
:method :hardlink
:if-exists nil)))
:method :hardlink
:if-exists nil)))
-
-
- #-(or cmu sbcl)
+ #-(or cmu sbcl clisp)
;; Otherwise just copy the file contents and hope for the best.
(with-open-file (input file :element-type :default)
(multiple-value-bind
;; Otherwise just copy the file contents and hope for the best.
(with-open-file (input file :element-type :default)
(multiple-value-bind