Accounting changes
Diomidis Spinellis
dds at aueb.gr
Thu Apr 19 21:46:36 UTC 2007
Robert Watson wrote:
>
> On Thu, 19 Apr 2007, Diomidis Spinellis wrote:
>
>> I will work on developing a mechanism for backwards compatibility.
>>
>> Adding a version and length field in each record as you now propose is
>> I think the way to go. However, it is not trivial, because
>> lastcomm(1) often reads the file backwards. One approach would be to
>> add a flag in ac_flags indicating a new version, and second copy of
>> the length field before ac_flags. Thus, the new structure would be
>> something like:
>
> Are there any alignment/padding considerations we should be taking into
> account with the last two fields to make sure they are consistently
> aligned with respect to the end of the record as new fields are added to
> the middle?
Thanks for pointing this out. True, we can't depend on ac_flag being in
a fixed offset from the end of the record. On i386 the situation is:
Old size=48 offsetof ac_flag=44 end-offset=4
New size=60 offsetof ac_flag=58 end-offset=2
and on amd64:
Old size=56 offsetof ac_flag=48 end-offset=8
New size=64 offsetof ac_flag=62 end-offset=2
If we follow the route of allowing the records to be read from both
ends, we'll have to think of a construct that will portably maintain
ac_flags at the same offset from the end as in the old struct acct.
Proposals welcomed!
- dds
PS The proposed layout in my previous email didn't include the changes
for the fields. This is the correct layout I used for the above
calculations:
struct nacct {
u_int8_t ac_zero; /* zero identifies new version */
u_int8_t ac_version; /* record version number */
u_int16_t ac_len; /* record length */
char ac_comm[AC_COMM_LEN]; /* command name */
float ac_utime; /* user time */
float ac_stime; /* system time */
float ac_etime; /* elapsed time */
time_t ac_btime; /* starting time */
uid_t ac_uid; /* user id */
gid_t ac_gid; /* group id */
float ac_mem; /* average memory usage */
float ac_io; /* count of IO blocks */
__dev_t ac_tty; /* controlling tty */
u_int16_t ac_len2; /* record length */
u_int8_t ac_flag; /* accounting flags */
};
More information about the freebsd-arch
mailing list