### 5.42 `mktemp`, `mkstemp`, `mkostemp`, `mkstemps`, ¶

Synopsis

    #include <stdlib.h>
    char *mktemp(char *path);
    char *mkdtemp(char *path);
    int mkstemp(char *path);
    int mkstemps(char *path, int suffixlen);
    int mkostemp(char *path, int flags);
    int mkostemps(char *path, int suffixlen, int flags);

    char *_mktemp_r(struct _reent *reent, char *path);
    char *_mkdtemp_r(struct _reent *reent, char *path);
    int *_mkstemp_r(struct _reent *reent, char *path);
    int *_mkstemps_r(struct _reent *reent, char *path, int len);
    int *_mkostemp_r(struct _reent *reent, char *path,
        int flags);
    int *_mkostemps_r(struct _reent *reent, char *path, int len,
        int flags);

Description
`mktemp`, `mkstemp`, and `mkstemps` attempt to generate a file name that is not yet in use for any existing file. `mkstemp` and `mkstemps` create the file and open it for reading and writing; `mktemp` simply generates the file name (making `mktemp` a security risk). `mkostemp` and `mkostemps` allow the addition of other `open` flags, such as `O_CLOEXEC`, `O_APPEND`, or `O_SYNC`. On platforms with a separate text mode, `mkstemp` forces `O_BINARY`, while `mkostemp` allows the choice between `O_BINARY`, `O_TEXT`, or 0 for default. `mkdtemp` attempts to create a directory instead of a file, with a permissions mask of 0700.

You supply a simple pattern for the generated file name, as the string at path. The pattern should be a valid filename (including path information if you wish) ending with at least six ‘`X`’ characters. The generated filename will match the leading part of the name you supply, with the trailing ‘`X`’ characters replaced by some combination of digits and letters. With `mkstemps`, the ‘`X`’ characters end suffixlen bytes before the end of the string.

The alternate functions `_mktemp_r`, `_mkdtemp_r`, `_mkstemp_r`, `_mkostemp_r`, `_mkostemps_r`, and `_mkstemps_r` are reentrant versions. The extra argument reent is a pointer to a reentrancy structure.

Returns
`mktemp` returns the pointer path to the modified string representing an unused filename, unless it could not generate one, or the pattern you provided is not suitable for a filename; in that case, it returns `NULL`. Be aware that there is an inherent race between generating the name and attempting to create a file by that name; you are advised to use `O_EXCL|O_CREAT`.

`mkdtemp` returns the pointer path to the modified string if the directory was created, otherwise it returns `NULL`.

`mkstemp`, `mkstemps`, `mkostemp`, and `mkostemps` return a file descriptor to the newly created file, unless it could not generate an unused filename, or the pattern you provided is not suitable for a filename; in that case, it returns `-1`.

Notes
Never use `mktemp`. The generated filenames are easy to guess and there’s a race between the test if the file exists and the creation of the file. In combination this makes `mktemp` prone to attacks and using it is a security risk. Whenever possible use `mkstemp` instead. It doesn’t suffer the race condition.

Portability
ANSI C does not require either `mktemp` or `mkstemp`; the System V Interface Definition requires `mktemp` as of Issue 2. POSIX 2001 requires `mkstemp`, and POSIX 2008 requires `mkdtemp` while deprecating `mktemp`. `mkstemps`, `mkostemp`, and `mkostemps` are not standardized.

Supporting OS subroutines required: `getpid`, `mkdir`, `open`, `stat`.