aboutsummaryrefslogtreecommitdiff
path: root/debianutils
diff options
context:
space:
mode:
authorRon Yorston <rmy@tigress.co.uk>2012-10-08 11:47:22 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2012-10-08 11:47:22 +0200
commiteab343e7e1e5331df833aa69f14584e4a6c738f1 (patch)
treeca06fdb10773a4ff8481cb72468849c7b55cf150 /debianutils
parent8dc6d1a813e2be33ecfcf3fa97a1b5aae05a8631 (diff)
downloadbusybox-w32-eab343e7e1e5331df833aa69f14584e4a6c738f1.tar.gz
busybox-w32-eab343e7e1e5331df833aa69f14584e4a6c738f1.tar.bz2
busybox-w32-eab343e7e1e5331df833aa69f14584e4a6c738f1.zip
mktemp: fix mktemp -u temp.XXXXXX returning garbage when TMPDIR is set
Use mktemp instead of tempnam for compatibility with real mktemp. Don't let mktemp fail silently, print some simple error messages. Don't ignore -q. Signed-off-by: Tito Ragusa <farmatito@tiscali.it> Signed-off-by: Ron Yorston <rmy@tigress.co.uk> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'debianutils')
-rw-r--r--debianutils/mktemp.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/debianutils/mktemp.c b/debianutils/mktemp.c
index dbe430955..983d7a246 100644
--- a/debianutils/mktemp.c
+++ b/debianutils/mktemp.c
@@ -38,7 +38,7 @@
38//usage: "TEMPLATE must end with XXXXXX (e.g. [/dir/]nameXXXXXX).\n" 38//usage: "TEMPLATE must end with XXXXXX (e.g. [/dir/]nameXXXXXX).\n"
39//usage: "Without TEMPLATE, -t tmp.XXXXXX is assumed.\n" 39//usage: "Without TEMPLATE, -t tmp.XXXXXX is assumed.\n"
40//usage: "\n -d Make directory, not file" 40//usage: "\n -d Make directory, not file"
41////usage: "\n -q Fail silently on errors" - we ignore this opt 41//usage: "\n -q Fail silently on errors"
42//usage: "\n -t Prepend base directory name to TEMPLATE" 42//usage: "\n -t Prepend base directory name to TEMPLATE"
43//usage: "\n -p DIR Use DIR as a base directory (implies -t)" 43//usage: "\n -p DIR Use DIR as a base directory (implies -t)"
44//usage: "\n -u Do not create anything; print a name" 44//usage: "\n -u Do not create anything; print a name"
@@ -71,7 +71,6 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv)
71 if (!path || path[0] == '\0') 71 if (!path || path[0] == '\0')
72 path = "/tmp"; 72 path = "/tmp";
73 73
74 /* -q is ignored */
75 opt_complementary = "?1"; /* 1 argument max */ 74 opt_complementary = "?1"; /* 1 argument max */
76 opts = getopt32(argv, "dqtp:u", &path); 75 opts = getopt32(argv, "dqtp:u", &path);
77 76
@@ -83,33 +82,32 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv)
83 chp = xstrdup("tmp.XXXXXX"); 82 chp = xstrdup("tmp.XXXXXX");
84 opts |= OPT_t; 83 opts |= OPT_t;
85 } 84 }
86 85#if 0
87 if (opts & OPT_u) { 86 /* Don't allow directory separator in template */
88 /* Remove (up to) 6 X's */ 87 if ((opts & OPT_t) && bb_basename(chp) != chp) {
89 unsigned len = strlen(chp); 88 errno = EINVAL;
90 int cnt = len > 6 ? 6 : len; 89 goto error;
91 while (--cnt >= 0 && chp[--len] == 'X')
92 chp[len] = '\0';
93
94 chp = tempnam(opts & (OPT_t|OPT_p) ? path : "./", chp);
95 if (!chp)
96 return EXIT_FAILURE;
97 if (!(opts & (OPT_t|OPT_p)))
98 chp += 2;
99 goto ret;
100 } 90 }
101 91#endif
102 if (opts & (OPT_t|OPT_p)) 92 if (opts & (OPT_t|OPT_p))
103 chp = concat_path_file(path, chp); 93 chp = concat_path_file(path, chp);
104 94
105 if (opts & OPT_d) { 95 if (opts & OPT_u) {
96 chp = mktemp(chp);
97 if (chp[0] == '\0')
98 goto error;
99 } else if (opts & OPT_d) {
106 if (mkdtemp(chp) == NULL) 100 if (mkdtemp(chp) == NULL)
107 return EXIT_FAILURE; 101 goto error;
108 } else { 102 } else {
109 if (mkstemp(chp) < 0) 103 if (mkstemp(chp) < 0)
110 return EXIT_FAILURE; 104 goto error;
111 } 105 }
112 ret:
113 puts(chp); 106 puts(chp);
114 return EXIT_SUCCESS; 107 return EXIT_SUCCESS;
108 error:
109 if (opts & OPT_q)
110 return EXIT_FAILURE;
111 /* don't use chp as it gets mangled in case of error */
112 bb_perror_nomsg_and_die();
115} 113}