--- a/FileStream.st Wed Jul 24 08:57:20 2013 +0000
+++ b/FileStream.st Wed Jul 24 21:56:49 2013 +0200
@@ -230,19 +230,19 @@
Therefore, the instance variable canPosition is set according to
this and an error is raised, if a position: is attemted.
I know, this is ugly, but what else could we do ?
- Late note: who cares for VMS these days?
- (and how much useless effort has been put in the past,
- to support lousy operating systems?)
+ Late note: who cares for VMS these days?
+ (and how much useless effort has been put in the past,
+ to support lousy operating systems?)
[instance variables:]
- pathName <String> the files path (if known)
- canPosition <Boolean> positionable - read above comment
+ pathName <String> the files path (if known)
+ canPosition <Boolean> positionable - read above comment
[author:]
- Claus Gittinger
+ Claus Gittinger
[see also:]
- Filename DirectoryStream PipeStream Socket
+ Filename DirectoryStream PipeStream Socket
"
!
@@ -393,45 +393,45 @@
"create atomically a new file and return the file stream - use this for temporary files.
The created file has the name '/tmp/stxtmp_xx_nn' where xx is our
unix process id, and nn is a unique number, incremented with every call to this method.
- If any of the environment variables ST_TMPDIR or TMPDIR is set,
+ If any of the environment variables ST_TMPDIR or TMPDIR is set,
its value defines the temp directory."
^ self newTemporaryIn:Filename tempDirectory
"
- FileStream newTemporary
- FileStream newTemporary
+ FileStream newTemporary
+ FileStream newTemporary
"
!
newTemporaryIn:aDirectoryOrNil
"create atomically a new file and return the file stream - use this for temporary files.
The created file is in aDirectoryPrefix and named 'stxtmp_xx_nn',
- where xx is our unix process id, and nn is a unique number, incremented
+ where xx is our unix process id, and nn is a unique number, incremented
with every call to this method."
^ self newTemporaryIn:aDirectoryOrNil nameTemplate:Filename tempFileNameTemplate
"temp files in '/tmp':
- FileStream newTemporary
+ FileStream newTemporary
"
- "temp files somewhere
+ "temp files somewhere
(not recommended - use above since it can be controlled via shell variables):
- FileStream newTemporaryIn:'/tmp'
- FileStream newTemporaryIn:'/tmp'
- FileStream newTemporaryIn:'/usr/tmp'
- FileStream newTemporaryIn:'/'
+ FileStream newTemporaryIn:'/tmp'
+ FileStream newTemporaryIn:'/tmp'
+ FileStream newTemporaryIn:'/usr/tmp'
+ FileStream newTemporaryIn:'/'
"
"a local temp file:
- FileStream newTemporaryIn:''
- FileStream newTemporaryIn:nil
- FileStream newTemporaryIn:'.'
- FileStream newTemporaryIn:('source' asFilename)
+ FileStream newTemporaryIn:''
+ FileStream newTemporaryIn:nil
+ FileStream newTemporaryIn:'.'
+ FileStream newTemporaryIn:('source' asFilename)
"
!
@@ -445,48 +445,48 @@
|nameString random prevRandom prevNameString newTempFilename stream|
[
- prevRandom := random.
- prevNameString := nameString.
+ prevRandom := random.
+ prevNameString := nameString.
- "Use random numbers in order to improve the security
- by making the generated names less predictable"
- [
- random := RandomGenerator new nextInteger.
- ] doWhile:[random = prevRandom].
+ "Use random numbers in order to improve the security
+ by making the generated names less predictable"
+ [
+ random := RandomGenerator new nextInteger.
+ ] doWhile:[random = prevRandom].
- nameString := template bindWith:(OperatingSystem getProcessId) with:random.
+ nameString := template bindWith:(OperatingSystem getProcessId) with:random.
- aDirectoryOrNil isNil ifTrue:[
- newTempFilename := nameString.
- ] ifFalse:[
- newTempFilename := aDirectoryOrNil asFilename constructString:nameString.
- ].
+ aDirectoryOrNil isNil ifTrue:[
+ newTempFilename := nameString.
+ ] ifFalse:[
+ newTempFilename := aDirectoryOrNil asFilename constructString:nameString.
+ ].
- [
- stream := self open:newTempFilename withMode:#(CREATE_NEW GENERIC_READ_WRITE).
- ] on:OpenError do:[:ex|
- (OperatingSystem errorHolderForNumber:ex errorCode) errorCategory ~~ #existingReferentSignal ifFalse:[
- "some fundamental error, raise exception"
- ex reject.
- ].
- prevNameString = nameString ifTrue:[
- "no more names - probably a bad template"
- ex reject.
- ].
- "file exists, retry another one"
- ].
+ [
+ stream := self open:newTempFilename withMode:#(CREATE_NEW GENERIC_READ_WRITE).
+ ] on:OpenError do:[:ex|
+ (OperatingSystem errorHolderForNumber:ex errorCode) errorCategory ~~ #existingReferentSignal ifFalse:[
+ "some fundamental error, raise exception"
+ ex reject.
+ ].
+ prevNameString = nameString ifTrue:[
+ "no more names - probably a bad template"
+ ex reject.
+ ].
+ "file exists, retry another one"
+ ].
] doWhile:[
- stream isNil and:[prevNameString ~= nameString] "/ if namestring didn't change, the template is bad
+ stream isNil and:[prevNameString ~= nameString] "/ if namestring didn't change, the template is bad
].
^ stream
"temp files in '/tmp':
- FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo%1_%2'
+ FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo%1_%2'
This must fail on the second try:
- FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo'
- FileStream newTemporaryIn:'c:\temp' asFilename nameTemplate:'foo'
+ FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo'
+ FileStream newTemporaryIn:'c:\temp' asFilename nameTemplate:'foo'
"
"temp files somewhere
@@ -507,16 +507,16 @@
"
!
-newTemporaryIn:aDirectoryOrNil withSuffix:aSuffixString
+newTemporaryIn:aDirectoryOrNil withSuffix:aSuffixString
"create atomically a new file and return the file stream - use this for temporary files.
The created file is in aDirectoryPrefix and named 'stxtmp_xx_nn',
where xx is our unix process id, and nn is a unique number, incremented
with every call to this method."
-
- ^ self
- newTemporaryIn:aDirectoryOrNil
- nameTemplate:(Filename tempFileNameTemplate asFilename
- withSuffix:aSuffixString) asString
+
+ ^ self
+ newTemporaryIn:aDirectoryOrNil
+ nameTemplate:(Filename tempFileNameTemplate asFilename
+ withSuffix:aSuffixString) asString
"
FileStream newTemporaryWithSuffix:'txt'
@@ -580,9 +580,9 @@
|stream|
stream := self new pathName:aFilenameString.
- stream
- readwrite; "/ assume read/write mode, but this depends on the args
- openWithMode:anArrayOrString attributes:nil.
+ stream
+ readwrite; "/ assume read/write mode, but this depends on the args
+ openWithMode:anArrayOrString attributes:nil.
^ stream
!
@@ -731,7 +731,7 @@
"
'Make.proto' asFilename readingFileDo:[:s|
- s accessRights
+ s accessRights
]
"
!
@@ -742,18 +742,18 @@
or FileStreamm>>#accessRights."
(OperatingSystem changeAccessModeOfFd:self fileDescriptor to:opaqueData) ifFalse:[
- ^ self fileName accessDeniedError:self
+ ^ self fileName accessDeniedError:self
].
"
'Make.proto' asFilename readingFileDo:[:s|
- s accessRights:s accessRights
+ s accessRights:s accessRights
]
"
"
'/' asFilename readingFileDo:[:s|
- s accessRights:s accessRights
+ s accessRights:s accessRights
]
"
! !
@@ -859,7 +859,7 @@
executor := super executor.
removeOnClose == true ifTrue:[
- executor setPathName:pathName removeOnClose:true.
+ executor setPathName:pathName removeOnClose:true.
].
^ executor
! !
@@ -1170,7 +1170,7 @@
This is required to reposition nonPositionable streams, such
as tape-streams or variable-record-RMS files under VMS.
Caveat:
- This should really be done transparently by the stdio library."
+ This should really be done transparently by the stdio library."
^ self slowPosition0Based:newPos
! !
@@ -1197,8 +1197,8 @@
aStream nextPutAll:'(FileStream oldFileNamed:'.
aStream nextPutAll:pathName storeString.
(self position ~~ 0) ifTrue:[
- aStream nextPutAll:'; position:'.
- self position storeOn:aStream
+ aStream nextPutAll:'; position:'.
+ self position storeOn:aStream
].
aStream nextPut:$)
@@ -1262,368 +1262,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;
+ /*
+ * 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 */
@@ -1631,80 +1632,80 @@
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 := 0.
- handleType := #filePointer.
- Lobby register:self.
- wasBlocked == false ifTrue:[OperatingSystem unblockInterrupts].
+ position := 0.
+ handleType := #filePointer.
+ Lobby register:self.
+ wasBlocked == false ifTrue:[OperatingSystem unblockInterrupts].
].
^ handle
!
@@ -1779,14 +1780,14 @@
handle := self openFile:pathName withMode:openmode attributes:attributeSpec.
handle isNil ifTrue:[
- "
- the open failed for some reason ...
- "
- ^ self openError:lastErrorNumber.
+ "
+ the open failed for some reason ...
+ "
+ ^ self openError:lastErrorNumber.
].
position := 0.
buffered isNil ifTrue:[
- buffered := true. "default is buffered"
+ buffered := true. "default is buffered"
].
!
@@ -1997,11 +1998,11 @@
!FileStream class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.166 2013-07-08 19:22:38 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.167 2013-07-24 19:56:49 cg Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.166 2013-07-08 19:22:38 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.167 2013-07-24 19:56:49 cg Exp $'
! !