X-Git-Url: https://git.distorted.org.uk/~mdw/lisp/blobdiff_plain/562ed2ddc451abe9be0ec5bb9684b2df56942d8f..2b525992937f759211ea42e6e6f2bf0e695de96c:/safely.lisp diff --git a/safely.lisp b/safely.lisp index 9809f07..43ea4fe 100644 --- a/safely.lisp +++ b/safely.lisp @@ -110,12 +110,26 @@ (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) + #-clisp (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." @@ -181,9 +195,7 @@ :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