source: MondoRescue/branches/3.3/mindi-busybox/debianutils/mktemp.c@ 3865

Last change on this file since 3865 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 3.6 KB
RevLine 
[821]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 *
[2725]9 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
[821]10 */
11
[2725]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 */
[3621]33//config:config MKTEMP
34//config: bool "mktemp"
35//config: default y
36//config: help
37//config: mktemp is used to create unique temporary files
[2725]38
[3621]39//applet:IF_MKTEMP(APPLET(mktemp, BB_DIR_BIN, BB_SUID_DROP))
40
41//kbuild:lib-$(CONFIG_MKTEMP) += mktemp.o
42
[3232]43//usage:#define mktemp_trivial_usage
44//usage: "[-dt] [-p DIR] [TEMPLATE]"
45//usage:#define mktemp_full_usage "\n\n"
46//usage: "Create a temporary file with name based on TEMPLATE and print its name.\n"
47//usage: "TEMPLATE must end with XXXXXX (e.g. [/dir/]nameXXXXXX).\n"
48//usage: "Without TEMPLATE, -t tmp.XXXXXX is assumed.\n"
49//usage: "\n -d Make directory, not file"
50//usage: "\n -q Fail silently on errors"
51//usage: "\n -t Prepend base directory name to TEMPLATE"
52//usage: "\n -p DIR Use DIR as a base directory (implies -t)"
53//usage: "\n -u Do not create anything; print a name"
54//usage: "\n"
55//usage: "\nBase directory is: -p DIR, else $TMPDIR, else /tmp"
56//usage:
57//usage:#define mktemp_example_usage
58//usage: "$ mktemp /tmp/temp.XXXXXX\n"
59//usage: "/tmp/temp.mWiLjM\n"
60//usage: "$ ls -la /tmp/temp.mWiLjM\n"
61//usage: "-rw------- 1 andersen andersen 0 Apr 25 17:10 /tmp/temp.mWiLjM\n"
[2725]62
[1765]63#include "libbb.h"
[821]64
[2725]65int mktemp_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
66int mktemp_main(int argc UNUSED_PARAM, char **argv)
[821]67{
[2725]68 const char *path;
[1765]69 char *chp;
[2725]70 unsigned opts;
[3232]71 enum {
72 OPT_d = 1 << 0,
73 OPT_q = 1 << 1,
74 OPT_t = 1 << 2,
75 OPT_p = 1 << 3,
76 OPT_u = 1 << 4,
77 };
[821]78
[2725]79 path = getenv("TMPDIR");
80 if (!path || path[0] == '\0')
81 path = "/tmp";
[821]82
[2725]83 opt_complementary = "?1"; /* 1 argument max */
[3232]84 opts = getopt32(argv, "dqtp:u", &path);
[1765]85
[3232]86 chp = argv[optind];
87 if (!chp) {
88 /* GNU coreutils 8.4:
89 * bare "mktemp" -> "mktemp -t tmp.XXXXXX"
90 */
91 chp = xstrdup("tmp.XXXXXX");
92 opts |= OPT_t;
93 }
94#if 0
95 /* Don't allow directory separator in template */
96 if ((opts & OPT_t) && bb_basename(chp) != chp) {
97 errno = EINVAL;
98 goto error;
99 }
100#endif
101 if (opts & (OPT_t|OPT_p))
[2725]102 chp = concat_path_file(path, chp);
[1765]103
[3232]104 if (opts & OPT_u) {
105 chp = mktemp(chp);
106 if (chp[0] == '\0')
107 goto error;
108 } else if (opts & OPT_d) {
[1765]109 if (mkdtemp(chp) == NULL)
[3232]110 goto error;
[1765]111 } else {
112 if (mkstemp(chp) < 0)
[3232]113 goto error;
[821]114 }
[1765]115 puts(chp);
[821]116 return EXIT_SUCCESS;
[3232]117 error:
118 if (opts & OPT_q)
119 return EXIT_FAILURE;
120 /* don't use chp as it gets mangled in case of error */
121 bb_perror_nomsg_and_die();
[821]122}
Note: See TracBrowser for help on using the repository browser.