sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 34f7a688cb9b924aacd422fb4ed13f187ea63487
parent 80c5ab46ba3651b98bbcb4b8bf74bb9500829608
Author: sin <sin@2f30.org>
Date:   Tue, 12 Nov 2013 11:52:28 +0000

Add barebones mktemp(1)

Diffstat:
MMakefile | 1+
Amktemp.1 | 20++++++++++++++++++++
Amktemp.c | 49+++++++++++++++++++++++++++++++++++++++++++++++++
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; +}