diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-02-19 09:40:07 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-02-19 09:40:07 -0500 |
commit | 69ecbd0f3188be97f91cc0d6415836d23e88f7fc (patch) | |
tree | 0d74e8a311a2ec1a8d0be9fa0f09ac09004a448f | |
parent | 2e6239dd064d201c6e1b0f589bae9ff27949d2eb (diff) | |
download | musl-69ecbd0f3188be97f91cc0d6415836d23e88f7fc.tar.gz musl-69ecbd0f3188be97f91cc0d6415836d23e88f7fc.tar.xz musl-69ecbd0f3188be97f91cc0d6415836d23e88f7fc.zip |
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.
-rw-r--r-- | src/temp/mkdtemp.c | 5 | ||||
-rw-r--r-- | src/temp/mkstemp.c | 5 | ||||
-rw-r--r-- | src/temp/mktemp.c | 3 |
3 files changed, 8 insertions, 5 deletions
diff --git a/src/temp/mkdtemp.c b/src/temp/mkdtemp.c index f2ecc510..76140c77 100644 --- a/src/temp/mkdtemp.c +++ b/src/temp/mkdtemp.c @@ -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; diff --git a/src/temp/mkstemp.c b/src/temp/mkstemp.c index 20019ed9..a390d427 100644 --- a/src/temp/mkstemp.c +++ b/src/temp/mkstemp.c @@ -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; diff --git a/src/temp/mktemp.c b/src/temp/mktemp.c index 1462a16c..1057651e 100644 --- a/src/temp/mktemp.c +++ b/src/temp/mktemp.c @@ -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); |