mktemp.c - sbase - suckless unix tools
 (HTM) git clone git://git.suckless.org/sbase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       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 }