Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Nov 2005 12:11:46 +0100
From:      Stefan Farfeleder <stefan@fafoe.narf.at>
To:        Daniel Rudy <dr2867@pacbell.net>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: getdirentries_args and other kernel syscall structures
Message-ID:  <20051123111143.GE1281@wombat.fafoe.narf.at>
In-Reply-To: <4383F0CA.2030609@pacbell.net>
References:  <4383F0CA.2030609@pacbell.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Nov 22, 2005 at 08:32:10PM -0800, Daniel Rudy wrote:
> 
> Ok, I'va got a little question here.  In the structure
> getdirentries_args, there seems to be duplicated fields that I'm not
> entirely sure what they do.  Here's the definition of a structure
> verbatim from sys/sysproto.h:
> 
> struct getdirentries_args {
>         char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
>         char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)];
>         char count_l_[PADL_(u_int)]; u_int count; char
> count_r_[PADR_(u_int)];
>         char basep_l_[PADL_(long *)]; long * basep; char
> basep_r_[PADR_(long *)];
> };
> 
> Now my question is what does the l and r variables do?  It seems that
> they do something with padding the data based on the endian of the
> machine?  I look through this header file, and I see all the structures
> have similar constructs.  Is it something that can be safely ignored?

This file is automatically generated by makesyscalls.sh.  The l and r
variables are a hack to correctly the member between them.  One of PADL_
or PADR_ always evalutes to 0, the other one to the needed padding,
depending on the passed type.  This is unfortunate because it relies on
the GCC extension to accept 0-sized arrays.  I'd love to fix that but
couldn't come up with something that isn't very involved.

Stefan



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