9 |
* Licensed under the GPL v2 or later, see the file LICENSE in this tarball. |
* Licensed under the GPL v2 or later, see the file LICENSE in this tarball. |
10 |
*/ |
*/ |
11 |
|
|
12 |
#include "busybox.h" |
/* Coreutils 6.12 man page says: |
13 |
#include <stdio.h> |
* mktemp [OPTION]... [TEMPLATE] |
14 |
#include <errno.h> |
* Create a temporary file or directory, safely, and print its name. If |
15 |
#include <string.h> |
* TEMPLATE is not specified, use tmp.XXXXXXXXXX. |
16 |
#include <unistd.h> |
* -d, --directory |
17 |
#include <stdlib.h> |
* 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 |
int mktemp_main(int argc, char **argv) |
#include "libbb.h" |
36 |
|
|
37 |
|
int mktemp_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
38 |
|
int mktemp_main(int argc UNUSED_PARAM, char **argv) |
39 |
{ |
{ |
40 |
unsigned long flags = getopt32(argc, argv, "dqt"); |
const char *path; |
41 |
char *chp; |
char *chp; |
42 |
|
unsigned opt; |
43 |
|
|
44 |
if (optind + 1 != argc) |
opt_complementary = "?1"; /* 1 argument max */ |
45 |
bb_show_usage(); |
opt = getopt32(argv, "dqtp:", &path); |
46 |
|
chp = argv[optind] ? argv[optind] : xstrdup("tmp.XXXXXX"); |
|
chp = argv[optind]; |
|
47 |
|
|
48 |
if (flags & 4) { |
if (opt & (4|8)) { /* -t and/or -p */ |
49 |
char *dir = getenv("TMPDIR"); |
const char *dir = getenv("TMPDIR"); |
50 |
if (dir && *dir != '\0') |
if (dir && *dir != '\0') |
51 |
chp = concat_path_file(dir, chp); |
path = dir; |
52 |
else |
else if (!(opt & 8)) /* no -p */ |
53 |
chp = concat_path_file("/tmp/", chp); |
path = "/tmp/"; |
54 |
|
/* else path comes from -p DIR */ |
55 |
|
chp = concat_path_file(path, chp); |
56 |
} |
} |
57 |
|
|
58 |
if (flags & 1) { |
if (opt & 1) { /* -d */ |
59 |
if (mkdtemp(chp) == NULL) |
if (mkdtemp(chp) == NULL) |
60 |
return EXIT_FAILURE; |
return EXIT_FAILURE; |
61 |
} else { |
} else { |