busybox/debianutils/mktemp.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * Mini mktemp implementation for busybox
   4 *
   5 *
   6 * Copyright (C) 2000 by Daniel Jacobowitz
   7 * Written by Daniel Jacobowitz <dan@debian.org>
   8 *
   9 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
  10 */
  11
  12/* Coreutils 6.12 man page says:
  13 *        mktemp [OPTION]... [TEMPLATE]
  14 * Create a temporary file or directory, safely, and print its name. If
  15 * TEMPLATE is not specified, use tmp.XXXXXXXXXX.
  16 * -d, --directory
  17 *        create a directory, not a file
  18 * -q, --quiet
  19 *        suppress diagnostics about file/dir-creation failure
  20 * -u, --dry-run
  21 *        do not create anything; merely print a name (unsafe)
  22 * --tmpdir[=DIR]
  23 *        interpret TEMPLATE relative to DIR. If DIR is not specified,
  24 *        use  $TMPDIR if set, else /tmp.  With this option, TEMPLATE must
  25 *        not be an absolute name. Unlike with -t, TEMPLATE may contain
  26 *        slashes, but even here, mktemp still creates only the final com-
  27 *        ponent.
  28 * -p DIR use DIR as a prefix; implies -t [deprecated]
  29 * -t     interpret TEMPLATE as a single file name component, relative  to
  30 *        a  directory:  $TMPDIR, if set; else the directory specified via
  31 *        -p; else /tmp [deprecated]
  32 */
  33
  34
  35#include "libbb.h"
  36
  37int mktemp_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  38int mktemp_main(int argc UNUSED_PARAM, char **argv)
  39{
  40        const char *path;
  41        char *chp;
  42        unsigned opt;
  43
  44        opt_complementary = "?1"; /* 1 argument max */
  45        opt = getopt32(argv, "dqtp:", &path);
  46        chp = argv[optind] ? argv[optind] : xstrdup("tmp.XXXXXX");
  47
  48        if (opt & (4|8)) { /* -t and/or -p */
  49                const char *dir = getenv("TMPDIR");
  50                if (dir && *dir != '\0')
  51                        path = dir;
  52                else if (!(opt & 8)) /* no -p */
  53                        path = "/tmp/";
  54                /* else path comes from -p DIR */
  55                chp = concat_path_file(path, chp);
  56        }
  57
  58        if (opt & 1) { /* -d */
  59                if (mkdtemp(chp) == NULL)
  60                        return EXIT_FAILURE;
  61        } else {
  62                if (mkstemp(chp) < 0)
  63                        return EXIT_FAILURE;
  64        }
  65
  66        puts(chp);
  67
  68        return EXIT_SUCCESS;
  69}
  70