xref: /openbsd-src/lib/libc/stdlib/mktemp.c (revision 2ce65aae1433afb7f4c414d38275987387d74c67)
1*2ce65aaeSmillert /*	$OpenBSD: mktemp.c,v 1.2 2024/01/19 19:45:02 millert Exp $ */
23cb1b7a6Smillert /*
3*2ce65aaeSmillert  * Copyright (c) 2024 Todd C. Miller
43cb1b7a6Smillert  *
53cb1b7a6Smillert  * Permission to use, copy, modify, and distribute this software for any
63cb1b7a6Smillert  * purpose with or without fee is hereby granted, provided that the above
73cb1b7a6Smillert  * copyright notice and this permission notice appear in all copies.
83cb1b7a6Smillert  *
93cb1b7a6Smillert  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
103cb1b7a6Smillert  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
113cb1b7a6Smillert  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
123cb1b7a6Smillert  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
133cb1b7a6Smillert  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
143cb1b7a6Smillert  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
153cb1b7a6Smillert  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
163cb1b7a6Smillert  */
173cb1b7a6Smillert 
183cb1b7a6Smillert #include <sys/stat.h>
193cb1b7a6Smillert #include <errno.h>
203cb1b7a6Smillert #include <stdlib.h>
213cb1b7a6Smillert 
223cb1b7a6Smillert static int
mktemp_cb(const char * path,int flags)23*2ce65aaeSmillert mktemp_cb(const char *path, int flags)
243cb1b7a6Smillert {
253cb1b7a6Smillert 	struct stat sb;
263cb1b7a6Smillert 
27*2ce65aaeSmillert 	if (lstat(path, &sb) == 0)
283cb1b7a6Smillert 		errno = EEXIST;
29*2ce65aaeSmillert 	return (errno == ENOENT ? 0 : -1);
303cb1b7a6Smillert }
313cb1b7a6Smillert 
32*2ce65aaeSmillert /* Also called via tmpnam(3) and tempnam(3). */
333cb1b7a6Smillert char *
_mktemp(char * path)343cb1b7a6Smillert _mktemp(char *path)
353cb1b7a6Smillert {
36*2ce65aaeSmillert 	if (__mktemp4(path, 0, 0, mktemp_cb) == 0)
37*2ce65aaeSmillert 		return path;
38*2ce65aaeSmillert 	return NULL;
393cb1b7a6Smillert }
403cb1b7a6Smillert 
413cb1b7a6Smillert __warn_references(mktemp,
423cb1b7a6Smillert     "mktemp() possibly used unsafely; consider using mkstemp()");
433cb1b7a6Smillert 
443cb1b7a6Smillert char *
mktemp(char * path)453cb1b7a6Smillert mktemp(char *path)
463cb1b7a6Smillert {
47*2ce65aaeSmillert 	return _mktemp(path);
483cb1b7a6Smillert }
49