mktemp.c (1641B)
1 /* See LICENSE file for copyright and license details. */ 2 #include <libgen.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <string.h> 6 #include <unistd.h> 7 8 #include "util.h" 9 10 static void 11 usage(void) 12 { 13 eprintf("usage: %s [-dqtu] [-p directory] [template]\n", argv0); 14 } 15 16 int 17 main(int argc, char *argv[]) 18 { 19 int dflag = 0, pflag = 0, qflag = 0, tflag = 0, uflag = 0, fd; 20 char *template = "tmp.XXXXXXXXXX", *tmpdir = "", *pdir, 21 *p, path[PATH_MAX], tmp[PATH_MAX]; 22 size_t len; 23 24 ARGBEGIN { 25 case 'd': 26 dflag = 1; 27 break; 28 case 'p': 29 pflag = 1; 30 pdir = EARGF(usage()); 31 break; 32 case 'q': 33 qflag = 1; 34 break; 35 case 't': 36 tflag = 1; 37 break; 38 case 'u': 39 uflag = 1; 40 break; 41 default: 42 usage(); 43 } ARGEND 44 45 if (argc > 1) 46 usage(); 47 else if (argc == 1) 48 template = argv[0]; 49 50 if (!argc || pflag || tflag) { 51 if ((p = getenv("TMPDIR"))) 52 tmpdir = p; 53 else if (pflag) 54 tmpdir = pdir; 55 else 56 tmpdir = "/tmp"; 57 } 58 59 len = estrlcpy(path, tmpdir, sizeof(path)); 60 if (path[0] && path[len - 1] != '/') 61 estrlcat(path, "/", sizeof(path)); 62 63 estrlcpy(tmp, template, sizeof(tmp)); 64 p = dirname(tmp); 65 if (!(p[0] == '.' && p[1] == '\0')) { 66 if (tflag && !pflag) 67 eprintf("template must not contain directory separators in -t mode\n"); 68 } 69 estrlcat(path, template, sizeof(path)); 70 71 if (dflag) { 72 if (!mkdtemp(path)) { 73 if (!qflag) 74 eprintf("mkdtemp %s:", path); 75 return 1; 76 } 77 } else { 78 if ((fd = mkstemp(path)) < 0) { 79 if (!qflag) 80 eprintf("mkstemp %s:", path); 81 return 1; 82 } 83 if (close(fd)) 84 eprintf("close %s:", path); 85 } 86 if (uflag) 87 unlink(path); 88 puts(path); 89 90 efshut(stdout, "<stdout>"); 91 return 0; 92 }