Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Aug 2006 08:36:28 +1000
From:      Tony Maher <anthony.maher@uts.edu.au>
To:        Eric Anderson <anderson@centtech.com>
Cc:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   Re: struct dirent question
Message-ID:  <44E39DEC.1050204@uts.edu.au>
In-Reply-To: <44E3484D.8090905@centtech.com>
References:  <44E29055.3080205@centtech.com> <20060816054925.GA11651@droopy.unibe.ch> <44E3484D.8090905@centtech.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Eric Anderson wrote:
> On 08/16/06 00:49, Tobias Roth wrote:
> 
>> On Tue, Aug 15, 2006 at 10:26:13PM -0500, Eric Anderson wrote:
>>
>>> Does the ifdef in the struct dirent (pasted in below) make any sense?
>>> Seems like regardless of whether the __BSD_VISIBLE is defined or not,
>>> the d_name length will always be 255 + 1.
>>>
>>> Eric
>>>
>>>
>>> struct dirent {
>>>         __uint32_t d_fileno;            /* file number of entry */
>>>         __uint16_t d_reclen;            /* length of this record */
>>>         __uint8_t  d_type;              /* file type, see below */
>>>         __uint8_t  d_namlen;            /* length of string in d_name */
>>> #if __BSD_VISIBLE
>>> #define MAXNAMLEN       255
>>>         char    d_name[MAXNAMLEN + 1];  /* name must be no longer
>>> than this */
>>> #else
>>>         char    d_name[255 + 1];        /* name must be no longer
>>> than this */
>>> #endif
>>> };
>>
>>
>> The difference is whether MAXNAMLEN is defined or not, the value of
>> d_name
>> is irrelevant. How far not defining MAXNAMLEN (in the case __BSD_VISIBLE=
>> false) makes sense, I cannot tell.
>>
>> cheers, t.
> 
> 
> 
> My point was, that either path you take (if BSD_VISIBLE is defined or
> not), you end up with d_name having a size of 255 + 1, so what's the
> point the having it at all?  Isn't this the same thing (but easier to
> read):
> 
> #if __BSD_VISIBLE
> #define MAXNAMLEN       255
> #endif
> 
> struct dirent {
>          __uint32_t d_fileno;            /* file number of entry */
>          __uint16_t d_reclen;            /* length of this record */
>          __uint8_t  d_type;              /* file type, see below */
>          __uint8_t  d_namlen;            /* length of string in d_name
>          char    d_name[255 + 1];        /* name must be no longer than
> this */
> };

Easier to read and the same provided value of MAXNAMLEN is not changed.
If it is changed then you have to change 255 in two places otherwise
definition MAXNAMLEN and actual array size will be wrong (where __BSD_VISIBLE
defined).  In the original code it forces them to be the same.

Though the need to change "255" in two places happens in the original code.
If you do not change both occurences of "255" you get different
aray sizes depending on whether __BSD_VISIBLE is defined. But at least in the
__BSD_VISBIBLE case you do keep definition and size correct.

Is there no convention to have/allow "private" definitions?
e.g.

#define __MAXNAMLEN 255
#if __BSD_VISIBLE
#define MAXNAMLEN       __MAXNAMLEN
#endif

struct dirent {
    __uint32_t d_fileno;                /* file number of entry */
    __uint16_t d_reclen;                /* length of this record *
    __uint8_t  d_type;                  /* file type, see below */
    __uint8_t  d_namlen;                /* length of string in d_name
       char    d_name[__MAXNAMLEN + 1]; /* name must be no longer than this */
};

just curious

-- 
tonym



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?44E39DEC.1050204>