struct dirent question
Micah
micahjon at ywave.com
Wed Aug 16 22:54:32 UTC 2006
Tony Maher wrote:
> 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
>
I think you could fake it as follows:
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 */
#define MAXNAMLEN 255
char d_name[MAXNAMLEN + 1]; /* name must be no longer than
this */
#if !__BSD_VISIBLE
#undef MAXNAMLEN
#endif
};
I'm not sure if it's more readable, but it puts 255 in only one location.
- Micah
More information about the freebsd-hackers
mailing list