[Mono-list] Mono.Unix.Native.Syscall.(l)stat weirdness

Jonathan Pryor jonpryor at vt.edu
Wed Feb 15 07:15:54 EST 2006


On Wed, 2006-02-15 at 12:15 +0100, László Monda wrote:
> I've been playing with stat() and lstat() in the past few days and
> things seem to be weird.
> 
> I made two test programs to demonstrate the problem.  The first is
> written in C and behaves correctly, the second is written in C# and is
> quite abnormal.  I attached both of them.

What's wrong is that this C code:

	S_ISREG(mode)

is *not* equivalent to this C# code you use:

	(stat.st_mode & MUN.FilePermissions.S_IFREG) ==
	   MUN.FilePermissions.S_IFREG

If you read /usr/include/sys/stat.h, S_ISREG is this:

	#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
	#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)

In short, S_ISREG is equivalent to this C# code:

	(stat.st_mode & MUN.FilePermissions.S_IFMT) == 
	  MUN.FilePermissions.S_IFREG;

Ditto for all the other S_IS* macro calls.

So your C# code is buggy. :-)

You might try looking at the internal method
Mono.Unix.UnixFileSystemInfo.IsFileType(), which is used by the public
properties IsDirectory, IsFifo, etc.

 - Jon




More information about the Mono-list mailing list