[squeak-dev] opening a write-only file
Douglas McPherson
djm1329 at san.rr.com
Mon Jun 2 02:44:56 UTC 2014
It turns out #forceNewFileNamed: does not work either.
I believe the immediate cause of the problem is in the function you pointed me at: sqFileOpen() in platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c:
if (writeFlag) {
/* First try to open an existing file read/write: */
setFile(f, fopen(cFileName, "r+b"));
if (getFile(f) == NULL) {
/* Previous call fails if file does not exist. In that case,
try opening it in write mode to create a new, empty file.
*/
setFile(f, fopen(cFileName, "w+b"));
if (getFile(f) != NULL) {
char type[4],creator[4];
dir_GetMacFileTypeAndCreator(sqFileName, sqFileNameSize, type, creator);
if (strncmp(type,"BINA",4) == 0 || strncmp(type,"????",4) == 0 || *(int *)type == 0 )
dir_SetMacFileTypeAndCreator(sqFileName, sqFileNameSize,"TEXT","R*ch");
}
}
The first call to fopen() indeed fails if the file does not exist. But it also fails if the file exists but does not have both read and write "r+b" permission. So in that case the intent, as you mentioned, is to try to open in write-only but "w+b" is not the write-only mode, it is also a read and write mode, see [1]. So this fopen() attempt also fails if the file has write-only permission. A fix may be to use mode "wb" instead of "w+b", but I'm not sure if there are unintended consequences to doing this.
[1] http://en.wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/fopen
On May 31, 2014, at 14:45 , Douglas McPherson wrote:
> Ahh, thanks. I'll try it out when back in front of my machine.
>
> Thanks,
> Doug
>
> Sent from my iPhone
>
> On May 31, 2014, at 14:23, Eliot Miranda <eliot.miranda at gmail.com> wrote:
>
>> Hi Doug,
>>
>>
>> On Sat, May 31, 2014 at 10:00 AM, Douglas McPherson <djm1329 at san.rr.com> wrote:
>> Is there a way to open a write-only file in Squeak? On both Mac and Linux attempting to open such a file fails.
>>
>> Squeak has forceNewFileNamed: & forceNewFileNamed:do:. If you look at sqFileOpen in platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c you'll see it first attempts to open read-write and if that fails, opens write-only. So it should work.
>>
>> HTH
>>
>> For example, if you create a write-only file, i.e. in a shell, after cd to default directory
>>
>> echo nada > foo
>> chmod 200 foo
>>
>> Then from Squeak
>>
>> StandardFileStream fileNamed: 'foo'
>>
>> returns nil.
>>
>> If the file is given read permission (i.e. chmod 600 foo) then Squeak can open it.
>>
>> Anyone know a workaround?
>>
>> Thanks,
>> Doug
>>
>>
>> --
>> best,
>> Eliot
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20140601/43667c23/attachment.htm
More information about the Squeak-dev
mailing list
|