FileStream.st
changeset 14578 bc436b9a1ee3
parent 14439 49689a5043dc
child 14632 6fe0dc1d5377
--- a/FileStream.st	Thu Dec 13 15:17:36 2012 +0100
+++ b/FileStream.st	Thu Dec 13 15:23:52 2012 +0100
@@ -1015,7 +1015,9 @@
      This is a private entry, but maybe useful to open/create a file in a special mode,
      which is proprietrary to the operatingSystem."
 
-    |wasBlocked|
+    |wasBlocked encodedPathName|
+
+    encodedPathName := OperatingSystem encodePath:pathName.
 
 %{
     HFILE f;
@@ -1023,379 +1025,379 @@
     int pass = 0;
 
 retry:
-    if (__isNonNilObject(pathName) && (__isStringLike(openmode) || __isArrayLike(openmode)))
+    if (__isNonNilObject(encodedPathName) && (__isStringLike(openmode) || __isArrayLike(openmode)))
 #ifdef __VMS__
-      if (__qClass(pathName)==String) {
-	do {
-	    /*
-	     * allow passing additional RMS arguments.
-	     * stupid: DEC does not seem to offer an interface for passing a char **.
-	     */
-	    __threadErrno = 0;
+      if (__isStringLike(pathName)) {
+        do {
+            /*
+             * allow passing additional RMS arguments.
+             * stupid: DEC does not seem to offer an interface for passing a char **.
+             */
+            __threadErrno = 0;
 
-	    {
-		if (__isArray(attributeSpec)) {
-		    OBJ *ap = __ArrayInstPtr(attributeSpec)->a_element;
-		    int numAttrib = 0;
-		    int i;
+            {
+                if (__isArray(attributeSpec)) {
+                    OBJ *ap = __ArrayInstPtr(attributeSpec)->a_element;
+                    int numAttrib = 0;
+                    int i;
 
-		    numAttrib = __arraySize(attributeSpec);
-		    for (i=0; i<numAttrib;i++) {
-			if (! __isStringLike(ap[i])) {
-			    f = NULL;
-			    __threadErrno = EINVAL; /* invalid argument */
-			    goto getOutOfHere;
-			}
-		    }
-		    switch (numAttrib) {
-			case 0:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 1:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 2:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 3:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 4:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
-				      __stringVal(ap[3]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 5:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
-				      __stringVal(ap[3]), __stringVal(ap[4]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 6:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
-				      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 7:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
-				      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
-				      __stringVal(ap[6]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 8:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
-				      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
-				      __stringVal(ap[6]), __stringVal(ap[7]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 9:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
-				      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
-				      __stringVal(ap[6]), __stringVal(ap[7]), __stringVal(ap[8]));
-			    __END_INTERRUPTABLE__
-			    break;
-			case 10:
-			    __BEGIN_INTERRUPTABLE__
-			    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
-				      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
-				      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
-				      __stringVal(ap[6]), __stringVal(ap[7]), __stringVal(ap[8]),
-				      __stringVal(ap[9]));
-			    __END_INTERRUPTABLE__
-			    break;
-			default:
-			    f = NULL;
-			    __threadErrno = E2BIG; /* too many args */
-			    goto getOutOfHere;
-		    }
-		} else if (attributeSpec != nil) {
-		    f = NULL;
-		    __threadErrno = EINVAL; /* invalid argument */
-		    goto getOutOfHere;
-		} else {
-		    /*
-		     * create file as sequential streamLF by default.
-		     */
-		    __BEGIN_INTERRUPTABLE__
-		    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode), "rfm=stmlf");
-		    __END_INTERRUPTABLE__
-		}
-	    }
-	} while ((f == NULL) && (__threadErrno == EINTR));
+                    numAttrib = __arraySize(attributeSpec);
+                    for (i=0; i<numAttrib;i++) {
+                        if (! __isStringLike(ap[i])) {
+                            f = NULL;
+                            __threadErrno = EINVAL; /* invalid argument */
+                            goto getOutOfHere;
+                        }
+                    }
+                    switch (numAttrib) {
+                        case 0:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 1:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 2:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 3:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 4:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
+                                      __stringVal(ap[3]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 5:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
+                                      __stringVal(ap[3]), __stringVal(ap[4]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 6:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
+                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 7:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
+                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
+                                      __stringVal(ap[6]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 8:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
+                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
+                                      __stringVal(ap[6]), __stringVal(ap[7]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 9:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
+                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
+                                      __stringVal(ap[6]), __stringVal(ap[7]), __stringVal(ap[8]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        case 10:
+                            __BEGIN_INTERRUPTABLE__
+                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
+                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
+                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
+                                      __stringVal(ap[6]), __stringVal(ap[7]), __stringVal(ap[8]),
+                                      __stringVal(ap[9]));
+                            __END_INTERRUPTABLE__
+                            break;
+                        default:
+                            f = NULL;
+                            __threadErrno = E2BIG; /* too many args */
+                            goto getOutOfHere;
+                    }
+                } else if (attributeSpec != nil) {
+                    f = NULL;
+                    __threadErrno = EINVAL; /* invalid argument */
+                    goto getOutOfHere;
+                } else {
+                    /*
+                     * create file as sequential streamLF by default.
+                     */
+                    __BEGIN_INTERRUPTABLE__
+                    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode), "rfm=stmlf");
+                    __END_INTERRUPTABLE__
+                }
+            }
+        } while ((f == NULL) && (__threadErrno == EINTR));
       }
 #else /* not VMS */
 
 # ifdef WIN32
     {
-	  DWORD share = 0, access = 0, create = 0, attr = 0;
-	  int numAttrib, i;
-	  OBJ *ap;
-	  char * __openmode;
-	  HANDLE handle;
-	  SECURITY_ATTRIBUTES sa;
+          DWORD share = 0, access = 0, create = 0, attr = 0;
+          int numAttrib, i;
+          OBJ *ap;
+          char * __openmode;
+          HANDLE handle;
+          SECURITY_ATTRIBUTES sa;
 
-	  if (__isStringLike(openmode)) {
-	      share = FILE_SHARE_READ|FILE_SHARE_WRITE;
-	      __openmode = __stringVal(openmode);
-	      if (strcmp(__openmode, "rb") == 0) {
-		  access = GENERIC_READ;
-		  create = OPEN_EXISTING;
-	      } else if (strcmp(__openmode, "rb+") == 0) {
-		  access = GENERIC_READ | GENERIC_WRITE;
-		  create = OPEN_ALWAYS;
-	      } else if (strcmp(__openmode, "wb") == 0) {
-		  access = GENERIC_WRITE;
-		  create = CREATE_ALWAYS;
-	      } else if (strcmp(__openmode, "wb+") == 0) {
-		  access = GENERIC_READ | GENERIC_WRITE;
-		  create = CREATE_ALWAYS;
-	      } else if (strcmp(__openmode, "ab") == 0) {
-		  access = FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
-				STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
-		  create = OPEN_ALWAYS;
-	      } else if (strcmp(__openmode, "ab+") == 0) {
-		  access = GENERIC_READ |FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
-				STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
-		  create = OPEN_ALWAYS;
-	      } else {
-		  console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
-	      }
-	  } else if (__isArrayLike(openmode)) {
-	      ap = __ArrayInstPtr(attributeSpec)->a_element;
-	      numAttrib = __arraySize(attributeSpec);
-	      __openmode = "rb+";
+          if (__isStringLike(openmode)) {
+              share = FILE_SHARE_READ|FILE_SHARE_WRITE;
+              __openmode = __stringVal(openmode);
+              if (strcmp(__openmode, "rb") == 0) {
+                  access = GENERIC_READ;
+                  create = OPEN_EXISTING;
+              } else if (strcmp(__openmode, "rb+") == 0) {
+                  access = GENERIC_READ | GENERIC_WRITE;
+                  create = OPEN_ALWAYS;
+              } else if (strcmp(__openmode, "wb") == 0) {
+                  access = GENERIC_WRITE;
+                  create = CREATE_ALWAYS;
+              } else if (strcmp(__openmode, "wb+") == 0) {
+                  access = GENERIC_READ | GENERIC_WRITE;
+                  create = CREATE_ALWAYS;
+              } else if (strcmp(__openmode, "ab") == 0) {
+                  access = FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
+                                STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
+                  create = OPEN_ALWAYS;
+              } else if (strcmp(__openmode, "ab+") == 0) {
+                  access = GENERIC_READ |FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
+                                STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
+                  create = OPEN_ALWAYS;
+              } else {
+                  console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
+              }
+          } else if (__isArrayLike(openmode)) {
+              ap = __ArrayInstPtr(attributeSpec)->a_element;
+              numAttrib = __arraySize(attributeSpec);
+              __openmode = "rb+";
 
-	      for (i=0; i<numAttrib; i++) {
-		  OBJ attrSym = ap[i];
+              for (i=0; i<numAttrib; i++) {
+                  OBJ attrSym = ap[i];
 
-		  if (attrSym == @symbol(FILE_SHARE_READ)) {
-		      share |= FILE_SHARE_READ;
-		  } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
-		      share |= FILE_SHARE_WRITE;
+                  if (attrSym == @symbol(FILE_SHARE_READ)) {
+                      share |= FILE_SHARE_READ;
+                  } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
+                      share |= FILE_SHARE_WRITE;
 
-		  } else if (attrSym == @symbol(GENERIC_READ)) {
-		      access |= GENERIC_READ;
-		  } else if (attrSym == @symbol(GENERIC_WRITE)) {
-		      access |= GENERIC_WRITE;
+                  } else if (attrSym == @symbol(GENERIC_READ)) {
+                      access |= GENERIC_READ;
+                  } else if (attrSym == @symbol(GENERIC_WRITE)) {
+                      access |= GENERIC_WRITE;
 
-		  } else if (attrSym == @symbol(CREATE_NEW)) {
-		      create |= CREATE_NEW;
-		  } else if (attrSym == @symbol(CREATE_ALWAYS)) {
-		      create |= CREATE_ALWAYS;
-		  } else if (attrSym == @symbol(OPEN_EXISTING)) {
-		      create |= OPEN_EXISTING;
-		  } else if (attrSym == @symbol(OPEN_ALWAYS)) {
-		      create |= OPEN_ALWAYS;
-		  } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
-		      create |= TRUNCATE_EXISTING;
+                  } else if (attrSym == @symbol(CREATE_NEW)) {
+                      create |= CREATE_NEW;
+                  } else if (attrSym == @symbol(CREATE_ALWAYS)) {
+                      create |= CREATE_ALWAYS;
+                  } else if (attrSym == @symbol(OPEN_EXISTING)) {
+                      create |= OPEN_EXISTING;
+                  } else if (attrSym == @symbol(OPEN_ALWAYS)) {
+                      create |= OPEN_ALWAYS;
+                  } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
+                      create |= TRUNCATE_EXISTING;
 
-		  } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
-		      attr |= FILE_ATTRIBUTE_HIDDEN;
-		  } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
-		      attr |= FILE_ATTRIBUTE_READONLY;
-		  } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
-		      attr |= FILE_FLAG_WRITE_THROUGH;
-		  } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
-		      attr |= FILE_FLAG_SEQUENTIAL_SCAN;
-		  } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
-		      attr |= FILE_FLAG_DELETE_ON_CLOSE;
-		  } else {
-		      console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
-		  }
-	      }
-	  } else {
-	      f = NULL;
+                  } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
+                      attr |= FILE_ATTRIBUTE_HIDDEN;
+                  } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
+                      attr |= FILE_ATTRIBUTE_READONLY;
+                  } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
+                      attr |= FILE_FLAG_WRITE_THROUGH;
+                  } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
+                      attr |= FILE_FLAG_SEQUENTIAL_SCAN;
+                  } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
+                      attr |= FILE_FLAG_DELETE_ON_CLOSE;
+                  } else {
+                      console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
+                  }
+              }
+          } else {
+              f = NULL;
 //              argumentError = @symbol(badAttributeSpec);
-	      goto badArgument;
-	  }
-	  if (create == 0) {
-	      f = NULL;
+              goto badArgument;
+          }
+          if (create == 0) {
+              f = NULL;
 //              argumentError = @symbol(missingCreateMode);
-	      goto badArgument;
-	  }
-	  if (attr == 0) {
-	      attr = FILE_ATTRIBUTE_NORMAL;
-	  }
+              goto badArgument;
+          }
+          if (attr == 0) {
+              attr = FILE_ATTRIBUTE_NORMAL;
+          }
 
-	  /*
-	   * create security attributes - make handle inheritable by subprocesses
-	   */
-	  memset(&sa, 0, sizeof (sa));
-	  sa.nLength = sizeof( sa );
-	  sa.bInheritHandle = TRUE;
+          /*
+           * create security attributes - make handle inheritable by subprocesses
+           */
+          memset(&sa, 0, sizeof (sa));
+          sa.nLength = sizeof( sa );
+          sa.bInheritHandle = TRUE;
 
-	  if (__isStringLike(pathName)) {
-		char _aPathName[MAXPATHLEN];
+          if (__isStringLike(pathName)) {
+                char _aPathName[MAXPATHLEN];
 
-		strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
-		do {
-		    __threadErrno = 0;
-		    handle = STX_API_NOINT_CALL7( "CreateFileA", CreateFileA, _aPathName, access, share, &sa, create, attr, 0 /* hTempl */);
-		    if (__threadErrno == EINTR) {
-			handle = INVALID_HANDLE_VALUE;
-		    }
-		} while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
-	  } else if (__isUnicode16String(pathName)) {
-		wchar_t _aPathName[MAXPATHLEN+1];
-		int i, l;
+                strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
+                do {
+                    __threadErrno = 0;
+                    handle = STX_API_NOINT_CALL7( "CreateFileA", CreateFileA, _aPathName, access, share, &sa, create, attr, 0 /* hTempl */);
+                    if (__threadErrno == EINTR) {
+                        handle = INVALID_HANDLE_VALUE;
+                    }
+                } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
+          } else if (__isUnicode16String(pathName)) {
+                wchar_t _aPathName[MAXPATHLEN+1];
+                int i, l;
 
-		l = __unicode16StringSize(pathName);
-		if (l > MAXPATHLEN) l = MAXPATHLEN;
-		for (i=0; i<l; i++) {
-		    _aPathName[i] = __unicode16StringVal(pathName)[i];
-		}
-		_aPathName[i] = 0;
+                l = __unicode16StringSize(pathName);
+                if (l > MAXPATHLEN) l = MAXPATHLEN;
+                for (i=0; i<l; i++) {
+                    _aPathName[i] = __unicode16StringVal(pathName)[i];
+                }
+                _aPathName[i] = 0;
 
-		do {
-		    __threadErrno = 0;
-		    handle = STX_API_NOINT_CALL7( "CreateFileW", CreateFileW, _aPathName, access, share, &sa, create, attr, 0 /* hTempl */);
-		    if (__threadErrno == EINTR) {
-			handle = INVALID_HANDLE_VALUE;
-		    }
-		} while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
-	  }
-	  if (handle != INVALID_HANDLE_VALUE) {
-	      int fd;
-	      extern void __stxWrapApiEnterCritical(), __stxWrapApiLeaveCritical();
+                do {
+                    __threadErrno = 0;
+                    handle = STX_API_NOINT_CALL7( "CreateFileW", CreateFileW, _aPathName, access, share, &sa, create, attr, 0 /* hTempl */);
+                    if (__threadErrno == EINTR) {
+                        handle = INVALID_HANDLE_VALUE;
+                    }
+                } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
+          }
+          if (handle != INVALID_HANDLE_VALUE) {
+              int fd;
+              extern void __stxWrapApiEnterCritical(), __stxWrapApiLeaveCritical();
 
-	      __stxWrapApiEnterCritical();
-	      fd = _open_osfhandle((long)handle, O_BINARY);
-	      if (fd < 0) {
-		  if (__threadErrno == 0) {
-		      // no more file descriptors
-		      __threadErrno = EMFILE;
-		  }
-		  CloseHandle(handle);
-		  f = NULL;
-	      } else {
-		  f = fdopen(fd, __openmode);
-	      }
-	      __stxWrapApiLeaveCritical();
-	  } else {
-	      f = NULL;
-	  }
+              __stxWrapApiEnterCritical();
+              fd = _open_osfhandle((long)handle, O_BINARY);
+              if (fd < 0) {
+                  if (__threadErrno == 0) {
+                      // no more file descriptors
+                      __threadErrno = EMFILE;
+                  }
+                  CloseHandle(handle);
+                  f = NULL;
+              } else {
+                  f = fdopen(fd, __openmode);
+              }
+              __stxWrapApiLeaveCritical();
+          } else {
+              f = NULL;
+          }
       }
 # else /* not WIN32 */
 
-      if (__qClass(pathName)==String) {
-	do {
-	    __BEGIN_INTERRUPTABLE__
+      if (__isStringLike(encodedPathName)) {
+        do {
+            __BEGIN_INTERRUPTABLE__
 #  ifdef LINUX
-	    /*
-	     * LINUX may ret a non-NULL f even when interrupted.
-	     * Therefore, check errno and fake a null-ret.
-	     */
-	    __threadErrno = 0;
-	    f = fopen((char *) __stringVal(pathName), (char *) __stringVal(openmode));
-	    if (__threadErrno == EINTR)
-		f = NULL;
+            /*
+             * LINUX may ret a non-NULL f even when interrupted.
+             * Therefore, check errno and fake a null-ret.
+             */
+            __threadErrno = 0;
+            f = fopen((char *) __stringVal(encodedPathName), (char *) __stringVal(openmode));
+            if (__threadErrno == EINTR)
+                f = NULL;
 #  else /* not LINUX */
-	    f = fopen((char *) __stringVal(pathName), (char *) __stringVal(openmode));
+            f = fopen((char *) __stringVal(encodedPathName), (char *) __stringVal(openmode));
 #  endif /* not LINUX */
-	    __END_INTERRUPTABLE__
-	} while ((f == NULL) && (__threadErrno == EINTR));
+            __END_INTERRUPTABLE__
+        } while ((f == NULL) && (__threadErrno == EINTR));
       }
 # endif /* not WIN32 */
 #endif /* not VMS */
 
     if (f == NULL) {
-	/*
-	 * If no filedescriptors available, try to finalize
-	 * possibly collected fd's and try again.
-	 */
-	if (pass == 0 && (__threadErrno == ENFILE || __threadErrno == EMFILE)) {
-	    pass = 1;
-	    __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
-	    __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
-	    goto retry;
-	}
+        /*
+         * If no filedescriptors available, try to finalize
+         * possibly collected fd's and try again.
+         */
+        if (pass == 0 && (__threadErrno == ENFILE || __threadErrno == EMFILE)) {
+            pass = 1;
+            __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
+            __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
+            goto retry;
+        }
     badArgument:
     getOutOfHere:
-	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
-	__INST(position) = nil;
+        __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
+        __INST(position) = nil;
     } else {
 #ifdef __VMS__
-	/*
-	 * check to see if this is positionable ...
-	 */
-	__INST(canPosition) = false;
+        /*
+         * check to see if this is positionable ...
+         */
+        __INST(canPosition) = false;
 # ifndef _POSIX_C_SOURCE
-	{
-	    struct stat statBuffer;
+        {
+            struct stat statBuffer;
 
-	    if (fstat(fileno(f), &statBuffer) >= 0) {
-		switch (statBuffer.st_fab_rfm) {
-		    case FAB$C_UDF: /* undefined (also stream binary)   */
-		    case FAB$C_VAR: /* variable length records          */
-		    case FAB$C_VFC: /* variable fixed control           */
-		    case FAB$C_STM: /* RMS-11 stream (valid only for sequen) */
-		    default:
-			__INST(canPosition) = false;
-			break;
+            if (fstat(fileno(f), &statBuffer) >= 0) {
+                switch (statBuffer.st_fab_rfm) {
+                    case FAB$C_UDF: /* undefined (also stream binary)   */
+                    case FAB$C_VAR: /* variable length records          */
+                    case FAB$C_VFC: /* variable fixed control           */
+                    case FAB$C_STM: /* RMS-11 stream (valid only for sequen) */
+                    default:
+                        __INST(canPosition) = false;
+                        break;
 
-		    case FAB$C_FIX: /* fixed length records             */
-		    case FAB$C_STMLF: /* LF stream (valid only for sequential) */
-		    case FAB$C_STMCR: /* CR stream (valid only for sequential) */
-			__INST(canPosition) = true;
-			break;
-		}
-	    }
-	}
+                    case FAB$C_FIX: /* fixed length records             */
+                    case FAB$C_STMLF: /* LF stream (valid only for sequential) */
+                    case FAB$C_STMCR: /* CR stream (valid only for sequential) */
+                        __INST(canPosition) = true;
+                        break;
+                }
+            }
+        }
 # endif
 #else /* not VMS */
-	__INST(canPosition) = true;
+        __INST(canPosition) = true;
 #endif /* not VMS */
 
-	if (@global(FileOpenTrace) == true) {
-	    console_fprintf(stderr, "fopen %s [FileStream] -> %x\n", __stringVal(pathName), f);
-	}
-	if (f != NULL) {
-	    OBJ fp;
+        if (@global(FileOpenTrace) == true) {
+            console_fprintf(stderr, "fopen %s [FileStream] -> %x\n", __stringVal(pathName), f);
+        }
+        if (f != NULL) {
+            OBJ fp;
 
-	    wasBlocked = __BLOCKINTERRUPTS();
+            wasBlocked = __BLOCKINTERRUPTS();
 #if 0
-	    // The original code was:
-	    __INST(handle) = fp = __MKEXTERNALADDRESS(f); __STORE(self, fp);
-	    // but for that, gcc generates wrong code, which loads self (volatile) into
-	    // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
-	    // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
-	    // object.
+            // The original code was:
+            __INST(handle) = fp = __MKEXTERNALADDRESS(f); __STORE(self, fp);
+            // but for that, gcc generates wrong code, which loads self (volatile) into
+            // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
+            // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
+            // object.
 #else
-	    fp = __MKEXTERNALADDRESS(f);
-	    __INST(handle) = fp;
-	    __STORE(self, fp);
+            fp = __MKEXTERNALADDRESS(f);
+            __INST(handle) = fp;
+            __STORE(self, fp);
 #endif
-	}
+        }
     }
 
 %}.
     handle notNil ifTrue:[
-	position := ZeroPosition.
-	handleType := #filePointer.
-	Lobby register:self.
-	wasBlocked == false ifTrue:[OperatingSystem unblockInterrupts].
+        position := ZeroPosition.
+        handleType := #filePointer.
+        Lobby register:self.
+        wasBlocked == false ifTrue:[OperatingSystem unblockInterrupts].
     ].
     ^ handle
 !
@@ -1683,11 +1685,11 @@
 !FileStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.147 2012-10-26 09:56:21 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.148 2012-12-13 14:23:52 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.147 2012-10-26 09:56:21 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.148 2012-12-13 14:23:52 stefan Exp $'
 ! !
 
 FileStream initialize!