...
Wiki Markup |
---|
The C99 {{tmpnam()}} function generates a string that is a valid filename and that is not the same as the name of an existing file \[[ISO/IEC 9899-1999|AA. C References#ISO/IEC 9899-1999]\]. Files created using strings generated by the {{tmpnam()}} function are temporary in that their names should not collide with those generated by conventional naming rules for the implementation. The function is potentially capable of generating {{TMP_MAX}} different strings, but any or all of them may already be in use by existing files. If the argument is not a null pointer, it is assumed to point to an array of at least {{L_tmpnam}} chars; the {{tmpnam()}} function writes its result in that array and returns the argument as its value. |
Code Block |
---|
|
/* ... */
if (tmpnam(temp_file_name)) {
/* temp_file_name may refer to an existing file */
t_file = fopen(temp_file_name,"wb+");
if (!t_file) {
/* Handle Error */
}
}
/* ... */
|
Wiki Markup |
---|
Unfortunately, this solution is still non-compliant because it violates \[[FIO32-C|FIO32-C. Temporary file names must be unique when the file is created]\], \[[FI040-C|FI040-C. Temporary files must be opened with exclusive access]\], \[[FI041-C|FI041-C. Temporary files must have an unpredictable name]\], and \[[FI042-C|FI042-C. Temporary files must be removed before the program exits]\]. |
...
Wiki Markup |
---|
The TR 24731-1 {{tmpnam_s()}} function generates a string that is a valid filename and that is not the same as the name of an existing file \[[ISO/IEC TR 24731-2006|AA. C References#SO/IEC TR 24731-2006]\]. The function is potentially capable of generating {{TMP_MAX_S}} different strings, but any or all of them may already be in use by existing files and thus not be suitable return values. The lengths of these strings must be less than the value of the {{L_tmpnam_s}} macro. |
Code Block |
---|
|
/* ... */
FILE *file_ptr;
char filename[L_tmpnam_s];
if (tmpnam_s(filename, L_tmpnam_s) != 0) {
/* Handle Error */
}
if (!fopen_s(&file_ptr, filename, "wb+")) {
/* Handle Error */
}
/* ... */
|
Wiki Markup |
---|
This solution is also non-compliant because it violates \[[FIO32-C|FIO32-C. Temporary file names must be unique when the file is created]\] and \[[FI042-C|FI042-C. Temporary files must be removed before the program exits]\]. |
...
The POSIX function mktemp()
takes a given filename template and overwrites a portion of it to create a filename. The template may be any filename with some number of Xs appended to it (for example, /tmp/temp.XXXXXX
). The trailing Xs are replaced with the current process number and/or a unique letter combination. The number of unique filenames mktemp()
can return depends on the number of Xs provided.
Code Block |
---|
|
/* ... */
int fd;
char temp_name[] = "/tmp/temp-XXXXXX";
if (mktemp(temp_name) == NULL) {
/* Handle Error */
}
if ((fd = open(temp_name, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC, 0600)) == -1) {
/* Handle Error */
}
/* ... */
|
Wiki Markup |
---|
This solution is also non-compliant because it violates \[[FIO32-C|FIO32-C. Temporary file names must be unique when the file is created]\] and \[[FI042-C|FI042-C. Temporary files must be removed before the program exits]\]. |
...