From a0776984bc3630c8c0bd57b3fd1acca1f0b8cb5c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 15 Aug 2022 12:55:40 -0700 Subject: [PATCH] =?UTF-8?q?Don=E2=80=99t=20create=20temp=20file=20with=20s?= =?UTF-8?q?ame=20name=20as=20visited?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem reported by Jim Porter (Bug#57129#47). * src/fileio.c (create_tempname): New function. (Fmake_temp_file_internal): Use it. --- src/fileio.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/fileio.c b/src/fileio.c index 9697f6c8cf..4f134bbfa9 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -677,6 +677,27 @@ DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name, return val; } +/* Create a temporary file whose encoded name is ENCODED_FILENAME, and + whose decoded name is *(Lisp_Object *) FLAGS. Pretend the file + already exists if a live buffer is visiting it. Return a file + descriptor if successful, -1 (setting errno) otherwise. */ +static int +create_tempname (char *encoded_filename, void *flags) +{ + Lisp_Object *addval = flags; + Lisp_Object filename = *addval; + + if (!NILP (Fget_file_buffer (filename))) + { + errno = EEXIST; + return -1; + } + + return open (encoded_filename, + O_RDWR | O_BINARY | O_CLOEXEC | O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR); +} + DEFUN ("make-temp-file-internal", Fmake_temp_file_internal, Smake_temp_file_internal, 4, 4, 0, doc: /* Generate a new file whose name starts with PREFIX, a string. @@ -707,18 +728,18 @@ DEFUN ("make-temp-file-internal", Fmake_temp_file_internal, memcpy (data, SSDATA (encoded_prefix), prefix_len); memset (data + prefix_len, 'X', nX); memcpy (data + prefix_len + nX, SSDATA (encoded_suffix), suffix_len); + Lisp_Object dval = DECODE_FILE (val), ddval = dval; int kind = (NILP (dir_flag) ? GT_FILE : BASE_EQ (dir_flag, make_fixnum (0)) ? GT_NOCREATE : GT_DIR); - int fd = gen_tempname (data, suffix_len, O_BINARY | O_CLOEXEC, kind); + int fd = try_tempname (data, suffix_len, &ddval, create_tempname); bool failed = fd < 0; if (!failed) { specpdl_ref count = SPECPDL_INDEX (); record_unwind_protect_int (close_file_unwind, fd); - val = DECODE_FILE (val); if (STRINGP (text) && SBYTES (text) != 0) - write_region (text, Qnil, val, Qnil, Qnil, Qnil, Qnil, fd); + write_region (text, Qnil, dval, Qnil, Qnil, Qnil, Qnil, fd); failed = NILP (dir_flag) && emacs_close (fd) != 0; /* Discard the unwind protect. */ specpdl_ptr = specpdl_ref_to_ptr (count); @@ -733,7 +754,7 @@ DEFUN ("make-temp-file-internal", Fmake_temp_file_internal, }; report_file_error (kind_message[kind], prefix); } - return val; + return dval; } -- 2.37.1