Function: make-temp-file-internal
make-temp-file-internal is a function defined in fileio.c.
Signature
(make-temp-file-internal PREFIX DIR-FLAG SUFFIX TEXT)
Documentation
Generate a new file whose name starts with PREFIX, a string.
Return the name of the generated file. If DIR-FLAG is zero, do not create the file, just its name. Otherwise, if DIR-FLAG is non-nil, create an empty directory. The file name should end in SUFFIX. Do not expand PREFIX; a non-absolute PREFIX is relative to the Emacs working directory. If TEXT is a string, insert it into the newly created file.
On Posix systems, the file/directory is created with access mode bits that limit access to the current user.
Signal an error if the file could not be created.
This function does not grok magic file names.
Source Code
// Defined in /usr/src/emacs/src/fileio.c
{
CHECK_STRING (prefix);
CHECK_STRING (suffix);
Lisp_Object encoded_prefix = ENCODE_FILE (prefix);
Lisp_Object encoded_suffix = ENCODE_FILE (suffix);
ptrdiff_t prefix_len = SBYTES (encoded_prefix);
ptrdiff_t suffix_len = SBYTES (encoded_suffix);
if (INT_MAX < suffix_len)
args_out_of_range (prefix, suffix);
int nX = 6;
Lisp_Object val = make_uninit_string (prefix_len + nX + suffix_len);
char *data = SSDATA (val);
memcpy (data, SSDATA (encoded_prefix), prefix_len);
memset (data + prefix_len, 'X', nX);
memcpy (data + prefix_len + nX, SSDATA (encoded_suffix), suffix_len);
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);
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);
failed = NILP (dir_flag) && emacs_close (fd) != 0;
/* Discard the unwind protect. */
specpdl_ptr = specpdl_ref_to_ptr (count);
}
if (failed)
{
static char const kind_message[][32] =
{
[GT_FILE] = "Creating file with prefix",
[GT_DIR] = "Creating directory with prefix",
[GT_NOCREATE] = "Creating file name with prefix"
};
report_file_error (kind_message[kind], prefix);
}
return val;
}