;;; it under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 2 of the License, or
;;; (at your option) any later version.
-;;;
+;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
-;;;
+;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program; if not, write to the Free Software Foundation,
;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#:safely-writing))
(in-package #:safely)
+#+(or cmu sbcl)
+(eval-when (:compile-toplevel :execute)
+ (import #+cmu '(ext:unix-namestring unix:unix-link)
+ #+sbcl '(sb-int:unix-namestring)))
+
(defstruct (safely (:predicate safelyp))
"Stores information about how to commit or undo safe writes."
(streams nil)
(safely-unwind (safely-trail safe))
(safely-reset safe))
+#+sbcl
+(defun unix-link (from to)
+ (sb-unix::int-syscall ("link" sb-alien:c-string sb-alien:c-string)
+ from to))
+
(defun safe-copy (file tag)
"Make a copy of the FILE. Return the new name."
- #+cmu
+ #+(or cmu sbcl)
;; Use link(2) where available.
(generate-fresh-file-name file tag
(lambda (name)
- (let ((from (ext:unix-namestring file t))
- (to (ext:unix-namestring name nil)))
+ (let ((from (unix-namestring file t))
+ (to (unix-namestring name nil)))
(and from to
- (unix:unix-link from to)))))
+ (unix-link from to)))))
- #-cmu
+ #-(or cmu sbcl)
;; Otherwise just copy the file contents and hope for the best.
(with-open-file (input file :element-type :default)
(multiple-value-bind
(when (< read (length buffer))
(return copy))))))
(close output)))))
-
+
(defun safely-commit (safe)
"Commit SAFE. The files deleted by safely-delete-file are deleted; the
files created by safely-open-output-stream are renamed over the old
temporary file, and if BODY completes, it is renamed to FILE."
(with-gensyms safe
`(safely (,safe)
- (let ((,stream (apply #'safely-open-output-stream
- ,safe ,file ,open-args)))
+ (let ((,stream (safely-open-output-stream ,safe ,file ,@open-args)))
,@body))))
;;;----- That's all, folks --------------------------------------------------