<div dir="auto">Yes, that's what we've been talking about for days. Search for mktemp and glibc. <div dir="auto"><br></div><div dir="auto">Bionic will warm you at compile time instead, and musl should be silent. </div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Dec 5, 2018, 03:11 Reverend Homer <<a href="mailto:mk.43.ecko@gmail.com">mk.43.ecko@gmail.com</a> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Oops, now I have link-time warning:<br>
<br>
<br>
ld: generated/obj/mktemp.o: in function `mktemp_main':<br>
<br>
mktemp.c:(.text.mktemp_main+0xa9): warning: the use of `mktemp' is dangerous, <br>
better use `mkstemp' or `mkdtemp'<br>
<br>
<br>
R.H.<br>
<br>
On 29/11/2018 03:15, enh via Toybox wrote:<br>
> The new tests pass on the host (coreutils 8.28) and with toybox after<br>
> this patch is applied.<br>
> ---<br>
>   tests/mktemp.test | 21 +++++++++++++++++++++<br>
>   toys/lsb/mktemp.c | 29 ++++++++++++++++-------------<br>
>   2 files changed, 37 insertions(+), 13 deletions(-)<br>
>   create mode 100755 tests/mktemp.test<br>
><br>
> diff --git a/tests/mktemp.test b/tests/mktemp.test<br>
> new file mode 100755<br>
> index 0000000..d09d2c4<br>
> --- /dev/null<br>
> +++ b/tests/mktemp.test<br>
> @@ -0,0 +1,21 @@<br>
> +#!/bin/bash<br>
> +<br>
> +[ -f testing.sh ] && . testing.sh<br>
> +<br>
> +#testing "name" "command" "result" "infile" "stdin"<br>
> +<br>
> +# mktemp by default should use tmp.XXXXXXXXXX as the template,<br>
> +# and $TMPDIR as the directory.<br>
> +testing "mktemp" "TMPDIR=/t mktemp -u | grep -q<br>
> '^/t/tmp\...........$' && echo yes" "yes\n" "" ""<br>
> +<br>
> +# mktemp with a template should *not* use $TMPDIR.<br>
> +testing "mktemp TEMPLATE" "TMPDIR=/t mktemp -u hello.XXXXXXXX | grep<br>
> -q '^hello\.........$' && echo yes" "yes\n" "" ""<br>
> +<br>
> +# mktemp with -t and a template should use $TMPDIR.<br>
> +testing "mktemp -t TEMPLATE" "TMPDIR=/t mktemp -u -t hello.XXXXXXXX |<br>
> grep -q '^/t/hello\.........$' && echo yes" "yes\n" "" ""<br>
> +<br>
> +# mktemp with -p DIR and a template should use DIR.<br>
> +testing "mktemp -p DIR TEMPLATE" "TMPDIR=/t mktemp -u -p DIR<br>
> hello.XXXXXXXX | grep -q '^DIR/hello\.........$' && echo yes" "yes\n"<br>
> "" ""<br>
> +<br>
> +# mktemp -p DIR and -t: -t wins.<br>
> +testing "mktemp -p DIR -t TEMPLATE" "TMPDIR=/t mktemp -u -p DIR -t<br>
> hello.XXXXXXXX | grep -q '^/t/hello\.........$' && echo yes" "yes\n"<br>
> "" ""<br>
> diff --git a/toys/lsb/mktemp.c b/toys/lsb/mktemp.c<br>
> index 21bb9b3..440cf6b 100644<br>
> --- a/toys/lsb/mktemp.c<br>
> +++ b/toys/lsb/mktemp.c<br>
> @@ -4,7 +4,7 @@<br>
>    *<br>
>    * <a href="http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/mktemp.html" rel="noreferrer noreferrer" target="_blank">http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/mktemp.html</a><br>
><br>
> -USE_MKTEMP(NEWTOY(mktemp, ">1uqd(directory)p(tmpdir):", TOYFLAG_BIN))<br>
> +USE_MKTEMP(NEWTOY(mktemp, ">1uqd(directory)p(tmpdir):t", TOYFLAG_BIN))<br>
><br>
>   config MKTEMP<br>
>     bool "mktemp"<br>
> @@ -17,11 +17,11 @@ config MKTEMP<br>
>       -d Create directory instead of file (--directory)<br>
>       -p Put new file in DIR (--tmpdir)<br>
>       -q Quiet, no error messages<br>
> +    -t Prepend $TMPDIR or /tmp if unset<br>
>       -u Don't create anything, just print what would be created<br>
><br>
>       Each X in TEMPLATE is replaced with a random printable character. The<br>
> -    default TEMPLATE is tmp.XXXXXX, and the default DIR is $TMPDIR if set,<br>
> -    else "/tmp".<br>
> +    default TEMPLATE is tmp.XXXXXXXXXX.<br>
>   */<br>
><br>
>   #define FOR_mktemp<br>
> @@ -33,24 +33,27 @@ GLOBALS(<br>
><br>
>   void mktemp_main(void)<br>
>   {<br>
> -  int d_flag = toys.optflags & FLAG_d;<br>
>     char *template = *toys.optargs;<br>
><br>
> -  if (!template) template = "tmp.XXXXXX";<br>
> +  if (!template) {<br>
> +    toys.optflags |= FLAG_t;<br>
> +    template = "tmp.XXXXXXXXXX";<br>
> +  }<br>
><br>
> -  if (!TT.p) TT.p = getenv("TMPDIR");<br>
> +  if (!TT.p || (toys.optflags & FLAG_t)) TT.p = getenv("TMPDIR");<br>
>     if (!TT.p || !*TT.p) TT.p = "/tmp";<br>
><br>
> -  template = strchr(template, '/') ? xstrdup(template)<br>
> -             : xmprintf("%s/%s", TT.p, template);<br>
> +  // TODO: coreutils cleans paths, so -p /t/// would result in /t/xxx...<br>
> +  template = (strchr(template, '/') || !(toys.optflags & (FLAG_p|FLAG_t)))<br>
> +      ? xstrdup(template) : xmprintf("%s/%s", TT.p, template);<br>
><br>
> -  if (d_flag ? !mkdtemp(template) : mkstemp(template) == -1) {<br>
> +  if (toys.optflags & FLAG_u) {<br>
> +    mktemp(template);<br>
> +    xputs(template);<br>
> +  } else if (toys.optflags & FLAG_d ? !mkdtemp(template) :<br>
> mkstemp(template) == -1) {<br>
>       if (toys.optflags & FLAG_q) toys.exitval = 1;<br>
>       else perror_exit("Failed to create %s %s/%s",<br>
> -                     d_flag ? "directory" : "file", TT.p, template);<br>
> -  } else {<br>
> -    if (toys.optflags & FLAG_u) unlink(template);<br>
> -    xputs(template);<br>
> +        toys.optflags & FLAG_d ? "directory" : "file", TT.p, template);<br>
>     }<br>
><br>
>     if (CFG_TOYBOX_FREE) free(template);<br>
><br>
> _______________________________________________<br>
> Toybox mailing list<br>
> <a href="mailto:Toybox@lists.landley.net" target="_blank" rel="noreferrer">Toybox@lists.landley.net</a><br>
> <a href="http://lists.landley.net/listinfo.cgi/toybox-landley.net" rel="noreferrer noreferrer" target="_blank">http://lists.landley.net/listinfo.cgi/toybox-landley.net</a><br>
_______________________________________________<br>
Toybox mailing list<br>
<a href="mailto:Toybox@lists.landley.net" target="_blank" rel="noreferrer">Toybox@lists.landley.net</a><br>
<a href="http://lists.landley.net/listinfo.cgi/toybox-landley.net" rel="noreferrer noreferrer" target="_blank">http://lists.landley.net/listinfo.cgi/toybox-landley.net</a><br>
</blockquote></div>