<div dir="ltr"><div dir="ltr"><div>Multiple bugs:<br></div><div><br></div><div>* We weren't outputting anything in the case where we actually create a</div><div>  file or directory (but all the tests were for the -u case).</div><div><br></div><div>* There are more gnarls to the behavior if TEMPLATE contains a '/'. The</div><div>  new tests cover these.</div><div><br></div><div>Additionally, I've realized that glibc's mktemp(3) doesn't seem to do</div><div>exactly what we want (it only seems to randomize 6 'X's), so we'll need</div><div>to implement our own mktemp(3) replacement anyway. I'll do that in a</div><div>separate patch, though, because folks are understandably upset that I</div><div>broke mktemp...</div><div>---</div><div> tests/mktemp.test | 11 ++++++++++-</div><div> toys/lsb/mktemp.c |  9 +++++++--</div><div> 2 files changed, 17 insertions(+), 3 deletions(-)</div><div><br></div><div>diff --git a/tests/mktemp.test b/tests/mktemp.test</div><div>index ee7702dc..ee023d6b 100755</div><div>--- a/tests/mktemp.test</div><div>+++ b/tests/mktemp.test</div><div>@@ -6,11 +6,20 @@</div><div> </div><div> # mktemp by default should use tmp.XXXXXXXXXX as the template,</div><div> # and $TMPDIR as the directory.</div><div>-testing "default" "TMPDIR=/t mktemp -u | grep -q '^/t/tmp\...........$' && echo yes" "yes\n" "" ""</div><div>+testing "default" "TMPDIR=. mktemp | grep -q '^./tmp\...........$' && echo yes" "yes\n" "" ""</div><div>+</div><div>+# Test that -d creates a directory and the default is a file.</div><div>+testing "dir" "test -d `TMPDIR=. mktemp -d` && echo yes" "yes\n" "" ""</div><div>+testing "file" "test -f `TMPDIR=. mktemp` && echo yes" "yes\n" "" ""</div><div> </div><div> # mktemp with a template should *not* use $TMPDIR.</div><div> testing "TEMPLATE" "TMPDIR=/t mktemp -u hello.XXXXXXXX | grep -q '^hello\.........$' && echo yes" "yes\n" "" ""</div><div> </div><div>+# mktemp with a template that includes a '/' should ignore $TMPDIR</div><div>+testing "/ TEMPLATE" "TMPDIR=/t mktemp -u /x/hello.XXXXXXXX | grep -q '^/x/hello\.........$' && echo yes" "yes\n" "" ""</div><div>+# ...and setting DIR is an error.</div><div>+testing "/ TEMPLATE -p DIR" "TMPDIR=/t mktemp -p DIR -u /x/hello.XXXXXXXX || echo error" "error\n" "" ""</div><div>+</div><div> # mktemp with -t and a template should use $TMPDIR.</div><div> testing "-t TEMPLATE" "TMPDIR=/t mktemp -u -t hello.XXXXXXXX | grep -q '^/t/hello\.........$' && echo yes" "yes\n" "" ""</div><div> </div><div>diff --git a/toys/lsb/mktemp.c b/toys/lsb/mktemp.c</div><div>index 112f84c4..57d1d118 100644</div><div>--- a/toys/lsb/mktemp.c</div><div>+++ b/toys/lsb/mktemp.c</div><div>@@ -34,7 +34,11 @@ GLOBALS(</div><div> void mktemp_main(void)</div><div> {</div><div>   char *template = *toys.optargs;</div><div>-  int use_dir = (toys.optflags & (FLAG_p|FLAG_t));</div><div>+  int template_dir = template && !!strchr(template, '/');</div><div>+  int flags_dir = (toys.optflags & (FLAG_p|FLAG_t));</div><div>+  int use_dir = flags_dir && !template_dir;</div><div>+</div><div>+  if (template_dir && flags_dir) error_exit("conflicting directories given");</div><div> </div><div>   if (!template) {</div><div>     template = "tmp.XXXXXXXXXX";</div><div>@@ -58,12 +62,13 @@ void mktemp_main(void)</div><div>   template = use_dir ? xmprintf("%s/%s", TT.p, template) : xstrdup(template);</div><div> </div><div>   if (toys.optflags & FLAG_u) {</div><div>-    xputs(mktemp(template));</div><div>+    template = mktemp(template);</div><div>   } else if (toys.optflags & FLAG_d ? !mkdtemp(template) : mkstemp(template) == -1) {</div><div>     if (toys.optflags & FLAG_q) toys.exitval = 1;</div><div>     else perror_exit("Failed to create %s %s/%s",</div><div>         toys.optflags & FLAG_d ? "directory" : "file", TT.p, template);</div><div>   }</div><div>+  xputs(template);</div><div> </div><div>   if (CFG_TOYBOX_FREE) free(template);</div><div> }</div><div>-- </div><div>2.20.0.rc1.387.gf8505762e3-goog</div><div><br></div></div></div>