| #define _GNU_SOURCE |
| #include <errno.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/stat.h> |
| |
| char* __randname(char*); |
| |
| char* mktemp(char* template) { |
| size_t l = strlen(template); |
| int retries = 100; |
| struct stat st; |
| |
| if (l < 6 || memcmp(template + l - 6, "XXXXXX", 6)) { |
| errno = EINVAL; |
| *template = 0; |
| return template; |
| } |
| |
| do { |
| __randname(template + l - 6); |
| if (stat(template, &st)) { |
| if (errno != ENOENT) |
| *template = 0; |
| return template; |
| } |
| } while (--retries); |
| |
| *template = 0; |
| errno = EEXIST; |
| return template; |
| } |