# HG changeset patch # User Elliot Hughes # Date 1423358879 21600 # Node ID 4bcfe4cf3e505b3dba49233e76f4b41229c98a05 # Parent 543bee60af4c96cc13317a7523633356da61424e Use $TMPDIR if set (necessary on Android, where there is no /tmp). Include full template in error messages. Don't report success on failure with -q. Avoid unnecessary allocation. Fix "xxxxxx" versus "XXXXXX" confusion. diff -r 543bee60af4c -r 4bcfe4cf3e50 toys/lsb/mktemp.c --- a/toys/lsb/mktemp.c Sat Feb 07 17:20:23 2015 -0600 +++ b/toys/lsb/mktemp.c Sat Feb 07 19:27:59 2015 -0600 @@ -12,8 +12,8 @@ help usage: mktemp [-dq] [-p DIR] [TEMPLATE] - Safely create new file and print its name. Default TEMPLATE is - /tmp/tmp.XXXXXX and each trailing X is replaced with random char. + Safely create a new file and print its name. The default TEMPLATE is + tmp.XXXXXX. The default DIR is $TMPDIR, or /tmp if $TMPDIR is not set. -d, --directory Create directory instead of file -p DIR, --tmpdir=DIR Put new file in DIR @@ -29,24 +29,27 @@ void mktemp_main(void) { - int d_flag = toys.optflags & FLAG_d; - char *tmp; + int d_flag = toys.optflags & FLAG_d; + char *template = *toys.optargs; + int success; - tmp = *toys.optargs; - - if (!tmp) { - if (!TT.tmpdir) TT.tmpdir = "/tmp"; - tmp = "tmp.xxxxxx"; + if (!template) { + template = "tmp.XXXXXX"; } - if (TT.tmpdir) tmp = xmprintf("%s/%s", TT.tmpdir ? TT.tmpdir : "/tmp", - *toys.optargs ? *toys.optargs : "tmp.XXXXXX"); + + if (!TT.tmpdir) TT.tmpdir = getenv("TMPDIR"); + if (!TT.tmpdir) TT.tmpdir = "/tmp"; + + snprintf(toybuf, sizeof(toybuf), "%s/%s", TT.tmpdir, template); - if (d_flag ? mkdtemp(tmp) == NULL : mkstemp(tmp) == -1) - if (toys.optflags & FLAG_q) - perror_exit("Failed to create temporary %s", - d_flag ? "directory" : "file"); + if (d_flag ? mkdtemp(toybuf) == NULL : mkstemp(toybuf) == -1) { + if (toys.optflags & FLAG_q) { + toys.exitval = 1; + } else { + perror_exit("Failed to create temporary %s with template %s/%s", + d_flag ? "directory" : "file", TT.tmpdir, template); + } + } - xputs(tmp); - - if (CFG_TOYBOX_FREE && TT.tmpdir) free(tmp); + xputs(toybuf); }