summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debianutils/mktemp.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/debianutils/mktemp.c b/debianutils/mktemp.c
index 007cb1c..dbe4309 100644
--- a/debianutils/mktemp.c
+++ b/debianutils/mktemp.c
@@ -41,6 +41,7 @@
////usage: "\n -q Fail silently on errors" - we ignore this opt
//usage: "\n -t Prepend base directory name to TEMPLATE"
//usage: "\n -p DIR Use DIR as a base directory (implies -t)"
+//usage: "\n -u Do not create anything; print a name"
//usage: "\n"
//usage: "\nBase directory is: -p DIR, else $TMPDIR, else /tmp"
//usage:
@@ -63,6 +64,7 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv)
OPT_q = 1 << 1,
OPT_t = 1 << 2,
OPT_p = 1 << 3,
+ OPT_u = 1 << 4,
};
path = getenv("TMPDIR");
@@ -71,7 +73,7 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv)
/* -q is ignored */
opt_complementary = "?1"; /* 1 argument max */
- opts = getopt32(argv, "dqtp:", &path);
+ opts = getopt32(argv, "dqtp:u", &path);
chp = argv[optind];
if (!chp) {
@@ -81,6 +83,22 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv)
chp = xstrdup("tmp.XXXXXX");
opts |= OPT_t;
}
+
+ if (opts & OPT_u) {
+ /* Remove (up to) 6 X's */
+ unsigned len = strlen(chp);
+ int cnt = len > 6 ? 6 : len;
+ while (--cnt >= 0 && chp[--len] == 'X')
+ chp[len] = '\0';
+
+ chp = tempnam(opts & (OPT_t|OPT_p) ? path : "./", chp);
+ if (!chp)
+ return EXIT_FAILURE;
+ if (!(opts & (OPT_t|OPT_p)))
+ chp += 2;
+ goto ret;
+ }
+
if (opts & (OPT_t|OPT_p))
chp = concat_path_file(path, chp);
@@ -91,8 +109,7 @@ int mktemp_main(int argc UNUSED_PARAM, char **argv)
if (mkstemp(chp) < 0)
return EXIT_FAILURE;
}
-
+ ret:
puts(chp);
-
return EXIT_SUCCESS;
}