diff Objects/fileobject.c @ 22471:acf5ecd806af legacy-trunk

Check in (hopefully) corrected version of last change.
author Neil Schemenauer <nascheme@enme.ucalgary.ca>
date Sat, 23 Mar 2002 02:06:50 +0000
parents aaf5ee3b8f93
children fb45791150d1
line wrap: on
line diff
--- a/Objects/fileobject.c	Sat Mar 23 00:28:57 2002 +0000
+++ b/Objects/fileobject.c	Sat Mar 23 02:06:50 2002 +0000
@@ -56,6 +56,32 @@
 		return ((PyFileObject *)f)->f_name;
 }
 
+/* On Unix, fopen will succeed for directories.
+   In Python, there should be no file objects referring to
+   directories, so we need a check.  */
+
+static PyFileObject*
+dircheck(PyFileObject* f)
+{
+#if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
+	struct stat buf;
+	if (f->f_fp == NULL)
+		return f;
+	if (fstat(fileno(f->f_fp), &buf) == 0 &&
+	    S_ISDIR(buf.st_mode)) {
+#ifdef HAVE_STRERROR
+		char *msg = strerror(EISDIR);
+#else
+		char *msg = "Is a directory";
+#endif
+		PyObject *exc = PyObject_CallFunction(PyExc_IOError, "(is)", EISDIR, msg);
+		PyErr_SetObject(PyExc_IOError, exc);
+		return NULL;
+	}
+#endif
+	return f;
+}
+
 
 static PyObject *
 fill_file_fields(PyFileObject *f, FILE *fp, char *name, char *mode,
@@ -77,6 +103,7 @@
 	if (f->f_name == NULL || f->f_mode == NULL)
 		return NULL;
 	f->f_fp = fp;
+        f = dircheck(f);
 	return (PyObject *) f;
 }
 
@@ -130,6 +157,8 @@
 			PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
 		f = NULL;
 	}
+	if (f != NULL) 
+		f = dircheck(f);
 	return (PyObject *)f;
 }