summaryrefslogtreecommitdiff
path: root/pkgtools/libnbcompat/files/mkstemp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/libnbcompat/files/mkstemp.c')
-rw-r--r--pkgtools/libnbcompat/files/mkstemp.c127
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 */