]> granicus.if.org Git - python/commitdiff
SF bug 538827: Python open w/ MSVC6: bad error msgs.
authorTim Peters <tim.peters@gmail.com>
Mon, 8 Apr 2002 04:13:12 +0000 (04:13 +0000)
committerTim Peters <tim.peters@gmail.com>
Mon, 8 Apr 2002 04:13:12 +0000 (04:13 +0000)
open_the_file:  Some (not all) flavors of Windows set errno to EINVAL
when passed a syntactically invalid filename.  Python turned that into an
incomprehensible complaint about the mode string.  Fixed by special-casing
MSVC.

Objects/fileobject.c

index a752a20ea5f0daeed229f3c6fe29a458deba564b..a03796bf187189c099af13ccaf9d13312af87d3a 100644 (file)
@@ -149,15 +149,28 @@ open_the_file(PyFileObject *f, char *name, char *mode)
                        }
                        return NULL;
                }
+#endif
+#ifdef _MSC_VER
+               /* MSVC 6 (Microsoft) leaves errno at 0 for bad mode strings,
+                * across all Windows flavors.  When it sets EINVAL varies
+                * across Windows flavors, the exact conditions aren't
+                * documented, and the answer lies in the OS's implementation
+                * of Win32's CreateFile function (whose source is secret).
+                * Seems the best we can do is map EINVAL to ENOENT.
+                */
+               if (errno == 0) /* bad mode string */
+                       errno = EINVAL;
+               else if (errno == EINVAL) /* unknown, but not a mode string */
+                       errno = ENOENT;
 #endif
                if (errno == EINVAL)
-                       PyErr_Format(PyExc_IOError, "invalid argument: %s",
+                       PyErr_Format(PyExc_IOError, "invalid mode: %s",
                                     mode);
                else
                        PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
                f = NULL;
        }
-       if (f != NULL) 
+       if (f != NULL)
                f = dircheck(f);
        return (PyObject *)f;
 }