 |
Index for Section 3 |
|
 |
Alphabetical listing for M |
|
 |
Bottom of page |
|
mktemp(3)
NAME
mktemp, mkstemp, mkstemps, mkdtemp - Construct a unique file name or
directory
SYNOPSIS
#include <stdlib.h>
char *mktemp(
char *template );
int mkstemp(
char *template );
int mkstemps(
char *template,
int suffixlen );
char *mkdtemp(
char *template );
LIBRARY
Standard C Library (libc)
System V Compatibility Library (libsys5)
STANDARDS
Interfaces documented on this reference page conform to industry standards
as follows:
mktemp(), mkstemp(): XSH4.2, XSH5.0
Refer to the standards(5) reference page for more information about
industry standards and associated tags.
PARAMETERS
template
Points to a string to be modified to form a unique file name. The
string should be composed of characters from the portable character
set. Elements in the string consist of an optional prefix, 6 or more X
characters (which are replaced to make the file name unique), and -- in
the case of the mkstemps() function -- a suffix. The template string
prior to the suffix element should look like a file name with six or
more trailing X characters. The string has the following forms:
· For mktemp(), mkstemp(), and mkdtemp() functions:
[prefix]XXXXXXX
· For the mkstemps() function:
[prefix]XXXXXXsuffix
The prefix portion of the template string (often a directory
specification and/or file name prefix) is optional, the string of 6 or
more Xs is replaced when the file name is generated, and the suffix
portion is the string to be appended when generating the file name. The
template string prior to suffix should look like a file name with six
or more trailing X characters.
suffixlen
The length of the suffix in the template string.
DESCRIPTION
The mktemp() function replaces, with a unique file name, the contents of
the template string pointed to by the template parameter. The application
should initialize the template string to be a file name with six or more
trailing X characters. To generate a unique file name, mktemp() replaces
the Xs in the template string with characters from the portable character
set. Note that a possible race condition can exist when using the mktemp()
function. The mkstemp(), mkstemps(), and mkdtemp() functions avoid this
problem; see APPLICATION USAGE for details.
For compatibility with SVID2, the libsys5 version of mktemp() uses the
getpid() function when generating the file name. In addition to suffering
from the same race condition mentioned above, the required use of getpid()
by the libsys5 version of mktemp() results in significantly more
predictable file name generation, and this predictability could be misused
by a hostile process. To avoid these problems, use the mkstemp(),
mkstemps(), or mkdtemp() functions (not specified by SVID2).
The mkstemp() function performs the same substitution to the template name
as mktemp(), but it also creates the file with mode 0600 and returns, for
the file, a file descriptor that is open for reading and writing. The
function thus prevents any possible race condition that could exist in the
interval between testing whether the file exists and opening it for use.
The mkstemps() function is similar to the mkstemp() function, except that
it permits the inclusion of a trailing suffix in the template string. The
suffix is appended to the generated file name.
The mkdtemp() function is similar to the mkstemp() function, except that it
creates a mode 0700 directory instead of a file name and returns a pointer
to a string containing the resulting directory path that has been created.
The mkdtemp() and mkstemps() functions first appeared in OpenBSD.
RETURN VALUES
Upon successful completion, the mktemp() function returns the address of
the string pointed to by the template parameter. If the string pointed to
by the template parameter does not contain trailing Xs or if the mktemp()
function is unable to construct a unique file name, the first character of
the template string is replaced with a null character and a null pointer is
returned.
Upon successful completion, the mkstemp() function returns an open file
descriptor. If the string pointed to by the template parameter does not
contain trailing Xs or if no suitable file can be created, -1 is returned.
Upon successful completion, the mkstemps() function returns an open file
descriptor. Under any of the following conditions, -1 is returned and errno
is set to indicate the error:
· If the string pointed to by the template parameter does not contain
trailing Xs prior to the start of the suffix
· If the suffix contains a slash (/)
· If suffixlen is larger than the length of the template
· If no suitable file can be created
Upon successful completion, the mkdtemp() function returns the address of
the string pointed to by the template parameter. If the string pointed to
by the template parameter does not contain trailing Xs or if no suitable
directory can be created, a null pointer is returned and errno is set to
indicate the error.
ERRORS
No errors are defined for the mktemp() or mkstemp() functions.
The mkstemps() function may set errno to one of the following values or to
any value specified by the open() or stat() function:
[EINVAL]
The string pointed to by the template parameter does not contain
trailing Xs prior to the start of the suffix, the suffix contains a
slash (/), or suffixlen is larger than the length of the template.
[ENOTDIR]
The pathname portion of the template is not an existing directory.
The mkdtemp() function may set errno to one of the following values or to
any value specified by the stat() and mkdir() functions:
[EINVAL]
The string pointed to by the template parameter does not contain
trailing Xs.
[ENOTDIR]
The pathname portion of the template is not an existing directory.
APPLICATION USAGE
The use of mktemp() is discouraged due to a race condition that may exist
between the time a file name is created and the time the file is opened.
During this interval, it is possible for some other (potentially hostile)
process to create a file with the same name. The mkstemp(), mkstemps(), and
mkdtemp() functions avoid this problem by creating the file name or
directory in a way that ensures that duplication cannot occur.
It is important that the template parameter passed to these functions does
not point to a read-only string. For example, a call such as:
int retval;
retval = mkstemp("/tmp/temp.XXXXXX");
may result in a core dump when the mkstemp() function attempts to modify a
string constant.
EXAMPLES
The following example uses mkstemp() to create and open a temp file:
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
main() {
char template[16];
int fd = -1;
strcpy(template, "/tmp/tempXXXXXX");
if ((fd = mkstemp(template)) != -1) {
/* use 'fd' here */
unlink(template);
close(fd);
} else
fprintf(stderr, "Failed to create temp file.\n");
}
The following example uses mkstemps() to create and open a temp file with a
suffix:
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
main() {
char template[20];
int fd = -1;
strcpy(template, "/tmp/tempXXXXXXX.xyz");
if ((fd = mkstemps(template, 4)) != -1) {
/* use 'fd' here */
unlink(template);
close(fd);
} else
fprintf(stderr, "Failed to create temp file.\n%s\n",
strerror(errno));
}
The following example uses mkdtemp() to create a temp directory and, if
successful, then uses mkstemp() to create a temp file within the directory:
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
main() {
char template[35], dirpath[22], *dp;
int fd = -1;
strcpy(dirpath, "/tmp/tempdir.XXXXXXXX");
if ((dp = mkdtemp(dirpath)) != NULL) {
/* begin - example use of 'dp' */
sprintf(template, "%s/%s", dp, "tempXXXXXXXX");
if ((fd = mkstemp(template)) != -1) {
/* use 'fd' here */
unlink(template);
close(fd);
} else
fprintf(stderr, "Failed to create temp file.\n%s\n",
strerror(errno));
/* end - example use of 'dp' */
rmdir(dirpath);
} else
fprintf(stderr, "Failed to create temp directory.\n%s\n",
strerror(errno));
}
SEE ALSO
Functions: tmpfile(3), tmpnam(3), mkdir(2), open(2), stat(2)
Standards: standards(5)
 |
Index for Section 3 |
|
 |
Alphabetical listing for M |
|
 |
Top of page |
|