commit 34f7a688cb9b924aacd422fb4ed13f187ea63487
parent 80c5ab46ba3651b98bbcb4b8bf74bb9500829608
Author: sin <sin@2f30.org>
Date: Tue, 12 Nov 2013 11:52:28 +0000
Add barebones mktemp(1)
Diffstat:
3 files changed, 70 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
@@ -57,6 +57,7 @@ SRC = \
mkdir.c \
mkfifo.c \
mknod.c \
+ mktemp.c \
mv.c \
nice.c \
nl.c \
diff --git a/mktemp.1 b/mktemp.1
@@ -0,0 +1,20 @@
+.TH MKTEMP 1 sbase\-VERSION
+.SH NAME
+mktemp \- make temporary filename
+.SH SYNOPSIS
+.B mktemp
+.RB [ \-d ]
+.RB [ template ]
+.SH DESCRIPTION
+.B mktemp
+takes the given filename template and overwrites a portion of it
+to create a unique filename. The template may be any filename with at least
+six `Xs' appended to it. If no template is specified a default of
+`tmp.XXXXXXXXXX' is used and the tmpdir is currently fixed to `/tmp'.
+.SH OPTIONS
+.TP
+.B \-d
+Make a directory instead of a file
+.SH SEE ALSO
+.IR mkdtemp (3),
+.IR mkstemp (3)
diff --git a/mktemp.c b/mktemp.c
@@ -0,0 +1,49 @@
+/* See LICENSE file for copyright and license details. */
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "util.h"
+
+static void
+usage(void)
+{
+ eprintf("usage: %s [-d] [template]\n", argv0);
+}
+
+static int dflag = 0;
+
+int
+main(int argc, char *argv[])
+{
+ char *template = "tmp.XXXXXXXXXX";
+ char *tmpdir = "/tmp";
+ char tmppath[PATH_MAX];
+ int fd;
+
+ ARGBEGIN {
+ case 'd':
+ dflag = 1;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc > 1)
+ usage();
+ else if (argc == 1)
+ template = argv[0];
+
+ snprintf(tmppath, sizeof(tmppath), "%s/%s", tmpdir, template);
+ if (dflag) {
+ if (!mkdtemp(tmppath))
+ eprintf("mkdtemp %s:", tmppath);
+ } else {
+ if ((fd = mkstemp(tmppath)) < 0)
+ eprintf("mkstemp %s:", tmppath);
+ close(fd);
+ }
+ puts(tmppath);
+ return EXIT_SUCCESS;
+}