Module Name:    othersrc
Committed By:   lukem
Date:           Sat Nov  7 09:51:50 UTC 2009

Added Files:
        othersrc/libexec/tnftpd/libnetbsd: mkstemp.c strerror.c

Log Message:
Add replacements for mkstemp and strerror


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 othersrc/libexec/tnftpd/libnetbsd/mkstemp.c \
    othersrc/libexec/tnftpd/libnetbsd/strerror.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Added files:

Index: othersrc/libexec/tnftpd/libnetbsd/mkstemp.c
diff -u /dev/null othersrc/libexec/tnftpd/libnetbsd/mkstemp.c:1.1
--- /dev/null	Sat Nov  7 09:51:50 2009
+++ othersrc/libexec/tnftpd/libnetbsd/mkstemp.c	Sat Nov  7 09:51:50 2009
@@ -0,0 +1,123 @@
+/*	$NetBSD: mkstemp.c,v 1.1 2009/11/07 09:51:50 lukem Exp $	*/
+/*	from	NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp	*/
+
+/*
+ * Copyright (c) 1987, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "tnftpd.h"
+
+int
+mkstemp(char *path)
+{
+	char *start, *trv;
+	struct stat sbuf;
+	unsigned 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;	
+
+	/* 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];
+
+	/* Set remaining X's to pid digits with 0's to the left. */
+	while (*--trv == 'X') {
+		*trv = (pid % 10) + '0';
+		pid /= 10;
+	}
+
+	/* 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;
+		}
+	}
+
+	for (;;) {
+		if ((fd = open(path, O_CREAT | O_EXCL | O_RDWR, 0600)) >= 0)
+			return (fd);
+		if (errno != EEXIST)
+			return (-1);
+
+		/* 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*/
+}
Index: othersrc/libexec/tnftpd/libnetbsd/strerror.c
diff -u /dev/null othersrc/libexec/tnftpd/libnetbsd/strerror.c:1.1
--- /dev/null	Sat Nov  7 09:51:50 2009
+++ othersrc/libexec/tnftpd/libnetbsd/strerror.c	Sat Nov  7 09:51:50 2009
@@ -0,0 +1,19 @@
+/*	$NetBSD: strerror.c,v 1.1 2009/11/07 09:51:50 lukem Exp $	*/
+
+#include "tnftpd.h"
+
+char *
+strerror(int n)
+{
+	static char msg[] = "Unknown error (1234567890)";
+
+	extern int sys_nerr;
+	extern char *sys_errlist[];
+
+	if (n >= sys_nerr) {
+		snprintf(msg, sizeof(msg), "Unknown error (%d)", n);
+		return(msg);
+	} else {
+		return(sys_errlist[n]);
+	}
+}

Reply via email to