diff options
Diffstat (limited to 'pkgtools/libnbcompat/files/mkstemp.c')
-rw-r--r-- | pkgtools/libnbcompat/files/mkstemp.c | 127 |
1 files changed, 42 insertions, 85 deletions
diff --git a/pkgtools/libnbcompat/files/mkstemp.c b/pkgtools/libnbcompat/files/mkstemp.c index 9eb57dea122..c558d6e8d13 100644 --- a/pkgtools/libnbcompat/files/mkstemp.c +++ b/pkgtools/libnbcompat/files/mkstemp.c @@ -1,4 +1,4 @@ -/* $NetBSD: mkstemp.c,v 1.3 2003/09/06 23:03:03 grant Exp $ */ +/* $NetBSD: mkstemp.c,v 1.4 2004/08/23 03:32:12 jlam Exp $ */ /* * Copyright (c) 1987, 1993 @@ -29,94 +29,51 @@ * SUCH DAMAGE. */ -#include "nbcompat.h" +#if HAVE_NBTOOL_CONFIG_H +#include "nbtool_config.h" +#endif -int -mkstemp(char *path) -{ - char *start, *trv; - struct stat sbuf; - u_int pid; - int fd; - - /* To guarantee multiple calls generate unique names even if - the file is not created. 676 different possibilities with 7 - or more X's, 26 with 6 or less. */ - static char xtra[2] = "aa"; - int xcnt = 0; - - pid = getpid(); - - /* Move to end of path and count trailing X's. */ - for (trv = path; *trv; ++trv) - if (*trv == 'X') - xcnt++; - else - xcnt = 0; +#if !HAVE_NBTOOL_CONFIG_H || !HAVE_MKSTEMP - /* Use at least one from xtra. Use 2 if more than 6 X's. */ - if (*(trv-1) == 'X') - *--trv = xtra[0]; - if (xcnt > 6 && *(trv-1) == 'X') - *--trv = xtra[1]; +#include <nbcompat.h> +#include <nbcompat/cdefs.h> +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: mkstemp.c,v 1.4 2004/08/23 03:32:12 jlam Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ - /* Set remaining X's to pid digits with 0's to the left. */ - while (*--trv == 'X') { - *trv = (pid % 10) + '0'; - pid /= 10; - } +#if HAVE_NBTOOL_CONFIG_H +#define GETTEMP gettemp +#else +#include <nbcompat/assert.h> +#if HAVE_ERRNO_H +#include <errno.h> +#endif +#include <nbcompat/stdio.h> +#include <nbcompat/stdlib.h> +#include <nbcompat/unistd.h> +#if 0 +#include "reentrant.h" +#include "local.h" +#define GETTEMP __gettemp +#else +#define GETTEMP gettemp +extern int gettemp __P((char *, int *, int)); +#endif +#endif - /* update xtra for next call. */ - if (xtra[0] != 'z') - xtra[0]++; - else { - xtra[0] = 'a'; - if (xtra[1] != 'z') - xtra[1]++; - else - xtra[1] = 'a'; - } - - /* - * check the target directory; if you have six X's and it - * doesn't exist this runs for a *very* long time. - */ - for (start = trv + 1;; --trv) { - if (trv <= path) - break; - if (*trv == '/') { - *trv = '\0'; - if (stat(path, &sbuf)) - return (-1); - if (!S_ISDIR(sbuf.st_mode)) { - errno = ENOTDIR; - return (-1); - } - *trv = '/'; - break; - } - } +int +mkstemp(path) + char *path; +{ + int fd; - for (;;) { - if ((fd = open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) - return (fd); - if (errno != EEXIST) - return (-1); + _DIAGASSERT(path != NULL); - /* tricky little algorithm for backward compatibility */ - for (trv = start;;) { - if (!*trv) - return (-1); - if (*trv == 'z') - *trv++ = 'a'; - else { - if (isdigit((unsigned char)*trv)) - *trv = 'a'; - else - ++*trv; - break; - } - } - } - /*NOTREACHED*/ + return (GETTEMP(path, &fd, 0) ? fd : -1); } + +#endif /* !HAVE_NBTOOL_CONFIG_H || !HAVE_MKSTEMP */ |