Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Apr 2007 20:28:35 +0300
From:      Diomidis Spinellis <dds@aueb.gr>
To:        Robert Watson <rwatson@FreeBSD.org>
Cc:        arch@FreeBSD.org, re@FreeBSD.org
Subject:   Re: Accounting changes
Message-ID:  <4627A6C3.2070409@aueb.gr>
In-Reply-To: <20070419101815.Y2913@fledge.watson.org>
References:  <461958CC.4040804@aueb.gr> <20070414170218.M76326@fledge.watson.org> <4621E826.6050306@aueb.gr> <20070415105157.J84174@fledge.watson.org> <46231C64.9010707@aueb.gr> <20070419101815.Y2913@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Robert Watson wrote:
> If we're willing to assume architectures can only read their own 
> accounting files (the status quo), the above argument doesn't really 
> make sense.  You end up with a series of versions of "struct acct", and 
> that code is architecture-neutral.  Thinking about it more, I'm not sure 
> a per file header is even required or desired (as I had previously 
> suggested), simply a per-record versioning scheme, allowing a reboot 
> onto a new kernel to continue to write to the existing accounting data.  
> Read the first 16 bytes, if the first byte is non-0 then it's the 
> original "struct acct" layout, and otherwise the second byte is the 
> version number to use.  Or in the interests of forward compatibility, 
> include a length parameter in another 16 bytes so you can skip over 
> records if necessary in order to allow the kernel to move back and 
> forward across file versions if there's a problem after the upgrade.

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:

#define AC_COMM_LEN 16
struct acct {
	char	  ac_zero;		/* zero identifies new version */
	char	  ac_version;		/* record version number */
	u_int16_t ac_len;		/* record length */


/* Business as usual: */
	char	  ac_comm[AC_COMM_LEN];	/* command name */
	comp_t	  ac_utime;		/* user time */
	comp_t	  ac_stime;		/* system time */
	comp_t	  ac_etime;		/* elapsed time */
	time_t	  ac_btime;		/* starting time */
	uid_t	  ac_uid;		/* user id */
	gid_t	  ac_gid;		/* group id */
	u_int16_t ac_mem;		/* average memory usage */
	comp_t	  ac_io;		/* count of IO blocks */
	__dev_t   ac_tty;		/* controlling tty */


/* Changes here: */
	u_int16_t ac_len2;		/* record length */

#define	AFORK	0x01			/* forked but not exec'ed */
/* ASU is no longer supported */
#define	ASU	0x02			/* used super-user permissions */
#define	ACOMPAT	0x04			/* used compatibility mode */
#define	ACORE	0x08			/* dumped core */
#define	AXSIG	0x10			/* killed by a signal */
#define	ANVER	0x20			/* new record version */
	u_int8_t  ac_flag;		/* accounting flags */
};

This structure allows the file to be read in both directions, and also 
provides backwards compatibility.

Diomidis



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