14ca332d5SPeter Wemm /*- 24ca332d5SPeter Wemm * Copyright (c) 1994, 1995, 1996, 1998 Peter Wemm <peter@netplex.com.au> 34ca332d5SPeter Wemm * All rights reserved. 44ca332d5SPeter Wemm * 54ca332d5SPeter Wemm * Redistribution and use in source and binary forms, with or without 64ca332d5SPeter Wemm * modification, are permitted provided that the following conditions 74ca332d5SPeter Wemm * are met: 84ca332d5SPeter Wemm * 1. Redistributions of source code must retain the above copyright 94ca332d5SPeter Wemm * notice, this list of conditions and the following disclaimer. 104ca332d5SPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 114ca332d5SPeter Wemm * notice, this list of conditions and the following disclaimer in the 124ca332d5SPeter Wemm * documentation and/or other materials provided with the distribution. 134ca332d5SPeter Wemm * 144ca332d5SPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 154ca332d5SPeter Wemm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 164ca332d5SPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 174ca332d5SPeter Wemm * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 184ca332d5SPeter Wemm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 194ca332d5SPeter Wemm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 204ca332d5SPeter Wemm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 214ca332d5SPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 224ca332d5SPeter Wemm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 234ca332d5SPeter Wemm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 244ca332d5SPeter Wemm * SUCH DAMAGE. 254ca332d5SPeter Wemm * 264ca332d5SPeter Wemm */ 274ca332d5SPeter Wemm 284ca332d5SPeter Wemm /* 294ca332d5SPeter Wemm * This program was originally written long ago, originally for a non 304ca332d5SPeter Wemm * BSD-like OS without mkstemp(). It's been modified over the years 314ca332d5SPeter Wemm * to use mkstemp() rather than the original O_CREAT|O_EXCL/fstat/lstat 324ca332d5SPeter Wemm * etc style hacks. 334ca332d5SPeter Wemm * A cleanup, misc options and mkdtemp() calls were added to try and work 344ca332d5SPeter Wemm * more like the OpenBSD version - which was first to publish the interface. 354ca332d5SPeter Wemm */ 364ca332d5SPeter Wemm 37d4eaae7aSPhilippe Charnier #include <err.h> 38d4eaae7aSPhilippe Charnier #include <paths.h> 394ca332d5SPeter Wemm #include <stdio.h> 404ca332d5SPeter Wemm #include <stdlib.h> 414ca332d5SPeter Wemm #include <string.h> 42d4eaae7aSPhilippe Charnier #include <unistd.h> 43d4eaae7aSPhilippe Charnier 44d4eaae7aSPhilippe Charnier #ifndef lint 45d4eaae7aSPhilippe Charnier static const char rcsid[] = 46d4eaae7aSPhilippe Charnier "$FreeBSD$"; 47d4eaae7aSPhilippe Charnier #endif /* not lint */ 48d4eaae7aSPhilippe Charnier 49d3cb5dedSWarner Losh static void usage(void); 504ca332d5SPeter Wemm 514ca332d5SPeter Wemm int 524ca332d5SPeter Wemm main(int argc, char **argv) 534ca332d5SPeter Wemm { 544ca332d5SPeter Wemm int c, fd, ret; 559ff5e898SDavid Malone char *tmpdir; 569ff5e898SDavid Malone const char *prefix; 574ca332d5SPeter Wemm char *name; 584ca332d5SPeter Wemm int dflag, qflag, tflag, uflag; 594ca332d5SPeter Wemm 604ca332d5SPeter Wemm ret = dflag = qflag = tflag = uflag = 0; 61d4eaae7aSPhilippe Charnier prefix = "mktemp"; 624ca332d5SPeter Wemm name = NULL; 634ca332d5SPeter Wemm 644ca332d5SPeter Wemm while ((c = getopt(argc, argv, "dqt:u")) != -1) 654ca332d5SPeter Wemm switch (c) { 664ca332d5SPeter Wemm case 'd': 674ca332d5SPeter Wemm dflag++; 684ca332d5SPeter Wemm break; 694ca332d5SPeter Wemm 704ca332d5SPeter Wemm case 'q': 714ca332d5SPeter Wemm qflag++; 724ca332d5SPeter Wemm break; 734ca332d5SPeter Wemm 744ca332d5SPeter Wemm case 't': 754ca332d5SPeter Wemm prefix = optarg; 764ca332d5SPeter Wemm tflag++; 774ca332d5SPeter Wemm break; 784ca332d5SPeter Wemm 794ca332d5SPeter Wemm case 'u': 804ca332d5SPeter Wemm uflag++; 814ca332d5SPeter Wemm break; 824ca332d5SPeter Wemm 834ca332d5SPeter Wemm default: 84d4eaae7aSPhilippe Charnier usage(); 854ca332d5SPeter Wemm } 864ca332d5SPeter Wemm 874ca332d5SPeter Wemm argc -= optind; 884ca332d5SPeter Wemm argv += optind; 894ca332d5SPeter Wemm 904ca332d5SPeter Wemm if (tflag) { 914ca332d5SPeter Wemm tmpdir = getenv("TMPDIR"); 924ca332d5SPeter Wemm if (tmpdir == NULL) 934ca332d5SPeter Wemm asprintf(&name, "%s%s.XXXXXXXX", _PATH_TMP, prefix); 944ca332d5SPeter Wemm else 954ca332d5SPeter Wemm asprintf(&name, "%s/%s.XXXXXXXX", tmpdir, prefix); 964ca332d5SPeter Wemm /* if this fails, the program is in big trouble already */ 974ca332d5SPeter Wemm if (name == NULL) { 984ca332d5SPeter Wemm if (qflag) 994ca332d5SPeter Wemm return (1); 1004ca332d5SPeter Wemm else 101d4eaae7aSPhilippe Charnier errx(1, "cannot generate template"); 1024ca332d5SPeter Wemm } 1034ca332d5SPeter Wemm } else if (argc < 1) { 104d4eaae7aSPhilippe Charnier usage(); 1054ca332d5SPeter Wemm } 1064ca332d5SPeter Wemm 1074ca332d5SPeter Wemm /* generate all requested files */ 1084ca332d5SPeter Wemm while (name != NULL || argc > 0) { 1094ca332d5SPeter Wemm if (name == NULL) { 1104ca332d5SPeter Wemm name = strdup(argv[0]); 1114ca332d5SPeter Wemm argv++; 1124ca332d5SPeter Wemm argc--; 1134ca332d5SPeter Wemm } 1144ca332d5SPeter Wemm 1154ca332d5SPeter Wemm if (dflag) { 1164ca332d5SPeter Wemm if (mkdtemp(name) == NULL) { 1174ca332d5SPeter Wemm ret = 1; 1184ca332d5SPeter Wemm if (!qflag) 1194ca332d5SPeter Wemm warn("mkdtemp failed on %s", name); 1204ca332d5SPeter Wemm } else { 1214ca332d5SPeter Wemm printf("%s\n", name); 1224ca332d5SPeter Wemm if (uflag) 1234ca332d5SPeter Wemm rmdir(name); 1244ca332d5SPeter Wemm } 1254ca332d5SPeter Wemm } else { 1264ca332d5SPeter Wemm fd = mkstemp(name); 1274ca332d5SPeter Wemm if (fd < 0) { 1284ca332d5SPeter Wemm ret = 1; 1294ca332d5SPeter Wemm if (!qflag) 1304ca332d5SPeter Wemm warn("mkstemp failed on %s", name); 1314ca332d5SPeter Wemm } else { 1324ca332d5SPeter Wemm close(fd); 1334ca332d5SPeter Wemm if (uflag) 1344ca332d5SPeter Wemm unlink(name); 1354ca332d5SPeter Wemm printf("%s\n", name); 1364ca332d5SPeter Wemm } 1374ca332d5SPeter Wemm } 1384ca332d5SPeter Wemm if (name) 1394ca332d5SPeter Wemm free(name); 1404ca332d5SPeter Wemm name = NULL; 1414ca332d5SPeter Wemm } 1424ca332d5SPeter Wemm return (ret); 1434ca332d5SPeter Wemm } 144d4eaae7aSPhilippe Charnier 145d4eaae7aSPhilippe Charnier static void 1467d0d4ebcSXin LI usage(void) 147d4eaae7aSPhilippe Charnier { 148d4eaae7aSPhilippe Charnier fprintf(stderr, 149c0206f33SAlexander Langer "usage: mktemp [-d] [-q] [-t prefix] [-u] template ...\n"); 150c0206f33SAlexander Langer fprintf(stderr, 151c0206f33SAlexander Langer " mktemp [-d] [-q] [-u] -t prefix \n"); 152d4eaae7aSPhilippe Charnier exit (1); 153d4eaae7aSPhilippe Charnier } 154