Index: fusl/src/stdio/tempnam.c |
diff --git a/fusl/src/stdio/tempnam.c b/fusl/src/stdio/tempnam.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5a5597527c0851d5d2c45fff1c6f1e2459e81375 |
--- /dev/null |
+++ b/fusl/src/stdio/tempnam.c |
@@ -0,0 +1,49 @@ |
+#include <stdio.h> |
+#include <fcntl.h> |
+#include <errno.h> |
+#include <sys/stat.h> |
+#include <limits.h> |
+#include <string.h> |
+#include "syscall.h" |
+ |
+#define MAXTRIES 100 |
+ |
+char *__randname(char *); |
+ |
+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_lstat |
+ r = __syscall(SYS_lstat, s, &(struct stat){0}); |
+#else |
+ r = __syscall(SYS_fstatat, AT_FDCWD, s, |
+ &(struct stat){0}, AT_SYMLINK_NOFOLLOW); |
+#endif |
+ if (r == -ENOENT) return strdup(s); |
+ } |
+ return 0; |
+} |