diff options
Diffstat (limited to 'util/libreboot-utils/lib/mkhtemp.c')
| -rw-r--r-- | util/libreboot-utils/lib/mkhtemp.c | 92 |
1 files changed, 29 insertions, 63 deletions
diff --git a/util/libreboot-utils/lib/mkhtemp.c b/util/libreboot-utils/lib/mkhtemp.c index d1ebea25..87d7c8dc 100644 --- a/util/libreboot-utils/lib/mkhtemp.c +++ b/util/libreboot-utils/lib/mkhtemp.c @@ -27,70 +27,21 @@ #include "../include/common.h" +/* note: tmpdir is an override of TMPDIR or /tmp or /var/tmp */ int -new_tmpfile(int *fd, char **path) +new_tmpfile(int *fd, char **path, char *tmpdir) { - return new_tmp_common(fd, path, MKHTEMP_FILE); + return new_tmp_common(fd, path, MKHTEMP_FILE, tmpdir); } +/* note: tmpdir is an override of TMPDIR or /tmp or /var/tmp */ int -new_tmpdir(int *fd, char **path) +new_tmpdir(int *fd, char **path, char *tmpdir) { - 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; + return new_tmp_common(fd, path, MKHTEMP_DIR, tmpdir); } +/* note: tmpdir is an override of TMPDIR or /tmp or /var/tmp */ /* WARNING: * on error, *path (at **path) may be NULL, or if the error pertains to @@ -107,7 +58,8 @@ err: * default to /tmp or /var/tmp */ int -new_tmp_common(int *fd, char **path, int type) +new_tmp_common(int *fd, char **path, int type, + char *tmpdir) { #if defined(PATH_LEN) && \ (PATH_LEN) >= 256 @@ -118,7 +70,6 @@ new_tmp_common(int *fd, char **path, int type) struct stat st; char suffix[] = "tmp.XXXXXXXXXX"; - char *tmpdir = NULL; size_t dirlen; size_t destlen; @@ -152,15 +103,25 @@ new_tmp_common(int *fd, char **path, int type) * (on error, it will not be touched) */ - *fd = -1; + if (tmpdir == NULL) { /* no user override */ +#if defined(PERMIT_NON_STICKY_ALWAYS) && \ + ((PERMIT_NON_STICKY_ALWAYS) > 0) + tmpdir = env_tmpdir(PERMIT_NON_STICKY_ALWAYS, &fail_dir, NULL); +#else + tmpdir = env_tmpdir(0, &fail_dir, NULL); +#endif + } else { + #if defined(PERMIT_NON_STICKY_ALWAYS) && \ ((PERMIT_NON_STICKY_ALWAYS) > 0) - tmpdir = env_tmpdir(PERMIT_NON_STICKY_ALWAYS, &fail_dir); + tmpdir = env_tmpdir(PERMIT_NON_STICKY_ALWAYS, &fail_dir, + tmpdir); #else - tmpdir = env_tmpdir(0, &fail_dir); + tmpdir = env_tmpdir(0, &fail_dir, tmpdir); #endif + } if (tmpdir == NULL) goto err; @@ -241,7 +202,8 @@ err: */ char * -env_tmpdir(int bypass_all_sticky_checks, char **tmpdir) +env_tmpdir(int bypass_all_sticky_checks, char **tmpdir, + char *override_tmpdir) { char *t; int allow_noworld_unsticky; @@ -250,7 +212,11 @@ env_tmpdir(int bypass_all_sticky_checks, char **tmpdir) char tmp[] = "/tmp"; char vartmp[] = "/var/tmp"; - t = getenv("TMPDIR"); + /* tmpdir is a user override, if set */ + if (override_tmpdir == NULL) + t = getenv("TMPDIR"); + else + t = override_tmpdir; if (t != NULL && *t != '\0') { |
