summaryrefslogtreecommitdiff
path: root/util/libreboot-utils/lib/mkhtemp.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/libreboot-utils/lib/mkhtemp.c')
-rw-r--r--util/libreboot-utils/lib/mkhtemp.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/util/libreboot-utils/lib/mkhtemp.c b/util/libreboot-utils/lib/mkhtemp.c
index b30f6587..d1ebea25 100644
--- a/util/libreboot-utils/lib/mkhtemp.c
+++ b/util/libreboot-utils/lib/mkhtemp.c
@@ -39,6 +39,58 @@ new_tmpdir(int *fd, char **path)
return new_tmp_common(fd, path, MKHTEMP_DIR);
}
+/* not used by mkhtemp util, but by nvmutil.
+ * it leaves an st variable set after return,
+ * so that verification can be done on a file
+ * being used, before writing it elsewhere
+ */
+int
+new_tmpfile_at(int dirfd, struct stat *st_dir,
+ int *fd, char **name)
+{
+ struct stat st;
+ char suffix[] = "tmp.XXXXXXXXXX";
+ size_t len;
+ char *buf = NULL;
+ char *fname;
+ int saved_errno = errno;
+
+#if defined(PATH_LEN) && \
+ (PATH_LEN) >= 256
+ size_t maxlen = PATH_LEN;
+#else
+ size_t maxlen = 4096;
+#endif
+
+ if (if_err(fd == NULL || name == NULL || st_dir == NULL, EFAULT) ||
+ if_err(*fd >= 0, EEXIST) ||
+ if_err(dirfd < 0, EBADF) ||
+ if_err_sys(slen(suffix, maxlen, &len) < 0) ||
+ if_err_sys((malloc(len + 1)) == NULL))
+ return -1;
+
+ memcpy(buf, suffix, len + 1);
+ fname = buf;
+
+ *fd = mkhtemp(fd, &st,
+ buf, dirfd, fname,
+ st_dir, MKHTEMP_FILE);
+
+ if (*fd < 0)
+ goto err;
+
+ *name = buf;
+ errno = saved_errno;
+
+ return 0;
+
+err:
+ free_if_null(&buf);
+ close_no_err(fd);
+
+ return -1;
+}
+
/* WARNING:
* on error, *path (at **path) may be
NULL, or if the error pertains to