xref: /openbsd-src/usr.bin/mktemp/mktemp.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: mktemp.c,v 1.5 1998/06/21 22:14:00 millert Exp $	*/
2 
3 /*
4  * Copyright (c) 1996 Todd C. Miller <Todd.Miller@courtesan.com>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
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.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
19  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
21  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #ifndef lint
31 static char rcsid[] = "$OpenBSD: mktemp.c,v 1.5 1998/06/21 22:14:00 millert Exp $";
32 #endif /* not lint */
33 
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <unistd.h>
38 #include <err.h>
39 
40 extern char *__progname;
41 
42 void
43 usage()
44 {
45 	(void) fprintf(stderr, "Usage: %s [-d] [-q] [-u] template\n",
46 	    __progname);
47 	exit(1);
48 }
49 
50 int
51 main(argc, argv)
52 	int argc;
53 	char **argv;
54 {
55 	char *template;
56 	int c, uflag = 0, qflag = 0, makedir = 0;
57 
58 	while ((c = getopt(argc, argv, "dqu")) != -1)
59 		switch(c) {
60 		case 'd':
61 			makedir = 1;
62 			break;
63 		case 'q':
64 			qflag = 1;
65 			break;
66 		case 'u':
67 			uflag = 1;
68 			break;
69 		case '?':
70 		default:
71 			usage();
72 	}
73 
74 	if (argc - optind != 1)
75 		usage();
76 
77 	if ((template = strdup(argv[optind])) == NULL) {
78 		if (qflag)
79 			exit(1);
80 		else
81 			errx(1, "Cannot allocate memory");
82 	}
83 
84 	if (makedir) {
85 		if (mkdtemp(template) == NULL) {
86 			if (qflag)
87 				exit(1);
88 			else
89 				err(1, "Cannot make temp dir %s", template);
90 		}
91 
92 		if (uflag)
93 			(void) rmdir(template);
94 	} else {
95 		if (mkstemp(template) < 0) {
96 			if (qflag)
97 				exit(1);
98 			else
99 				err(1, "Cannot create temp file %s", template);
100 		}
101 
102 		if (uflag)
103 			(void) unlink(template);
104 	}
105 
106 	(void) puts(template);
107 	free(template);
108 
109 	exit(0);
110 }
111