From 2cc63358cdb0309ca996ffe56ccf402c2f2f16d5 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 20 Feb 2013 22:43:23 -0500 Subject: add mkostemp, mkstemps, and mkostemps functions and reorganize temp internals 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. --- src/temp/mkostemps.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/temp/mkostemps.c (limited to 'src/temp/mkostemps.c') diff --git a/src/temp/mkostemps.c b/src/temp/mkostemps.c new file mode 100644 index 00000000..804a5475 --- /dev/null +++ b/src/temp/mkostemps.c @@ -0,0 +1,32 @@ +#define _BSD_SOURCE +#include +#include +#include +#include +#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); -- cgit v1.2.1