575
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
1 /* vi: set sw=4 ts=4:
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
2 *
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
3 * mktemp.c - Create a temporary file or directory.
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
4 *
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
5 * Copyright 2012 Elie De Brauwer <eliedebrauwer@gmail.com>
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
6 *
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
7 * Not in SUSv4.
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
8
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
9 USE_MKTEMP(NEWTOY(mktemp, ">1(directory)d(tmpdir)p:", TOYFLAG_BIN))
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
10
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
11 config MKTEMP
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
12 bool "mktemp"
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
13 default y
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
14 help
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
15 usage: mktemp [OPTION] [TEMPLATE]
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
16
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
17 Safely create a temporary file or directory and print its name.
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
18 TEMPLATE should end in 6 consecutive X's, the default
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
19 template is tmp.XXXXXX and the default directory is /tmp/.
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
20 -d, --directory Create a directory, instead of a file
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
21 -p DIR, --tmpdir=DIR Use DIR as a base path
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
22
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
23 */
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
24
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
25 #include "toys.h"
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
26
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
27 DEFINE_GLOBALS(
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
28 char * tmpdir;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
29 )
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
30 #define TT this.mktemp
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
31
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
32 void mktemp_main(void)
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
33 {
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
34 int p_flag = (toys.optflags & 1);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
35 int d_flag = (toys.optflags & 2) >> 1;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
36 char * result;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
37
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
38 int size = snprintf(toybuf, sizeof(toybuf)-1, "%s/%s",
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
39 (p_flag && TT.tmpdir)?TT.tmpdir:"/tmp/",
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
40 (toys.optargs[0])?toys.optargs[0]:"tmp.XXXXXX");
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
41 toybuf[size] = 0;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
42
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
43 if (d_flag) {
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
44 if (mkdtemp(toybuf) == NULL)
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
45 perror_exit("Failed to create temporary directory");
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
46 } else {
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
47 if (mkstemp(toybuf) == -1)
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
48 perror_exit("Failed to create temporary file");
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
49 }
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
50
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
51 result = realpath(toybuf, NULL);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
52 xputs(result);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
53
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
54 if (CFG_TOYBOX_FREE)
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
55 free(result);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
56 }
|