[Python-checkins] CVS: python/dist/src/Objects fileobject.c,2.141.6.3,2.141.6.4

Tim Peters tim_one@users.sourceforge.net
Sun, 07 Apr 2002 21:19:52 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv15221/221/Objects

Modified Files:
      Tag: release22-maint
	fileobject.c 
Log Message:
SF bug 538827:  Python open w/ MSVC6: bad error msgs.
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.


Index: fileobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.141.6.3
retrieving revision 2.141.6.4
diff -C2 -d -r2.141.6.3 -r2.141.6.4
*** fileobject.c	17 Mar 2002 15:55:50 -0000	2.141.6.3
--- fileobject.c	8 Apr 2002 04:19:50 -0000	2.141.6.4
***************
*** 129,134 ****
  		}
  #endif
  		if (errno == EINVAL)
! 			PyErr_Format(PyExc_IOError, "invalid argument: %s",
  				     mode);
  		else
--- 129,147 ----
  		}
  #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 mode: %s",
  				     mode);
  		else