# mkdtemp

## PROLOG



           This manual page is part of the POSIX Programmer's Manual.  The
           Linux implementation of this interface may differ (consult the
           corresponding Linux manual page for details of Linux behavior), or
           the interface may not be implemented on Linux.
    


## NAME



           mkdtemp, mkstemp — create a unique directory or file
    


## SYNOPSIS



           #include <stdlib.h>
    
           char *mkdtemp(char *_template_);
           int mkstemp(char *_template_);
    


## DESCRIPTION



           The _mkdtemp_() function shall create a directory with a unique name
           derived from _template_.  The application shall ensure that the
           string provided in _template_ is a pathname ending with at least six
           trailing **'X'** characters. The _mkdtemp_() function shall modify the
           contents of _template_ by replacing six or more **'X'** characters at
           the end of the pathname with the same number of characters from
           the portable filename character set. The characters shall be
           chosen such that the resulting pathname does not duplicate the
           name of an existing file at the time of the call to _mkdtemp_().
           The _mkdtemp_() function shall use the resulting pathname to create
           the new directory as if by a call to:
    
               mkdir(pathname, S_IRWXU)
    
           The _mkstemp_() function shall create a regular file with a unique
           name derived from _template_ and return a file descriptor for the
           file open for reading and writing. The application shall ensure
           that the string provided in _template_ is a pathname ending with at
           least six trailing **'X'** characters. The _mkstemp_() function shall
           modify the contents of _template_ by replacing six or more **'X'**
           characters at the end of the pathname with the same number of
           characters from the portable filename character set. The
           characters shall be chosen such that the resulting pathname does
           not duplicate the name of an existing file at the time of the call
           to _mkstemp_().  The _mkstemp_() function shall use the resulting
           pathname to create the file, and obtain a file descriptor for it,
           as if by a call to:
    
               open(pathname, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR)
    
           By behaving as if the O_EXCL flag for _open_() is set, the function
           prevents any possible race condition between testing whether the
           file exists and opening it for use.
    


## RETURN VALUE



           Upon successful completion, the _mkdtemp_() function shall return
           the value of _template_.  Otherwise, it shall return a null pointer
           and shall set _errno_ to indicate the error.
    
           Upon successful completion, the _mkstemp_() function shall return an
           open file descriptor. Otherwise, it shall return -1 and shall set
           _errno_ to indicate the error.
    


## ERRORS



           The _mkdtemp_() function shall fail if:
    
           **EACCES** Search permission is denied on a component of the path
                  prefix, or write permission is denied on the parent
                  directory of the directory to be created.
    
           **EINVAL** The string pointed to by _template_ does not end in **"XXXXXX"**.
    
           **ELOOP** A loop exists in symbolic links encountered during
                  resolution of the path of the directory to be created.
    
           **EMLINK** The link count of the parent directory would exceed
                  {LINK_MAX}.
    
           **ENAMETOOLONG**
                  The length of a component of a pathname is longer than
                  {NAME_MAX}.
    
           **ENOENT** A component of the path prefix specified by the _template_
                  argument does not name an existing directory.
    
           **ENOSPC** The file system does not contain enough space to hold the
                  contents of the new directory or to extend the parent
                  directory of the new directory.
    
           **ENOTDIR**
                  A component of the path prefix names an existing file that
                  is neither a directory nor a symbolic link to a directory.
    
           **EROFS** The parent directory resides on a read-only file system.
    
           The _mkdtemp_() function may fail if:
    
           **ELOOP** More than {SYMLOOP_MAX} symbolic links were encountered
                  during resolution of the path of the directory to be
                  created.
    
           **ENAMETOOLONG**
                  The length of a pathname exceeds {PATH_MAX}, or pathname
                  resolution of a symbolic link produced an intermediate
                  result with a length that exceeds {PATH_MAX}.
    
           The error conditions for the _mkstemp_() function are defined in
           open(3p).
    
           _The following sections are informative._
    


## EXAMPLES



       **Generating a Pathname**
           The following example creates a file with a 10-character name
           beginning with the characters **"file"** and opens the file for
           reading and writing. The value returned as the value of _fd_ is a
           file descriptor that identifies the file.
    
               #include <stdlib.h>
               ...
               char template[] = "/tmp/fileXXXXXX";
               int fd;
    
               fd = mkstemp(template);
    


## APPLICATION USAGE



           It is possible to run out of letters.
    
           Portable applications should pass exactly six trailing **'X'** s in the
           template and no more; implementations may treat any additional
           trailing **'X'** s as either a fixed or replaceable part of the
           template. To be sure of only passing six, a fixed string of at
           least one non-**'X'** character should precede the six **'X'** s.
    
           Since **'X'** is in the portable filename character set, some of the
           replacement characters can be **'X'** s, leaving part (or even all) of
           the template effectively unchanged.
    


## RATIONALE



           None.
    


## FUTURE DIRECTIONS



           None.
    


* * *