diff options
Diffstat (limited to 'toys')
-rw-r--r-- | toys/lsb/mktemp.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/toys/lsb/mktemp.c b/toys/lsb/mktemp.c index 21bb9b36..440cf6b1 100644 --- a/toys/lsb/mktemp.c +++ b/toys/lsb/mktemp.c @@ -4,7 +4,7 @@ * * http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/mktemp.html -USE_MKTEMP(NEWTOY(mktemp, ">1uqd(directory)p(tmpdir):", TOYFLAG_BIN)) +USE_MKTEMP(NEWTOY(mktemp, ">1uqd(directory)p(tmpdir):t", TOYFLAG_BIN)) config MKTEMP bool "mktemp" @@ -17,11 +17,11 @@ config MKTEMP -d Create directory instead of file (--directory) -p Put new file in DIR (--tmpdir) -q Quiet, no error messages + -t Prepend $TMPDIR or /tmp if unset -u Don't create anything, just print what would be created Each X in TEMPLATE is replaced with a random printable character. The - default TEMPLATE is tmp.XXXXXX, and the default DIR is $TMPDIR if set, - else "/tmp". + default TEMPLATE is tmp.XXXXXXXXXX. */ #define FOR_mktemp @@ -33,24 +33,27 @@ GLOBALS( void mktemp_main(void) { - int d_flag = toys.optflags & FLAG_d; char *template = *toys.optargs; - if (!template) template = "tmp.XXXXXX"; + if (!template) { + toys.optflags |= FLAG_t; + template = "tmp.XXXXXXXXXX"; + } - if (!TT.p) TT.p = getenv("TMPDIR"); + if (!TT.p || (toys.optflags & FLAG_t)) TT.p = getenv("TMPDIR"); if (!TT.p || !*TT.p) TT.p = "/tmp"; - template = strchr(template, '/') ? xstrdup(template) - : xmprintf("%s/%s", TT.p, template); + // TODO: coreutils cleans paths, so -p /t/// would result in /t/xxx... + template = (strchr(template, '/') || !(toys.optflags & (FLAG_p|FLAG_t))) + ? xstrdup(template) : xmprintf("%s/%s", TT.p, template); - if (d_flag ? !mkdtemp(template) : mkstemp(template) == -1) { + if (toys.optflags & FLAG_u) { + mktemp(template); + xputs(template); + } else if (toys.optflags & FLAG_d ? !mkdtemp(template) : mkstemp(template) == -1) { if (toys.optflags & FLAG_q) toys.exitval = 1; else perror_exit("Failed to create %s %s/%s", - d_flag ? "directory" : "file", TT.p, template); - } else { - if (toys.optflags & FLAG_u) unlink(template); - xputs(template); + toys.optflags & FLAG_d ? "directory" : "file", TT.p, template); } if (CFG_TOYBOX_FREE) free(template); |