Home | History | Annotate | Line # | Download | only in mktemp
mktemp.c revision 1.1
      1 /*-
      2  * Copyright (c) 1994, 1995, 1996, 1998 Peter Wemm <peter (at) netplex.com.au>
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     24  * SUCH DAMAGE.
     25  *
     26  */
     27 
     28 /*
     29  * This program was originally written long ago, originally for a non
     30  * BSD-like OS without mkstemp().  It's been modified over the years
     31  * to use mkstemp() rather than the original O_CREAT|O_EXCL/fstat/lstat
     32  * etc style hacks.
     33  * A cleanup, misc options and mkdtemp() calls were added to try and work
     34  * more like the OpenBSD version - which was first to publish the interface.
     35  */
     36 
     37 #include <err.h>
     38 #include <paths.h>
     39 #include <stdio.h>
     40 #include <stdlib.h>
     41 #include <string.h>
     42 #include <unistd.h>
     43 
     44 #ifndef lint
     45 static const char rcsid[] =
     46 	"$FreeBSD: src/usr.bin/mktemp/mktemp.c,v 1.2 1998/05/05 06:13:47 charnier Exp $";
     47 #endif /* not lint */
     48 
     49 static void usage __P((void));
     50 
     51 int
     52 main(int argc, char **argv)
     53 {
     54 	int c, fd, ret;
     55 	char *tmpdir, *prefix;
     56 	char *name;
     57 	int dflag, qflag, tflag, uflag;
     58 
     59 	ret = dflag = qflag = tflag = uflag = 0;
     60 	prefix = "mktemp";
     61 	name = NULL;
     62 
     63 	while ((c = getopt(argc, argv, "dqt:u")) != -1)
     64 		switch (c) {
     65 		case 'd':
     66 			dflag++;
     67 			break;
     68 
     69 		case 'q':
     70 			qflag++;
     71 			break;
     72 
     73 		case 't':
     74 			prefix = optarg;
     75 			tflag++;
     76 			break;
     77 
     78 		case 'u':
     79 			uflag++;
     80 			break;
     81 
     82 		default:
     83 			usage();
     84 		}
     85 
     86 	argc -= optind;
     87 	argv += optind;
     88 
     89 	if (tflag) {
     90 		tmpdir = getenv("TMPDIR");
     91 		if (tmpdir == NULL)
     92 			asprintf(&name, "%s%s.XXXXXXXX", _PATH_TMP, prefix);
     93 		else
     94 			asprintf(&name, "%s/%s.XXXXXXXX", tmpdir, prefix);
     95 		/* if this fails, the program is in big trouble already */
     96 		if (name == NULL) {
     97 			if (qflag)
     98 				return (1);
     99 			else
    100 				errx(1, "cannot generate template");
    101 		}
    102 	} else if (argc < 1) {
    103 		usage();
    104 	}
    105 
    106 	/* generate all requested files */
    107 	while (name != NULL || argc > 0) {
    108 		if (name == NULL) {
    109 			name = strdup(argv[0]);
    110 			argv++;
    111 			argc--;
    112 		}
    113 
    114 		if (dflag) {
    115 			if (mkdtemp(name) == NULL) {
    116 				ret = 1;
    117 				if (!qflag)
    118 					warn("mkdtemp failed on %s", name);
    119 			} else {
    120 				printf("%s\n", name);
    121 				if (uflag)
    122 					rmdir(name);
    123 			}
    124 		} else {
    125 			fd = mkstemp(name);
    126 			if (fd < 0) {
    127 				ret = 1;
    128 				if (!qflag)
    129 					warn("mkstemp failed on %s", name);
    130 			} else {
    131 				close(fd);
    132 				if (uflag)
    133 					unlink(name);
    134 				printf("%s\n", name);
    135 			}
    136 		}
    137 		if (name)
    138 			free(name);
    139 		name = NULL;
    140 	}
    141 	return (ret);
    142 }
    143 
    144 static void
    145 usage()
    146 {
    147 	fprintf(stderr,
    148 		"usage: mktemp [-d] [-q] [-t prefix] [-u] [template ...]\n");
    149 	exit (1);
    150 }
    151