xref: /openbsd/lib/libc/stdlib/mktemp.c (revision 4bdff4be)
1 /*	$OpenBSD: mktemp.c,v 1.2 2024/01/19 19:45:02 millert Exp $ */
2 /*
3  * Copyright (c) 2024 Todd C. Miller
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <sys/stat.h>
19 #include <errno.h>
20 #include <stdlib.h>
21 
22 static int
23 mktemp_cb(const char *path, int flags)
24 {
25 	struct stat sb;
26 
27 	if (lstat(path, &sb) == 0)
28 		errno = EEXIST;
29 	return (errno == ENOENT ? 0 : -1);
30 }
31 
32 /* Also called via tmpnam(3) and tempnam(3). */
33 char *
34 _mktemp(char *path)
35 {
36 	if (__mktemp4(path, 0, 0, mktemp_cb) == 0)
37 		return path;
38 	return NULL;
39 }
40 
41 __warn_references(mktemp,
42     "mktemp() possibly used unsafely; consider using mkstemp()");
43 
44 char *
45 mktemp(char *path)
46 {
47 	return _mktemp(path);
48 }
49