1#define _GNU_SOURCE
2#include <errno.h>
3#include <stdlib.h>
4#include <string.h>
5#include <sys/stat.h>
6
7char* __randname(char*);
8
9char* mktemp(char* template) {
10    size_t l = strlen(template);
11    int retries = 100;
12    struct stat st;
13
14    if (l < 6 || memcmp(template + l - 6, "XXXXXX", 6)) {
15        errno = EINVAL;
16        *template = 0;
17        return template;
18    }
19
20    do {
21        __randname(template + l - 6);
22        if (stat(template, &st)) {
23            if (errno != ENOENT)
24                *template = 0;
25            return template;
26        }
27    } while (--retries);
28
29    *template = 0;
30    errno = EEXIST;
31    return template;
32}
33