Date: Thu, 25 Feb 2010 21:00:42 -0800 From: Garrett Cooper <yanefbsd@gmail.com> To: FreeBSD-Hackers <freebsd-hackers@freebsd.org> Subject: Re: mktemp(1) in /tmp or $PWD? Message-ID: <7d6fde3d1002252100oc64434ci5f6783ff10a9f0ea@mail.gmail.com> In-Reply-To: <7d6fde3d1002251850m3d32904emece0182e905b84c5@mail.gmail.com> References: <7d6fde3d1002251850m3d32904emece0182e905b84c5@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--001636e1f73d0f220b048079c89a Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On Thu, Feb 25, 2010 at 6:50 PM, Garrett Cooper <yanefbsd@gmail.com> wrote: > Hi Hackers, > =A0 =A0Really basic question (because I'm relatively new to the Unix > scene -- only been using it for the last 10 years, so I don't know if > this was done for backwards compatibility with SysV) -- is mktemp(1) > without -t supposed to default to $PWD instead of /tmp if a template > is specified, e.g. > > [root@left4dead /usr/home/garrcoop]# mktemp fooXXXXXX > foovE3FLt > [root@left4dead /usr/home/garrcoop]# ls foovE3FLt > foovE3FLt > > =A0 =A0I ask because GNU coreutils' copy of mktemp (I know... I know...) > defaults to /tmp if $TMPDIR isn't specified. And this is the reason why I asked... I was getting annoyed when I ran out of space in /usr today iteratively trying to generate mfsroots because I expected the default temp directory to be /tmp. Turns out it wasn't, and the reason why is that $PWD is the assumed $TMPDIR iff an argument with -t isn't specified. So what I did was I wrote up a patch to be *I know... here it comes* more like GNU coreutils' copy of mktemp. Three behavioral changes I'm proposing are: 1. If mktemp is called without a prefix or template, it will automatically generate one file (or directory) instead of erroring out. That way if someone wants to call mktemp, they will automatically get a file instead of having to produce a template or prefix. 2. $TMPDIR (or /tmp if not specified) will automatically get tacked onto each file, instead of it being implicitly $PWD; that way a bunch of temporary files will be generated _in_ /tmp (and subsequently wiped on each reboot if the sysadmin sets it up that way) instead of having a boatload of temporary files spread across a machine, which the user must clean up based on the current working directory for their applications. 3. All files will be prefixed with `tmp' by default instead of `mktemp' (for consistency with GNU coreutils, and also because it allows folks to increase the size of the random string in the files). If folks like it, I'll create a PR with this change and also update the manpage to reflect the change. Thanks, -Garrett Index: mktemp.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- mktemp.c (revision 204344) +++ mktemp.c (working copy) @@ -48,6 +48,12 @@ static void usage(void); +#define MK_TEMPLATE(template) \ + asprintf(&name, "%s%s%s", \ + (tmpdir =3D=3D NULL ? _PATH_TMP : tmpdir), \ + (tmpdir =3D=3D NULL ? "" : "/" ), \ + template) + int main(int argc, char **argv) { @@ -55,13 +61,13 @@ char *tmpdir; const char *prefix; char *name; - int dflag, qflag, tflag, uflag; + int dflag, qflag, uflag; - ret =3D dflag =3D qflag =3D tflag =3D uflag =3D 0; - prefix =3D "mktemp"; + ret =3D dflag =3D qflag =3D uflag =3D 0; + prefix =3D NULL; name =3D NULL; - while ((c =3D getopt(argc, argv, "dqt:u")) !=3D -1) + while ((c =3D getopt(argc, argv, "dqt:u")) !=3D -1) { switch (c) { case 'd': dflag++; @@ -73,7 +79,6 @@ case 't': prefix =3D optarg; - tflag++; break; case 'u': @@ -83,16 +88,29 @@ default: usage(); } + } argc -=3D optind; argv +=3D optind; - if (tflag) { - tmpdir =3D getenv("TMPDIR"); - if (tmpdir =3D=3D NULL) - asprintf(&name, "%s%s.XXXXXXXX", _PATH_TMP, prefix); - else - asprintf(&name, "%s/%s.XXXXXXXX", tmpdir, prefix); + tmpdir =3D getenv("TMPDIR"); + + /* + * User didn't specify anything; let's default to a file prefixed by + * tmp* + */ + if (prefix =3D=3D NULL && argc =3D=3D 0) { + prefix =3D "tmp.XXXXXX"; + } + + /* + * Make sure that the user specified an option with -t (or nothing + * at all -- which equates to a file in tmp prefixed file). + */ + if (prefix !=3D NULL) { + + MK_TEMPLATE(prefix); + /* if this fails, the program is in big trouble already */ if (name =3D=3D NULL) { if (qflag) @@ -100,44 +118,58 @@ else errx(1, "cannot generate template"); } - } else if (argc < 1) { - usage(); + } - =09 + /* generate all requested files */ while (name !=3D NULL || argc > 0) { + if (name =3D=3D NULL) { - name =3D strdup(argv[0]); + MK_TEMPLATE(argv[0]); argv++; argc--; } - if (dflag) { - if (mkdtemp(name) =3D=3D NULL) { - ret =3D 1; - if (!qflag) - warn("mkdtemp failed on %s", name); + /* Just in case asprintf(3) ala MK_TEMPLATE fails. */ + if (name !=3D NULL) { + + if (dflag) { + + if (mkdtemp(name) =3D=3D NULL) { + ret =3D 1; + if (!qflag) { + warn("mkdtemp failed on %s", + name); + } + } else { + printf("%s\n", name); + if (uflag) + rmdir(name); + } } else { - printf("%s\n", name); - if (uflag) - rmdir(name); + + fd =3D mkstemp(name); + if (fd < 0) { + ret =3D 1; + if (!qflag) { + warn("mkstemp failed on %s", + name); + } + } else { + close(fd); + if (uflag) + unlink(name); + printf("%s\n", name); + } + } - } else { - fd =3D mkstemp(name); - if (fd < 0) { - ret =3D 1; - if (!qflag) - warn("mkstemp failed on %s", name); - } else { - close(fd); - if (uflag) - unlink(name); - printf("%s\n", name); - } + + free(name); + } - if (name) - free(name); + name =3D NULL; + } return (ret); } --001636e1f73d0f220b048079c89a Content-Type: application/octet-stream; name="more-gnuish-mktemp.diff" Content-Disposition: attachment; filename="more-gnuish-mktemp.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g64ilrwc1 SW5kZXg6IG1rdGVtcC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG1rdGVtcC5jCShyZXZpc2lvbiAyMDQzNDQp CisrKyBta3RlbXAuYwkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsMTIgQEAKIAogc3RhdGlj IHZvaWQgdXNhZ2Uodm9pZCk7CiAKKyNkZWZpbmUgTUtfVEVNUExBVEUodGVtcGxhdGUpIFwKKwlh c3ByaW50ZigmbmFtZSwgIiVzJXMlcyIsIFwKKwkJCSh0bXBkaXIgPT0gTlVMTCA/IF9QQVRIX1RN UCA6IHRtcGRpciksIFwKKwkJCSh0bXBkaXIgPT0gTlVMTCA/ICIiIDogIi8iICksIFwKKwkJCXRl bXBsYXRlKQorCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewpAQCAtNTUsMTMg KzYxLDEzIEBACiAJY2hhciAqdG1wZGlyOwogCWNvbnN0IGNoYXIgKnByZWZpeDsKIAljaGFyICpu YW1lOwotCWludCBkZmxhZywgcWZsYWcsIHRmbGFnLCB1ZmxhZzsKKwlpbnQgZGZsYWcsIHFmbGFn LCB1ZmxhZzsKIAotCXJldCA9IGRmbGFnID0gcWZsYWcgPSB0ZmxhZyA9IHVmbGFnID0gMDsKLQlw cmVmaXggPSAibWt0ZW1wIjsKKwlyZXQgPSBkZmxhZyA9IHFmbGFnID0gdWZsYWcgPSAwOworCXBy ZWZpeCA9IE5VTEw7CiAJbmFtZSA9IE5VTEw7CiAKLQl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywg YXJndiwgImRxdDp1IikpICE9IC0xKQorCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAi ZHF0OnUiKSkgIT0gLTEpIHsKIAkJc3dpdGNoIChjKSB7CiAJCWNhc2UgJ2QnOgogCQkJZGZsYWcr KzsKQEAgLTczLDcgKzc5LDYgQEAKIAogCQljYXNlICd0JzoKIAkJCXByZWZpeCA9IG9wdGFyZzsK LQkJCXRmbGFnKys7CiAJCQlicmVhazsKIAogCQljYXNlICd1JzoKQEAgLTgzLDE2ICs4OCwyOSBA QAogCQlkZWZhdWx0OgogCQkJdXNhZ2UoKTsKIAkJfQorCX0KIAogCWFyZ2MgLT0gb3B0aW5kOwog CWFyZ3YgKz0gb3B0aW5kOwogCi0JaWYgKHRmbGFnKSB7Ci0JCXRtcGRpciA9IGdldGVudigiVE1Q RElSIik7Ci0JCWlmICh0bXBkaXIgPT0gTlVMTCkKLQkJCWFzcHJpbnRmKCZuYW1lLCAiJXMlcy5Y WFhYWFhYWCIsIF9QQVRIX1RNUCwgcHJlZml4KTsKLQkJZWxzZQotCQkJYXNwcmludGYoJm5hbWUs ICIlcy8lcy5YWFhYWFhYWCIsIHRtcGRpciwgcHJlZml4KTsKKwl0bXBkaXIgPSBnZXRlbnYoIlRN UERJUiIpOworCisJLyogCisJICogVXNlciBkaWRuJ3Qgc3BlY2lmeSBhbnl0aGluZzsgbGV0J3Mg ZGVmYXVsdCB0byBhIGZpbGUgcHJlZml4ZWQgYnkKKwkgKiB0bXAqCisJICovCisJaWYgKHByZWZp eCA9PSBOVUxMICYmIGFyZ2MgPT0gMCkgeworCQlwcmVmaXggPSAidG1wLlhYWFhYWCI7CisJfQor CisJLyogCisJICogTWFrZSBzdXJlIHRoYXQgdGhlIHVzZXIgc3BlY2lmaWVkIGFuIG9wdGlvbiB3 aXRoIC10IChvciBub3RoaW5nCisJICogYXQgYWxsIC0tIHdoaWNoIGVxdWF0ZXMgdG8gYSBmaWxl IGluIHRtcCBwcmVmaXhlZCBmaWxlKS4KKwkgKi8KKwlpZiAocHJlZml4ICE9IE5VTEwpIHsKKwor CQlNS19URU1QTEFURShwcmVmaXgpOworCiAJCS8qIGlmIHRoaXMgZmFpbHMsIHRoZSBwcm9ncmFt IGlzIGluIGJpZyB0cm91YmxlIGFscmVhZHkgKi8KIAkJaWYgKG5hbWUgPT0gTlVMTCkgewogCQkJ aWYgKHFmbGFnKQpAQCAtMTAwLDQ0ICsxMTgsNTggQEAKIAkJCWVsc2UKIAkJCQllcnJ4KDEsICJj YW5ub3QgZ2VuZXJhdGUgdGVtcGxhdGUiKTsKIAkJfQotCX0gZWxzZSBpZiAoYXJnYyA8IDEpIHsK LQkJdXNhZ2UoKTsKKwogCX0KLQkJCisKIAkvKiBnZW5lcmF0ZSBhbGwgcmVxdWVzdGVkIGZpbGVz ICovCiAJd2hpbGUgKG5hbWUgIT0gTlVMTCB8fCBhcmdjID4gMCkgeworCiAJCWlmIChuYW1lID09 IE5VTEwpIHsKLQkJCW5hbWUgPSBzdHJkdXAoYXJndlswXSk7CisJCQlNS19URU1QTEFURShhcmd2 WzBdKTsKIAkJCWFyZ3YrKzsKIAkJCWFyZ2MtLTsKIAkJfQogCi0JCWlmIChkZmxhZykgewotCQkJ aWYgKG1rZHRlbXAobmFtZSkgPT0gTlVMTCkgewotCQkJCXJldCA9IDE7Ci0JCQkJaWYgKCFxZmxh ZykKLQkJCQkJd2FybigibWtkdGVtcCBmYWlsZWQgb24gJXMiLCBuYW1lKTsKKwkJLyogSnVzdCBp biBjYXNlIGFzcHJpbnRmKDMpIGFsYSBNS19URU1QTEFURSBmYWlscy4gKi8KKwkJaWYgKG5hbWUg IT0gTlVMTCkgeworCisJCQlpZiAoZGZsYWcpIHsKKworCQkJCWlmIChta2R0ZW1wKG5hbWUpID09 IE5VTEwpIHsKKwkJCQkJcmV0ID0gMTsKKwkJCQkJaWYgKCFxZmxhZykgeworCQkJCQkJd2Fybigi bWtkdGVtcCBmYWlsZWQgb24gJXMiLAorCQkJCQkJICAgICBuYW1lKTsKKwkJCQkJfQorCQkJCX0g ZWxzZSB7CisJCQkJCXByaW50ZigiJXNcbiIsIG5hbWUpOworCQkJCQlpZiAodWZsYWcpCisJCQkJ CQlybWRpcihuYW1lKTsKKwkJCQl9CiAJCQl9IGVsc2UgewotCQkJCXByaW50ZigiJXNcbiIsIG5h bWUpOwotCQkJCWlmICh1ZmxhZykKLQkJCQkJcm1kaXIobmFtZSk7CisKKwkJCQlmZCA9IG1rc3Rl bXAobmFtZSk7CisJCQkJaWYgKGZkIDwgMCkgeworCQkJCQlyZXQgPSAxOworCQkJCQlpZiAoIXFm bGFnKSB7CisJCQkJCQl3YXJuKCJta3N0ZW1wIGZhaWxlZCBvbiAlcyIsCisJCQkJCQkgICAgIG5h bWUpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJY2xvc2UoZmQpOworCQkJCQlpZiAodWZs YWcpCisJCQkJCQl1bmxpbmsobmFtZSk7CisJCQkJCXByaW50ZigiJXNcbiIsIG5hbWUpOworCQkJ CX0KKwogCQkJfQotCQl9IGVsc2UgewotCQkJZmQgPSBta3N0ZW1wKG5hbWUpOwotCQkJaWYgKGZk IDwgMCkgewotCQkJCXJldCA9IDE7Ci0JCQkJaWYgKCFxZmxhZykKLQkJCQkJd2FybigibWtzdGVt cCBmYWlsZWQgb24gJXMiLCBuYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2xvc2UoZmQpOwotCQkJ CWlmICh1ZmxhZykKLQkJCQkJdW5saW5rKG5hbWUpOwotCQkJCXByaW50ZigiJXNcbiIsIG5hbWUp OwotCQkJfQorCisJCQlmcmVlKG5hbWUpOworCiAJCX0KLQkJaWYgKG5hbWUpCi0JCQlmcmVlKG5h bWUpOworCiAJCW5hbWUgPSBOVUxMOworCiAJfQogCXJldHVybiAocmV0KTsKIH0K --001636e1f73d0f220b048079c89a--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?7d6fde3d1002252100oc64434ci5f6783ff10a9f0ea>