summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-01-22 11:08:52 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2018-01-25 08:28:05 +0100
commit94e561b3648a2c921a6c8faa6c79201c78f8ecfe (patch)
tree6ca0b382a90456d568e3bca358f74a95f826b281
parent3f86edfc2b942e57d452feca0450a6fb14066fbd (diff)
downloadbarebox-94e561b3648a2c921a6c8faa6c79201c78f8ecfe.tar.gz
barebox-94e561b3648a2c921a6c8faa6c79201c78f8ecfe.tar.xz
libfile: implement make_temp
Create a make_temp() function which creates a name for a temporary file. Since we do not have any concurrency in barebox we do not need to create the file right away and can leave that to the caller. Unlike unix mktemp the resulting filename is dynamically allocated and must be freed by the caller. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--include/libfile.h2
-rw-r--r--lib/libfile.c27
2 files changed, 29 insertions, 0 deletions
diff --git a/include/libfile.h b/include/libfile.h
index dd0b00f988..6dbb81a241 100644
--- a/include/libfile.h
+++ b/include/libfile.h
@@ -26,4 +26,6 @@ int make_directory(const char *pathname);
int unlink_recursive(const char *path, char **failedpath);
+char *make_temp(const char *template);
+
#endif /* __LIBFILE_H */
diff --git a/lib/libfile.c b/lib/libfile.c
index 6b70306dbd..79054eb5ac 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -20,6 +20,7 @@
#include <malloc.h>
#include <libfile.h>
#include <progress.h>
+#include <stdlib.h>
#include <linux/stat.h>
/*
@@ -485,3 +486,29 @@ int open_and_lseek(const char *filename, int mode, loff_t pos)
return fd;
}
+
+/**
+ * make_temp - create a name for a temporary file
+ * @template: The filename prefix
+ *
+ * This function creates a name for a temporary file. @template is used as a
+ * template for the name which gets appended a 8-digit hexadecimal number to
+ * create a unique filename.
+ *
+ * Return: This function returns a filename which can be used as a temporary
+ * file lateron. The returned filename must be freed by the caller.
+ */
+char *make_temp(const char *template)
+{
+ char *name = NULL;
+ struct stat s;
+ int ret;
+
+ do {
+ free(name);
+ name = basprintf("/tmp/%s-%08x", template, random32());
+ ret = stat(name, &s);
+ } while (!ret);
+
+ return name;
+}