Skip site navigation (1)Skip section navigation (2)
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>