| /** | |
| * This file has no copyright assigned and is placed in the Public Domain. | |
| * This file is part of the mingw-w64 runtime package. | |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. | |
| */ | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <errno.h> | |
| #include <sys/stat.h> | |
| #include <fcntl.h> | |
| #include <io.h> | |
| #include <windows.h> | |
| FILE *__cdecl tmpfile(void) | |
| { | |
| /* GetTempPathA() requires buffer of size MAX_PATH+1 | |
| * and tmpnam() requires buffer of size L_tmpnam. | |
| */ | |
| char path[MAX_PATH+1+L_tmpnam]; | |
| DWORD len; | |
| int fd; | |
| FILE *file; | |
| len = GetTempPathA(MAX_PATH, path); | |
| if (len == 0 || len > MAX_PATH) { | |
| errno = EINVAL; | |
| return NULL; | |
| } | |
| /* Function tmpnam() generates path name starting with backslash, | |
| * so ensure that the temp directory path does not contain it. | |
| */ | |
| if (path[len-1] == '\\') | |
| len--; | |
| /* Generate temporary file path and exclusively create+open it in binary mode. | |
| * If the generated temporary file path already exist then generate new one again. | |
| * Note that we cannot use fopen() because msvcrt does not support exclusive 'x' mode. | |
| * Use open() with O_CREAT | O_EXCL flags followed by the fdopen() to get FILE* stream. | |
| */ | |
| do { | |
| if (tmpnam(path+len) != path+len) | |
| return NULL; | |
| fd = open(path, O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_TEMPORARY, S_IREAD | S_IWRITE); | |
| if (fd < 0 && errno != EEXIST) | |
| return NULL; | |
| } while (fd < 0); | |
| file = fdopen(fd, "r+b"); | |
| if (!file) { | |
| int saved_errno = errno; | |
| close(fd); | |
| errno = saved_errno; | |
| return NULL; | |
| } | |
| /* Mark the associated FILE* stream as temporary, so the _rmtmp() can remove it. */ | |
| file->_tmpfname = strdup(path); | |
| if (!file->_tmpfname) { | |
| fclose(file); | |
| errno = ENOMEM; | |
| return NULL; | |
| } | |
| return file; | |
| } | |
| FILE * (__cdecl *__MINGW_IMP_SYMBOL(tmpfile))(void) = tmpfile; | |
| FILE * __attribute__((alias("tmpfile"))) __cdecl tmpfile64(void); | |
| extern FILE * (__cdecl *__attribute__((alias(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(tmpfile))))) __MINGW_IMP_SYMBOL(tmpfile64))(void); |