tempnam.c.patch   [plain text]


--- tempnam.c.orig	2006-09-15 00:33:51.000000000 -0700
+++ tempnam.c	2006-09-15 01:19:22.000000000 -0700
@@ -38,6 +38,7 @@
 __FBSDID("$FreeBSD: src/lib/libc/stdio/tempnam.c,v 1.10 2002/03/22 21:53:04 obrien Exp $");
 
 #include <sys/param.h>
+#include <sys/stat.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -57,35 +58,61 @@
 	int sverrno;
 	char *f, *name;
 
-	if (!(name = malloc(MAXPATHLEN)))
+#if __DARWIN_UNIX03
+	struct stat sb;
+#endif /* __DARWIN_UNIX03 */
+	if (!(name = malloc(MAXPATHLEN))) {
 		return(NULL);
+	}
 
 	if (!pfx)
 		pfx = "tmp.";
 
+#if !__DARWIN_UNIX03
 	if (issetugid() == 0 && (f = getenv("TMPDIR"))) {
 		(void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
 		    *(f + strlen(f) - 1) == '/'? "": "/", pfx);
-		if ((f = _mktemp(name)))
+		if ((f = _mktemp(name))) {
 			return(f);
+		}
 	}
-
+#endif /* !__DARWIN_UNIX03 */
 	if ((f = (char *)dir)) {
+#if __DARWIN_UNIX03
+		if (!access(dir, W_OK)) {
+#endif /* __DARWIN_UNIX03 */
 		(void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
 		    *(f + strlen(f) - 1) == '/'? "": "/", pfx);
-		if ((f = _mktemp(name)))
+		if ((f = _mktemp(name))) {
 			return(f);
+		}
+#if __DARWIN_UNIX03
+	}
+#endif /* __DARWIN_UNIX03 */
 	}
 
 	f = P_tmpdir;
+#if __DARWIN_UNIX03
+	if (stat(f, &sb) == 0) {	/* directory accessible? */
+#endif /* __DARWIN_UNIX03 */
 	(void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
-	if ((f = _mktemp(name)))
+	if ((f = _mktemp(name))) {
 		return(f);
+	}
 
+#if __DARWIN_UNIX03
+	}
+#endif /* __DARWIN_UNIX03 */
 	f = _PATH_TMP;
+#if __DARWIN_UNIX03
+	if (stat(f, &sb) < 0) {	
+		f = "./";	/* directory inaccessible */
+	}
+#endif /* __DARWIN_UNIX03 */
 	(void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
-	if ((f = _mktemp(name)))
+	if ((f = _mktemp(name))) {
 		return(f);
+	}
 
 	sverrno = errno;
 	free(name);