the historic mktemp is supposed to blank the template string on failure, rather than returning 0. just zero the first character so that mkstemp and mkdtemp can still retry with O(1) space requirement.
26 lines
582 B
C
26 lines
582 B
C
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <limits.h>
|
|
#include <errno.h>
|
|
#include <sys/stat.h>
|
|
#include "libc.h"
|
|
|
|
char *__mktemp(char *);
|
|
|
|
char *mkdtemp(char *template)
|
|
{
|
|
int retries = 100, t0 = *template;
|
|
while (retries--) {
|
|
if (!*__mktemp(template)) return 0;
|
|
if (!mkdir(template, 0700)) return template;
|
|
if (errno != EEXIST) return 0;
|
|
/* this is safe because mktemp verified
|
|
* that we have a valid template string */
|
|
template[0] = t0;
|
|
strcpy(template+strlen(template)-6, "XXXXXX");
|
|
}
|
|
return 0;
|
|
}
|