From: ueno Date: Wed, 12 Apr 2006 06:11:36 +0000 (+0000) Subject: Imported poe's make-temp-file. X-Git-Tag: epgsm-branchpoint~128 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=d1288b1e0e9488665d7a2e92fadfcb249f250dc7;p=elisp%2Fepg.git Imported poe's make-temp-file. --- diff --git a/epg.el b/epg.el index 60af26d..ca9b4c6 100644 --- a/epg.el +++ b/epg.el @@ -522,7 +522,54 @@ This function is for internal use only." (setq alist (cdr alist))) (nreverse result))) -(defalias 'epg-make-temp-file 'make-temp-file) +(if (fboundp 'make-temp-file) + (defalias 'epg-make-temp-file 'make-temp-file) + ;; stolen from poe.el. + (defun epg-make-temp-file (prefix) + "Create a temporary file. +The returned file name (created by appending some random characters at the end +of PREFIX, and expanding against `temporary-file-directory' if necessary), +is guaranteed to point to a newly created empty file. +You can then use `write-region' to write new data into the file." + (let (tempdir tempfile) + (unwind-protect + (let (file) + ;; First, create a temporary directory. + (while (condition-case () + (progn + (setq tempdir (make-temp-name + (concat + (file-name-directory prefix) + "DIR"))) + ;; return nil or signal an error. + (make-directory tempdir)) + ;; let's try again. + (file-already-exists t))) + (set-file-modes tempdir 448) + ;; Second, create a temporary file in the tempdir. + ;; There *is* a race condition between `make-temp-name' + ;; and `write-region', but we don't care it since we are + ;; in a private directory now. + (setq tempfile (make-temp-name (concat tempdir "/EMU"))) + (write-region "" nil tempfile nil 'silent) + (set-file-modes tempfile 384) + ;; Finally, make a hard-link from the tempfile. + (while (condition-case () + (progn + (setq file (make-temp-name prefix)) + ;; return nil or signal an error. + (add-name-to-file tempfile file)) + ;; let's try again. + (file-already-exists t))) + file) + ;; Cleanup the tempfile. + (and tempfile + (file-exists-p tempfile) + (delete-file tempfile)) + ;; Cleanup the tempdir. + (and tempdir + (file-directory-p tempdir) + (delete-directory tempdir)))))) ;;;###autoload (defun epg-decrypt-start (context input-file)