mirror of https://git.musl-libc.org/git/musl
Browse Source
based on patch contributed by Anthony G. Basile (blueness) some issues remain with the filename generation algorithm and other small bugs, but this patch has been sitting around long enough that I feel it's best to get it committed and then work out any remaining issues.rs-1.0
7 changed files with 91 additions and 29 deletions
@ -0,0 +1,21 @@ |
|||
#include <string.h> |
|||
#include <time.h> |
|||
#include <stdint.h> |
|||
|
|||
int __clock_gettime(clockid_t, struct timespec *); |
|||
|
|||
/* This assumes that a check for the
|
|||
template size has alrady been made */ |
|||
char *__randname(char *template) |
|||
{ |
|||
int i; |
|||
struct timespec ts; |
|||
unsigned long r; |
|||
|
|||
__clock_gettime(CLOCK_REALTIME, &ts); |
|||
r = ts.tv_nsec*65537 ^ (uintptr_t)&ts / 16 + (uintptr_t)template; |
|||
for (i=0; i<6; i++, r>>=5) |
|||
template[i] = 'A'+(r&15)+(r&16)*2; |
|||
|
|||
return template; |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
#define _BSD_SOURCE |
|||
#include <stdlib.h> |
|||
#include "libc.h" |
|||
|
|||
int __mkostemps(char *, int, int); |
|||
|
|||
int mkostemp(char *template, int flags) |
|||
{ |
|||
return __mkostemps(template, 0, flags); |
|||
} |
|||
|
|||
LFS64(mkostemp); |
|||
@ -0,0 +1,32 @@ |
|||
#define _BSD_SOURCE |
|||
#include <string.h> |
|||
#include <fcntl.h> |
|||
#include <unistd.h> |
|||
#include <errno.h> |
|||
#include "libc.h" |
|||
|
|||
char *__randname(char *); |
|||
|
|||
int __mkostemps(char *template, int len, int flags) |
|||
{ |
|||
if (len < 0) return EINVAL; |
|||
|
|||
size_t l = strlen(template)-len; |
|||
if (l < 6 || strncmp(template+l-6, "XXXXXX", 6)) { |
|||
errno = EINVAL; |
|||
*template = 0; |
|||
return -1; |
|||
} |
|||
|
|||
int fd, retries = 100; |
|||
while (retries--) { |
|||
__randname(template+l-6); |
|||
if ((fd = open(template, flags | O_RDWR | O_CREAT | O_EXCL, 0600))>=0) |
|||
return fd; |
|||
if (errno != EEXIST) return -1; |
|||
} |
|||
return -1; |
|||
} |
|||
|
|||
weak_alias(__mkostemps, mkostemps); |
|||
weak_alias(__mkostemps, mkostemps64); |
|||
@ -1,28 +1,11 @@ |
|||
#include <string.h> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <fcntl.h> |
|||
#include <unistd.h> |
|||
#include <limits.h> |
|||
#include <errno.h> |
|||
#include "libc.h" |
|||
|
|||
char *__mktemp(char *); |
|||
int __mkostemps(char *, int, int); |
|||
|
|||
int mkstemp(char *template) |
|||
{ |
|||
int fd, retries = 100, t0 = *template; |
|||
while (retries--) { |
|||
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; |
|||
return __mkostemps(template, 0, 0); |
|||
} |
|||
|
|||
LFS64(mkstemp); |
|||
|
|||
@ -0,0 +1,12 @@ |
|||
#define _BSD_SOURCE |
|||
#include <stdlib.h> |
|||
#include "libc.h" |
|||
|
|||
int __mkostemps(char *, int, int); |
|||
|
|||
int mkstemps(char *template, int len) |
|||
{ |
|||
return __mkostemps(template, len, 0); |
|||
} |
|||
|
|||
LFS64(mkstemps); |
|||
Loading…
Reference in new issue