[Mono-list] Mono.Unix.Native.Syscall.(l)stat weirdness
László Monda
mondalaci at gmail.com
Thu Feb 16 18:36:55 EST 2006
Hey Jonathan,
On Wed, 2006-02-15 at 07:15 -0500, Jonathan Pryor wrote:
> 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. :-)
That's apparent to me now. ;-)
> You might try looking at the internal method
> Mono.Unix.UnixFileSystemInfo.IsFileType(), which is used by the public
> properties IsDirectory, IsFifo, etc.
UnixFileSystemInfo seems to be a well-designed abstraction on top of the
Unix VFS API, but I'll stick with syscalls, because I don't like
UnixFileSystemInfo's exception policy.
Thanks for your (extremely clear and conscise) explanation.
--
Laci
Blog: http://monda.hu/~laci/blog
Home: http://mondalaci.objectis.net
More information about the Mono-list
mailing list