mktemp.c (1913B)
- // utils-std: Collection of commonly available Unix tools
- // SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
- // SPDX-License-Identifier: MPL-2.0
- #define _POSIX_C_SOURCE 200809L
- #include <errno.h>
- #include <limits.h> // PATH_MAX
- #include <stdbool.h>
- #include <stdio.h> // fprintf
- #include <stdlib.h> // getenv
- #include <string.h> // strerror
- #include <unistd.h> // getopt
- int
- main(int argc, char *argv[])
- {
- bool o_create_dir = false, o_quiet = false;
- char template[PATH_MAX] = "tmp.XXXXXXXXXX";
- const char *tmpdir = NULL;
- int c = -1;
- while((c = getopt(argc, argv, ":dqp:t")) != -1)
- {
- switch(c)
- {
- case 'd':
- o_create_dir = true;
- break;
- case 'q':
- o_quiet = true;
- break;
- case 'p':
- tmpdir = optarg;
- break;
- case 't':
- if(tmpdir == NULL) tmpdir = getenv("TMPDIR");
- if(tmpdir == NULL) tmpdir = "/tmp";
- break;
- default:
- abort();
- }
- }
- argc -= optind;
- argv += optind;
- if(argc == 1)
- {
- strncpy(template, *argv, PATH_MAX);
- }
- else if(argc > 1)
- {
- fprintf(stderr, "mktemp: Only one template argument is supported, got %d\n", argc);
- return 1;
- }
- if(tmpdir)
- {
- if(chdir(tmpdir) < 0)
- {
- fprintf(stderr,
- "mktemp: Failed changing directory into tmpdir '%s': %s\n",
- tmpdir,
- strerror(errno));
- return 1;
- }
- printf("%s/", tmpdir);
- }
- if(o_create_dir)
- {
- char *dir = mkdtemp(template);
- if(dir == NULL)
- {
- if(!o_quiet)
- fprintf(stderr, "mktemp: Failed creating random directory: %s\n", strerror(errno));
- return 1;
- }
- puts(dir);
- return 0;
- }
- int fd = mkstemp(template);
- if(fd < 0)
- {
- if(!o_quiet) fprintf(stderr, "mktemp: Failed creating random file: %s\n", strerror(errno));
- return 1;
- }
- puts(template);
- if(close(fd) < 0)
- {
- if(!o_quiet) fprintf(stderr, "mktemp: Failed closing file descriptor: %s\n", strerror(errno));
- return 1;
- }
- return 0;
- }