/*- * Copyright (c) 1994, 1995, 1996, 1998 Peter Wemm * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ /* * This program was originally written long ago, originally for a non * BSD-like OS without mkstemp(). It's been modified over the years * to use mkstemp() rather than the original O_CREAT|O_EXCL/fstat/lstat * etc style hacks. * A cleanup, misc options and mkdtemp() calls were added to try and work * more like the OpenBSD version - which was first to publish the interface. */ #include #ifdef __APPLE__ #include #endif #include #include #include #include #include #ifndef lint static const char rcsid[] = "$FreeBSD$"; #endif /* not lint */ static void usage(void); int main(int argc, char **argv) { int c, fd, ret; char *tmpdir; const char *prefix; char *name; int dflag, qflag, tflag, uflag; #ifdef __APPLE__ char tmpbuf[PATH_MAX]; size_t len; #endif ret = dflag = qflag = tflag = uflag = 0; prefix = "mktemp"; name = NULL; while ((c = getopt(argc, argv, "dqt:u")) != -1) switch (c) { case 'd': dflag++; break; case 'q': qflag++; break; case 't': prefix = optarg; tflag++; break; case 'u': uflag++; break; default: usage(); } argc -= optind; argv += optind; if (!tflag && argc < 1) { tflag = 1; prefix = "tmp"; } if (tflag) { #ifdef __APPLE__ if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmpbuf, sizeof(tmpbuf)) > 0) { tmpdir = tmpbuf; } else { tmpdir = getenv("TMPDIR"); } if (tmpdir == NULL) { tmpdir = _PATH_TMP; } len = strlen(tmpdir); if (len > 0 && tmpdir[len - 1] == '/') { asprintf(&name, "%s%s.XXXXXXXX", tmpdir, prefix); } else { asprintf(&name, "%s/%s.XXXXXXXX", tmpdir, prefix); } #else tmpdir = getenv("TMPDIR"); if (tmpdir == NULL) asprintf(&name, "%s%s.XXXXXXXX", _PATH_TMP, prefix); else asprintf(&name, "%s/%s.XXXXXXXX", tmpdir, prefix); #endif /* if this fails, the program is in big trouble already */ if (name == NULL) { if (qflag) return (1); else errx(1, "cannot generate template"); } } /* generate all requested files */ while (name != NULL || argc > 0) { if (name == NULL) { name = strdup(argv[0]); argv++; argc--; } if (dflag) { if (mkdtemp(name) == NULL) { ret = 1; if (!qflag) warn("mkdtemp failed on %s", name); } else { printf("%s\n", name); if (uflag) rmdir(name); } } else { fd = mkstemp(name); if (fd < 0) { ret = 1; if (!qflag) warn("mkstemp failed on %s", name); } else { close(fd); if (uflag) unlink(name); printf("%s\n", name); } } if (name) free(name); name = NULL; } return (ret); } static void usage(void) { fprintf(stderr, "usage: mktemp [-d] [-q] [-t prefix] [-u] template ...\n"); fprintf(stderr, " mktemp [-d] [-q] [-u] -t prefix \n"); exit (1); }