usr/src/cmd/mktemp/mktemp.c
author casper
Thu, 23 Feb 2006 04:39:12 -0800
changeset 1475 0c7070c5774f
parent 0 68f95e015346
permissions -rw-r--r--
PSARC/2006/107 mkstemps(3C)/mkdtemp(3C) 6386057 Add mkdtemp(3C)/mkstemps(3C)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1475
0c7070c5774f PSARC/2006/107 mkstemps(3C)/mkdtemp(3C)
casper
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
0c7070c5774f PSARC/2006/107 mkstemps(3C)/mkdtemp(3C)
casper
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
1475
0c7070c5774f PSARC/2006/107 mkstemps(3C)/mkdtemp(3C)
casper
parents: 0
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 * Create unique plain files or directories.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
usage(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
	(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
	    gettext("Usage: mktemp [-dqtu] [-p prefix_dir] [template]\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
	exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
main(int argc, char **argv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	int opt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
	char *prefix = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
	boolean_t dounlink = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
	boolean_t domkdir = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
	boolean_t quiet = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	boolean_t usetmpdir = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
	char template[] = "tmp.XXXXXX";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	char *tmpl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	(void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#ifndef TEXT_DOMAIN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#define	TEXT_DOMAIN "SYS_TEST"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	(void) textdomain(TEXT_DOMAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	opterr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	while ((opt = getopt(argc, argv, "dqtup:")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
		switch (opt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
		case 'd':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
			domkdir = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
		case 'q':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
			quiet = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
		case 'p':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
			prefix = optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
			/* FALLTHROUGH - -p implies -t */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		case 't':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
			usetmpdir = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
		case 'u':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
			dounlink = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
			usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	argc -= optind;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	argv += optind;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	switch (argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		tmpl = template;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		usetmpdir = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		tmpl = argv[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	if (usetmpdir) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		char *tmp = getenv("TMPDIR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		size_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		if (strchr(tmpl, '/') != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
			(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
			    gettext("mktemp: template argument specified "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
			    "with -t/-p option must not contain '/'"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
			    "\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
		/* TMPDIR overrides -p so that scripts will honor $TMPDIR */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		if (tmp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
			prefix = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		else if (prefix == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
			prefix = "/tmp";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		len = snprintf(NULL, 0, "%s/%s", prefix, tmpl) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		tmp = malloc(len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
		if (tmp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
			perror("malloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		(void) snprintf(tmp, len, "%s/%s", prefix, tmpl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
		tmpl = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	if (domkdir) {
1475
0c7070c5774f PSARC/2006/107 mkstemps(3C)/mkdtemp(3C)
casper
parents: 0
diff changeset
   129
		if (mkdtemp(tmpl) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
			if (!quiet) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
				(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
				    gettext("mktemp: failed to create "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
				    "directory: %s\n"), tmpl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		if (dounlink)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
			(void) rmdir(tmpl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		if (mkstemp(tmpl) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
			if (!quiet) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
				(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
				    gettext("mktemp: failed to create file: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
				    "%s\n"), tmpl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		if (dounlink)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
			(void) unlink(tmpl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	(void) puts(tmpl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
}