[Issue 283] incorrect std.c.linux.linux.dirent definition / listdir does not decend into subdirs on linux
Frits van Bommel
fvbommel at REMwOVExCAPSs.nl
Sun Apr 29 03:01:00 PDT 2007
d-bugmail at puremagic.com wrote:
> ------- Comment #1 from thomas-dloop at kuehne.cn 2007-04-29 02:09 -------
> std.c.linux.linux.dirent is defined as
>
> # struct dirent
> # {
> # int d_ino;
> # off_t d_off;
> # ushort d_reclen;
> # ubyte d_type;
> # char[256] d_name;
> # }
>
> It is just luck that the current std.file.listdir functions don't segfault on
> Linux
> because the above structure should be named dirent64 not dirent.
>
> /usr/include/linux/dirent.h :
>
> # #ifndef _LINUX_DIRENT_H
> # #define _LINUX_DIRENT_H
> #
> # #include <linux/types.h>
> #
> # struct dirent {
> # long d_ino;
> # __kernel_off_t d_off;
> # unsigned short d_reclen;
> # char d_name[256]; /* We must not include limits.h! */
> # };
> #
> # struct dirent64 {
> # __u64 d_ino;
> # __s64 d_off;
> # unsigned short d_reclen;
> # unsigned char d_type;
> # char d_name[256];
> # };
> #
> #
> # #endif
>
> Either rename the structure to dirent64 and use readdir64 in std.file.listdir
> or fix the definition
> and rewrite std.file.DirEntry.init/isdir/isfile
Actually, it looks like the current structure is a weird mix of dirent
and dirent64. It has dirent64's d_type element, but the types of d_ino
and d_off are both 32-bit signed integers (like in dirent) instead of
unsigned 64-bit an signed 64-bit, respectively (like in dirent64).
So it should either be:
---
struct dirent {
int d_ino;
off_t d_off;
ushort d_reclen;
char[256] d_name;
}
---
or:
---
struct dirent64 {
ulong d_ino;
long d_off;
ushort d_reclen;
ubyte d_type;
char[256] d_name;
}
---
More information about the Digitalmars-d-bugs
mailing list