AT&T system V fdopen mode checking

Conor P. Cahill cpcahil at virtech.uucp
Sun Dec 3 02:43:36 AEST 1989


In article <11723 at smoke.BRL.MIL>, gwyn at smoke.BRL.MIL (Doug Gwyn) writes:
> In article <713 at mbf.UUCP> hae at mbf.UUCP (Hae Hirdler) writes:
> -The man page on the fdopen states that "the type of the stream must 
> -agree with the mode of the open file."
> 
> I believe by "mode" they mean "file access permissions".

Why would it have to do with the file permissions?  The only thing fdopen
does is associate a file pointer with a file descriptor.

Besides, if you open a file with O_RDONLY and then fdopen it with "w", 
the buffer flushes will fail because the "status flags" for the file 
descriptor do not allow write.  This is even the case when the access
permissions do permit write.

I think the problem is caused by the fact that older unixs did not
have an ability to obtain the current status flags for a file descriptor.
Therefore the fdopen() had no way to determine whether or not the 
fd mode and the fdopen mode matched.

Both System V and BSD (at least 4.3, not sure about prior) provide the 
F_GETFL functionality in fcntl() which can be used to determine the 
flags used to open the file (like O_RDONLY...).  fdopen() should be 
modified to check this and return NULL if appropriate.

> -For example, fd= open(filename, O_RDONLY); fptr= fdopen(filename, "w")
> -will return a NON_NULL fptr value instead of NULL.  
> 
> O_RDONLY has nothing to do with the file.  It is just a parameter to open().

It has everything to do with accessing data in the file via the file
descriptor.  Since fdopen uses the file descriptor (not the file name as
is displayed above) it will also have an effect on the correct usage
of the file pointer returned by fdopen().

As an example, the following code will return an error at either the
fprintf or the fclose() (usually the fclose since that is where the buffer
is flushed).

#include <stdio.h>
#include <fcntl.h>

main()
{
	int fd,status;
	FILE * fp;

	if( (fd=open("test",O_RDONLY)) == -1)
		exit(1);

	if( (fp=fdopen(fd,"w")) == NULL)
		 exit(2);

	printf("cnt = %d\n",             fprintf(fp,"this is a test\n"));

	printf("fclose returned %d\n",   fclose(fp));
	
	exit(0);
}
-- 
+-----------------------------------------------------------------------+
| Conor P. Cahill     uunet!virtech!cpcahil      	703-430-9247	!
| Virtual Technologies Inc.,    P. O. Box 876,   Sterling, VA 22170     |
+-----------------------------------------------------------------------+



More information about the Comp.bugs.sys5 mailing list