/* See LICENSE file for copyright and license details. */ #include #include #include #include #include #include "util.h" static void usage(void) { eprintf("usage: %s [-dqtu] [-p directory] [template]\n", argv0); } int main(int argc, char *argv[]) { int dflag = 0, pflag = 0, qflag = 0, tflag = 0, uflag = 0, fd; char *template = "tmp.XXXXXXXXXX", *tmpdir = "", *pdir, *p, path[PATH_MAX], tmp[PATH_MAX]; size_t len; ARGBEGIN { case 'd': dflag = 1; break; case 'p': pflag = 1; pdir = EARGF(usage()); break; case 'q': qflag = 1; break; case 't': tflag = 1; break; case 'u': uflag = 1; break; default: usage(); } ARGEND if (argc > 1) usage(); else if (argc == 1) template = argv[0]; if (!argc || pflag || tflag) { if ((p = getenv("TMPDIR"))) tmpdir = p; else if (pflag) tmpdir = pdir; else tmpdir = "/tmp"; } len = estrlcpy(path, tmpdir, sizeof(path)); if (path[0] && path[len - 1] != '/') estrlcat(path, "/", sizeof(path)); estrlcpy(tmp, template, sizeof(tmp)); p = dirname(tmp); if (!(p[0] == '.' && p[1] == '\0')) { if (tflag && !pflag) eprintf("template must not contain directory separators in -t mode\n"); } estrlcat(path, template, sizeof(path)); if (dflag) { if (!mkdtemp(path)) { if (!qflag) eprintf("mkdtemp %s:", path); return 1; } } else { if ((fd = mkstemp(path)) < 0) { if (!qflag) eprintf("mkstemp %s:", path); return 1; } if (close(fd)) eprintf("close %s:", path); } if (uflag) unlink(path); puts(path); efshut(stdout, ""); return 0; }