Patch #494045: patches errno and stat to cope on plan9.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 41e906a..1561a22 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -536,9 +536,6 @@
 	FILE* fp = NULL;
 	PyCompilerFlags cf;
 	int exists;
-#ifndef RISCOS
-	struct stat s;
-#endif
 
 	if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
 			&filename,
@@ -560,25 +557,40 @@
 
 	exists = 0;
 	/* Test for existence or directory. */
-#ifndef RISCOS
-	if (!stat(filename, &s)) {
-		if (S_ISDIR(s.st_mode))
-#if defined(PYOS_OS2) && defined(PYCC_VACPP)
-			errno = EOS2ERR;
-#else
-			errno = EISDIR;
-#endif
-		else
-			exists = 1;
+#if defined(PLAN9)
+	{
+		Dir *d;
+
+		if ((d = dirstat(filename))!=nil) {
+			if(d->mode & DMDIR)
+				werrstr("is a directory");
+			else
+				exists = 1;
+			free(d);
+		}
 	}
-#else
+#elif defined(RISCOS)
 	if (object_exists(filename)) {
 		if (isdir(filename))
 			errno = EISDIR;
 		else
 			exists = 1;
 	}
-#endif /* RISCOS */
+#else	/* standard Posix */
+	{
+		struct stat s;
+		if (stat(filename, &s) == 0) {
+			if (S_ISDIR(s.st_mode))
+#				if defined(PY_OS2) && defined(PYCC_VACPP)
+					errno = EOS2ERR;
+#				else
+					errno = EISDIR;
+#				endif
+			else
+				exists = 1;
+		}
+	}
+#endif
 
         if (exists) {
 		Py_BEGIN_ALLOW_THREADS
diff --git a/Python/errors.c b/Python/errors.c
index 13b3d11..3869b1c 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -264,6 +264,9 @@
 	PyObject *v;
 	char *s;
 	int i = errno;
+#ifdef PLAN9
+	char errbuf[ERRMAX];
+#endif
 #ifdef MS_WIN32
 	char *s_buf = NULL;
 #endif
@@ -271,6 +274,10 @@
 	if (i == EINTR && PyErr_CheckSignals())
 		return NULL;
 #endif
+#ifdef PLAN9
+	rerrstr(errbuf, sizeof errbuf);
+	s = errbuf;
+#else
 	if (i == 0)
 		s = "Error"; /* Sometimes errno didn't get set */
 	else
@@ -305,7 +312,8 @@
 				s[--len] = '\0';
 		}
 	}
-#endif
+#endif /* Unix/Windows */
+#endif /* PLAN 9*/
 	if (filename != NULL)
 		v = Py_BuildValue("(iss)", i, s, filename);
 	else