From 754bbf7a25a8dda49b5d08ef0d0443bbf5af0e36 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 7 Apr 2024 13:41:34 -0500 Subject: new repository --- devdocs/c/io%2Ftmpnam.html | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 devdocs/c/io%2Ftmpnam.html (limited to 'devdocs/c/io%2Ftmpnam.html') diff --git a/devdocs/c/io%2Ftmpnam.html b/devdocs/c/io%2Ftmpnam.html new file mode 100644 index 00000000..0285bdf5 --- /dev/null +++ b/devdocs/c/io%2Ftmpnam.html @@ -0,0 +1,83 @@ +

tmpnam, tmpnam_s

Defined in header <stdio.h>
char *tmpnam( char *filename );
+
(1)
errno_t tmpnam_s(char *filename_s, rsize_t maxsize);
+
(2) (since C11)
#define TMP_MAX        /*unspecified*/
+
#define TMP_MAX_S      /*unspecified*/
+
(since C11)
#define L_tmpnam       /*unspecified*/
+
#define L_tmpnam_s     /*unspecified*/
+
(since C11)
+1) Creates a unique valid file name (no longer than L_tmpnam in length) and stores it in character string pointed to by filename. The function is capable of generating up to TMP_MAX of unique filenames, but some or all of them may be in use in the filesystem and thus not suitable return values.
+2) Same as (1), except that up to TMP_MAX_S names may be generated, no longer than L_tmpnam_s in length, and the following errors are detected at runtime and call the currently installed constraint handler function:
+
+
    +
  • filename_s is a null pointer
  • +
  • maxsize is greater than RSIZE_MAX
  • +
  • maxsize is less than the generated file name string
  • +
+
As with all bounds-checked functions, tmpnam_s only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including <stdio.h>.
+
+

tmpnam and tmpnam_s modify static state (which may be shared between these functions) and are not required to be thread-safe.

+

Parameters

+ + + +
filename - pointer to the character array capable of holding at least L_tmpnam bytes, to be used as a result buffer. If null pointer is passed, a pointer to an internal static buffer is returned.
filename_s - pointer to the character array capable of holding at least L_tmpnam_s bytes, to be used as a result buffer.
maxsize - maximum number of characters the function is allowed to write (typically the size of the filename_s array).

Return value

+1) filename if filename was not a null pointer. Otherwise a pointer to an internal static buffer is returned. If no suitable filename can be generated, null pointer is returned.
+2) Returns zero and writes the file name to filename_s on success. On error, returns non-zero and writes the null character to filename_s[0] (only if filename_s is not null and maxsize is not zero and is not greater than RSIZE_MAX).

Notes

Although the names generated by tmpnam are difficult to guess, it is possible that a file with that name is created by another process between the moment tmpnam returns and the moment this program attempts to use the returned name to create a file. The standard function tmpfile and the POSIX function mkstemp do not have this problem (creating a unique directory using only the standard C library still requires the use of tmpnam).

+

POSIX systems additionally define the similarly named function tempnam, which offers the choice of a directory (which defaults to the optionally defined macro P_tmpdir).

+

Example

#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+ 
+int main(void)
+{
+    // Note, the compiler/linker may issue a security warning, e.g. GCC:
+    // "warning: the use of `tmpnam' is dangerous, better use `mkstemp'"
+    char* name1 = tmpnam(NULL);
+    printf("temporary file name: %s\n", name1);
+ 
+    char name2[L_tmpnam];
+    if (tmpnam(name2))
+        printf("temporary file name: %s\n", name2);
+ 
+    // POSIX offers mkstemp. The following declaration might be
+    // necessary as mkstemp is absent in the standard C <stdlib.h>.
+    int mkstemp(char*);
+ 
+    char name3[] = "/tmp/fileXXXXXX"; // at least six 'X' required ^_^
+    int file_descriptor = mkstemp(name3);
+    if (file_descriptor != -1)
+        printf("temporary file name: %s\n", name3);
+    else
+        perror("mkstemp");
+}

Possible output:

+
temporary file name: /tmp/file90dLlR
+temporary file name: /tmp/fileY9LWAg
+temporary file name: /tmp/filexgv8PF

References

See also

+ +
+
(C11)
returns a pointer to a temporary file
(function)
C++ documentation for tmpnam
+

+ © cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
+ https://en.cppreference.com/w/c/io/tmpnam +

+
-- cgit v1.2.3