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