aboutsummaryrefslogtreecommitdiff
path: root/toys/lsb
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2018-11-28 16:14:17 -0800
committerRob Landley <rob@landley.net>2018-11-28 21:28:23 -0600
commit40a09367f6f96c4ea1a70fdb0a33b38c9d98cd80 (patch)
treeb5298fbbb961d8a2ad294891280a6b4289755a51 /toys/lsb
parenta38fcb7587d5be68656a7e9492617200249770c9 (diff)
downloadtoybox-40a09367f6f96c4ea1a70fdb0a33b38c9d98cd80.tar.gz
mktemp: add -t and fix behavior.
The new tests pass on the host (coreutils 8.28) and with toybox after this patch is applied.
Diffstat (limited to 'toys/lsb')
-rw-r--r--toys/lsb/mktemp.c29
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);