2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 1994, 1995, 1996, 1998 Peter Wemm <peter@netplex.com.au>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * This program was originally written long ago, originally for a non
32 * BSD-like OS without mkstemp(). It's been modified over the years
33 * to use mkstemp() rather than the original O_CREAT|O_EXCL/fstat/lstat
35 * A cleanup, misc options and mkdtemp() calls were added to try and work
36 * more like the OpenBSD version - which was first to publish the interface.
49 static const char rcsid[] =
53 static void usage(void) __dead2;
55 static const struct option long_opts[] = {
56 {"directory", no_argument, NULL, 'd'},
57 {"tmpdir", optional_argument, NULL, 'p'},
58 {"quiet", no_argument, NULL, 'q'},
59 {"dry-run", no_argument, NULL, 'u'},
60 {NULL, no_argument, NULL, 0},
64 main(int argc, char **argv)
67 const char *prefix, *tmpdir;
69 int dflag, qflag, tflag, uflag;
72 ret = dflag = qflag = tflag = uflag = 0;
78 while ((c = getopt_long(argc, argv, "dp:qt:u", long_opts, NULL)) != -1)
86 if (tmpdir == NULL || *tmpdir == '\0')
87 tmpdir = getenv("TMPDIR");
90 * We've already done the necessary environment
91 * fallback, skip the later one.
93 prefer_tmpdir = false;
116 if (!tflag && argc < 1) {
121 * For this implied -t mode, we actually want to swap the usual
122 * order of precedence: -p, then TMPDIR, then /tmp.
124 prefer_tmpdir = false;
134 * $TMPDIR preferred over `-p` if specified, for compatibility.
136 if (prefer_tmpdir || tmpdir == NULL)
137 envtmp = getenv("TMPDIR");
142 len = strlen(tmpdir);
143 if (len > 0 && tmpdir[len - 1] == '/')
144 asprintf(&name, "%s%s.XXXXXXXXXX", tmpdir, prefix);
146 asprintf(&name, "%s/%s.XXXXXXXXXX", tmpdir, prefix);
147 /* if this fails, the program is in big trouble already */
152 errx(1, "cannot generate template");
156 /* generate all requested files */
157 while (name != NULL || argc > 0) {
159 if (!tflag && tmpdir != NULL)
160 asprintf(&name, "%s/%s", tmpdir, argv[0]);
162 name = strdup(argv[0]);
164 err(1, "%s", argv[0]);
170 if (mkdtemp(name) == NULL) {
173 warn("mkdtemp failed on %s", name);
175 printf("%s\n", name);
184 warn("mkstemp failed on %s", name);
189 printf("%s\n", name);
203 "usage: mktemp [-d] [-p tmpdir] [-q] [-t prefix] [-u] template "
206 " mktemp [-d] [-p tmpdir] [-q] [-u] -t prefix \n");