--- a/FileStream.st Wed Sep 30 07:05:15 2015 +0200
+++ b/FileStream.st Thu Oct 01 06:52:24 2015 +0200
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
"
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
@@ -828,7 +826,7 @@
to other systems."
removeOnClose := aBoolean.
- Lobby registerChange:self.
+ self reRegisterForFinalization.
"Modified: / 13.8.1998 / 12:10:07 / cg"
!
@@ -1362,369 +1360,369 @@
int pass = 0;
if (!__isNonNilObject(encodedPathName)
- || !(__isStringLike(openmode) || __isArrayLike(openmode)))
- goto badArgument;
+ || !(__isStringLike(openmode) || __isArrayLike(openmode)))
+ goto badArgument;
retry:
#ifdef __VMS__
if (__isStringLike(encodedPathName)) {
- do {
- /*
- * allow passing additional RMS arguments.
- * stupid: DEC does not seem to offer an interface for passing a char **.
- */
- __threadErrno = 0;
+ 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])) {
- __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:
- __threadErrno = E2BIG; /* too many args */
- goto getOutOfHere;
- }
- } else if (attributeSpec != nil) {
- __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])) {
+ __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:
+ __threadErrno = E2BIG; /* too many args */
+ goto getOutOfHere;
+ }
+ } else if (attributeSpec != nil) {
+ __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;
- char * __openmode;
- HANDLE handle;
- SECURITY_ATTRIBUTES sa;
+ DWORD share = 0, access = 0, create = 0, attr = 0;
+ 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_EXISTING;
- } 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)) {
- OBJ *ap = __arrayVal(openmode);
- int numAttrib = __arraySize(openmode);
- int i;
+ 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_EXISTING;
+ } 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)) {
+ OBJ *ap = __arrayVal(openmode);
+ int numAttrib = __arraySize(openmode);
+ int i;
- __openmode = "rb+";
+ __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_WRITE)) {
- access |= GENERIC_READ|GENERIC_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_WRITE)) {
+ access |= GENERIC_READ|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 if (!__isSymbol(attrSym) && __isStringLike(attrSym)) {
- __openmode = __stringVal(attrSym);
- } else {
- console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
- }
- }
- }
- if (create == 0) {
+ } 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 if (!__isSymbol(attrSym) && __isStringLike(attrSym)) {
+ __openmode = __stringVal(attrSym);
+ } else {
+ console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
+ }
+ }
+ }
+ if (create == 0) {
// 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;
- sa.bInheritHandle = FALSE;
+ /*
+ * create security attributes - make handle inheritable by subprocesses
+ */
+ memset(&sa, 0, sizeof (sa));
+ sa.nLength = sizeof( sa );
+ // sa.bInheritHandle = TRUE;
+ sa.bInheritHandle = FALSE;
- 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);
- } else {
- f = fdopen(fd, __openmode);
- }
- __stxWrapApiLeaveCritical();
- } else {
- __threadErrno = __WIN32_ERR(GetLastError());
- }
+ __stxWrapApiEnterCritical();
+ fd = _open_osfhandle((long)handle, O_BINARY);
+ if (fd < 0) {
+ if (__threadErrno == 0) {
+ // no more file descriptors
+ __threadErrno = EMFILE;
+ }
+ CloseHandle(handle);
+ } else {
+ f = fdopen(fd, __openmode);
+ }
+ __stxWrapApiLeaveCritical();
+ } else {
+ __threadErrno = __WIN32_ERR(GetLastError());
+ }
}
# else /* not WIN32 */
if (__isStringLike(encodedPathName)) {
- int accessMode = 0666; // default access mode of fopen(), relies on umask()
- int flags = 0;
- int fd;
- char * __openmode;
+ int accessMode = 0666; // default access mode of fopen(), relies on umask()
+ int flags = 0;
+ int fd;
+ char * __openmode;
- if (__isStringLike(openmode)) {
- __openmode = __stringVal(openmode);
- if (strcmp(__openmode, "r") == 0) {
- flags = O_RDONLY;
- } else if (strcmp(__openmode, "r+") == 0) {
- flags = O_RDWR;
- } else if (strcmp(__openmode, "w") == 0) {
- flags = O_WRONLY | O_CREAT | O_TRUNC;
- } else if (strcmp(__openmode, "w+") == 0) {
- flags = O_RDWR | O_CREAT | O_TRUNC;
- } else if (strcmp(__openmode, "a") == 0) {
- flags = O_WRONLY | O_CREAT | O_APPEND;
- } else if (strcmp(__openmode, "a+") == 0) {
- flags = O_RDWR | O_CREAT| O_APPEND;
- } else {
- console_fprintf(stderr, "UNIXOS [warning]: unsupported open mode\n");
- }
- } else if (__isArrayLike(openmode)) {
- OBJ *ap = __arrayVal(openmode);
- int numAttrib = __arraySize(openmode);
- int i;
+ if (__isStringLike(openmode)) {
+ __openmode = __stringVal(openmode);
+ if (strcmp(__openmode, "r") == 0) {
+ flags = O_RDONLY;
+ } else if (strcmp(__openmode, "r+") == 0) {
+ flags = O_RDWR;
+ } else if (strcmp(__openmode, "w") == 0) {
+ flags = O_WRONLY | O_CREAT | O_TRUNC;
+ } else if (strcmp(__openmode, "w+") == 0) {
+ flags = O_RDWR | O_CREAT | O_TRUNC;
+ } else if (strcmp(__openmode, "a") == 0) {
+ flags = O_WRONLY | O_CREAT | O_APPEND;
+ } else if (strcmp(__openmode, "a+") == 0) {
+ flags = O_RDWR | O_CREAT| O_APPEND;
+ } else {
+ console_fprintf(stderr, "UNIXOS [warning]: unsupported open mode\n");
+ }
+ } else if (__isArrayLike(openmode)) {
+ OBJ *ap = __arrayVal(openmode);
+ int numAttrib = __arraySize(openmode);
+ int i;
- __openmode = "r+";
+ __openmode = "r+";
- 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)) {
- // ignore
- } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
- // ignore
- } else if (attrSym == @symbol(GENERIC_READ)) {
- flags |= O_RDONLY;
- } else if (attrSym == @symbol(GENERIC_WRITE)) {
- flags |= O_WRONLY;
- } else if (attrSym == @symbol(GENERIC_READ_WRITE)) {
- flags |= O_RDWR;
+ if (attrSym == @symbol(FILE_SHARE_READ)) {
+ // ignore
+ } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
+ // ignore
+ } else if (attrSym == @symbol(GENERIC_READ)) {
+ flags |= O_RDONLY;
+ } else if (attrSym == @symbol(GENERIC_WRITE)) {
+ flags |= O_WRONLY;
+ } else if (attrSym == @symbol(GENERIC_READ_WRITE)) {
+ flags |= O_RDWR;
- } else if (attrSym == @symbol(CREATE_NEW)) {
- flags |= O_CREAT|O_EXCL;
- accessMode = 0600; // simulate mkstemp()
- } else if (attrSym == @symbol(CREATE_ALWAYS)) {
- flags |= O_CREAT|O_TRUNC;
- } else if (attrSym == @symbol(OPEN_EXISTING)) {
- // nothing to be set
- } else if (attrSym == @symbol(OPEN_ALWAYS)) {
- flags |= O_CREAT;
- } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
- flags |= O_TRUNC;
+ } else if (attrSym == @symbol(CREATE_NEW)) {
+ flags |= O_CREAT|O_EXCL;
+ accessMode = 0600; // simulate mkstemp()
+ } else if (attrSym == @symbol(CREATE_ALWAYS)) {
+ flags |= O_CREAT|O_TRUNC;
+ } else if (attrSym == @symbol(OPEN_EXISTING)) {
+ // nothing to be set
+ } else if (attrSym == @symbol(OPEN_ALWAYS)) {
+ flags |= O_CREAT;
+ } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
+ flags |= O_TRUNC;
- } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
- // ignore
- } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
- accessMode &= 0444;
- } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
+ } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
+ // ignore
+ } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
+ accessMode &= 0444;
+ } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
#ifdef O_DIRECT
- flags |= O_DIRECT;
+ flags |= O_DIRECT;
#endif
- } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
- // ignore
- } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
- // ignore;
- } else if (!__isSymbol(attrSym) && __isStringLike(attrSym)) {
- __openmode = __stringVal(attrSym);
- } else {
- console_fprintf(stderr, "UNIXOS [warning]: unsupported open mode\n");
- }
- }
- }
- do {
- __BEGIN_INTERRUPTABLE__
- fd = open((char *) __stringVal(encodedPathName), flags, accessMode);
- __END_INTERRUPTABLE__
- } while ((fd < 0) && (__threadErrno == EINTR));
+ } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
+ // ignore
+ } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
+ // ignore;
+ } else if (!__isSymbol(attrSym) && __isStringLike(attrSym)) {
+ __openmode = __stringVal(attrSym);
+ } else {
+ console_fprintf(stderr, "UNIXOS [warning]: unsupported open mode\n");
+ }
+ }
+ }
+ do {
+ __BEGIN_INTERRUPTABLE__
+ fd = open((char *) __stringVal(encodedPathName), flags, accessMode);
+ __END_INTERRUPTABLE__
+ } while ((fd < 0) && (__threadErrno == EINTR));
- if (fd >= 0) {
- __threadErrno = 0;
- f = fdopen(fd, __openmode);
- if (f == NULL) {
- close(fd); // fdopen failed, close before retry.
- }
- }
+ if (fd >= 0) {
+ __threadErrno = 0;
+ f = fdopen(fd, __openmode);
+ if (f == NULL) {
+ close(fd); // fdopen failed, close before retry.
+ }
+ }
}
# endif /* not WIN32 */
@@ -1732,86 +1730,86 @@
if (f == NULL) {
- /*
- * If no filedescriptors available, try to finalize
- * possibly collected fd's and try again.
- */
- if ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass == 0) {
- 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 ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass == 0) {
+ pass = 1;
+ __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
+ __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
+ goto retry;
+ }
badArgument:
getOutOfHere:
- error = __mkSmallInteger(__threadErrno);
- __INST(position) = nil;
+ error = __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] -> %"_lx_"\n", __stringVal(pathName), (INT)f);
- }
- if (f != NULL) {
- OBJ fp;
+ if (@global(FileOpenTrace) == true) {
+ console_fprintf(stderr, "fopen %s [FileStream] -> %"_lx_"\n", __stringVal(pathName), (INT)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
- }
+ }
}
%}.
error notNil ifTrue:[
- lastErrorNumber := error.
- ^ self openError:error.
+ lastErrorNumber := error.
+ ^ self openError:error.
].
handle isNil ifTrue:[
- ^ self openError:0.
+ ^ self openError:0.
].
position := 0.
handleType := #filePointer.
- Lobby register:self.
+ self registerForFinalization.
wasBlocked == false ifTrue:[OperatingSystem unblockInterrupts].
^ handle
!
@@ -1916,37 +1914,37 @@
sent after snapin to reopen streams."
handle notNil ifTrue:[
- "it was open, when snapped-out"
- handle := nil.
- Lobby unregister:self.
- pathName isNil ifTrue:[
- ^ self.
- ].
- [
- |oldPos|
+ "it was open, when snapped-out"
+ handle := nil.
+ self unregisterForFinalization.
+ pathName isNil ifTrue:[
+ ^ self.
+ ].
+ [
+ |oldPos|
- "should take care of appending files and open them for
- append / position them to the end"
+ "should take care of appending files and open them for
+ append / position them to the end"
- oldPos := position.
+ oldPos := position.
- mode == #readonly ifTrue: [
- self openForReading
- ] ifFalse:[mode == #writeonly ifTrue: [
- self openForWriting.
- ] ifFalse:[
- self openForReadWrite.
- ]].
+ mode == #readonly ifTrue: [
+ self openForReading
+ ] ifFalse:[mode == #writeonly ifTrue: [
+ self openForWriting.
+ ] ifFalse:[
+ self openForReadWrite.
+ ]].
- oldPos notNil ifTrue:[
- self position:oldPos.
- ]
- ] on:OpenError do:[:ex|
- "this happens, if after a restart,
- the file is no longer present or accessable ..."
+ oldPos notNil ifTrue:[
+ self position:oldPos.
+ ]
+ ] on:OpenError do:[:ex|
+ "this happens, if after a restart,
+ the file is no longer present or accessable ..."
- (self class name , ' [warning]: could not reopen file: ', pathName) errorPrintCR.
- ].
+ (self class name , ' [warning]: could not reopen file: ', pathName) errorPrintCR.
+ ].
]
"Modified: 10.1.1997 / 17:50:51 / cg"