diff options
Diffstat (limited to 'src/stdio/tempnam.c')
-rw-r--r-- | src/stdio/tempnam.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/stdio/tempnam.c b/src/stdio/tempnam.c new file mode 100644 index 0000000..0c65b1f --- /dev/null +++ b/src/stdio/tempnam.c @@ -0,0 +1,47 @@ +#include <stdio.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/stat.h> +#include <limits.h> +#include <string.h> +#include <stdlib.h> +#include "syscall.h" + +#define MAXTRIES 100 + +char *tempnam(const char *dir, const char *pfx) +{ + char s[PATH_MAX]; + size_t l, dl, pl; + int try; + int r; + + if (!dir) dir = P_tmpdir; + if (!pfx) pfx = "temp"; + + dl = strlen(dir); + pl = strlen(pfx); + l = dl + 1 + pl + 1 + 6; + + if (l >= PATH_MAX) { + errno = ENAMETOOLONG; + return 0; + } + + memcpy(s, dir, dl); + s[dl] = '/'; + memcpy(s+dl+1, pfx, pl); + s[dl+1+pl] = '_'; + s[l] = 0; + + for (try=0; try<MAXTRIES; try++) { + __randname(s+l-6); +#ifdef SYS_readlink + r = __syscall(SYS_readlink, s, (char[1]){0}, 1); +#else + r = __syscall(SYS_readlinkat, AT_FDCWD, s, (char[1]){0}, 1); +#endif + if (r == -ENOENT) return strdup(s); + } + return 0; +} |