make mktemp match the historic behavior, and update functions that use it

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.
This commit is contained in:
Rich Felker 2011-02-19 09:40:07 -05:00
parent 2e6239dd06
commit 69ecbd0f31
3 changed files with 8 additions and 5 deletions

View File

@ -12,13 +12,14 @@ char *__mktemp(char *);
char *mkdtemp(char *template)
{
int retries = 100;
int retries = 100, t0 = *template;
while (retries--) {
if (!__mktemp(template)) return 0;
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;

View File

@ -11,14 +11,15 @@ char *__mktemp(char *);
int mkstemp(char *template)
{
int fd, retries = 100;
int fd, retries = 100, t0 = *template;
while (retries--) {
if (!__mktemp(template)) return -1;
if (!*__mktemp(template)) return -1;
if ((fd = open(template, O_RDWR | O_CREAT | O_EXCL, 0600))>=0)
return fd;
if (errno != EEXIST) return -1;
/* this is safe because mktemp verified
* that we have a valid template string */
template[0] = t0;
strcpy(template+strlen(template)-6, "XXXXXX");
}
return -1;

View File

@ -26,8 +26,9 @@ char *__mktemp(char *template)
if (access(template, F_OK) < 0) return template;
r = r * 1103515245 + 12345;
}
*template = 0;
errno = EEXIST;
return 0;
return template;
}
weak_alias(__mktemp, mktemp);