SRI-NOSC/ken/acct.c

#
#include "param.h"
#include "inode.h"
#include "user.h"
#include "acct.h"
#include "proc.h"

#ifdef ACCTSYS

int acc_lock;		/* lock for exclusive use */
char	accsvuid;

char	accbuf	[512];
char	*accbufp accbuf;
char	acc_vec [ACCVLEN]; /* for system users to build in */

accinput (vecaddr)	/* internal form */
char	*vecaddr;
{
	register int n;
	register char *vptr, *bptr;

	acc_lock++;
	while (acc_lock > 1)
		sleep( &acc_lock, -1 );
	bptr = accbufp;
	vptr = vecaddr;
	for (n=ACCVLEN; n--; *bptr++ = *vptr++);
	accbufp = bptr;
	accwrite ();
	if (--acc_lock) signal ( &acc_lock );
}

accput ()	/* called via sys accput;addr;passwd */
{
	register int n, t;
	register char *cp;

	acc_lock++;
	while (acc_lock > 1)
		sleep( &acc_lock, -1 );
	u.u_error = 0;
	if (u.u_arg[1] != ACCPSWD) {
		u.u_error = EACCT;
		if (--acc_lock) signal ( &acc_lock );
		return;
	}
	cp = accbufp;
	u.u_base = u.u_arg[0];
	u.u_count = n = ACCVLEN;
	u.u_segflg = 0;	/* data from user space */
	do {
		if (( t = cpass () ) < 0) {
			printf ("ACC cpass error \n");
		}
		*cp++ = t;
	} while --n;
	accbufp = cp;
	accwrite ();
	if (--acc_lock) signal ( &acc_lock );
}


accwrite ()
{
	register int *ip;
	extern schar ();

	if (accbufp < &accbuf[sizeof accbuf - ACCVLEN])
		return;
	/*
	 * set su priv, open file, check access, and write, then reset
	 * su priv
	 */
	accsvuid = u.u_uid;		/* save uid, and set su priv */
	u.u_uid = 0;
	u.u_error = 0;			/* open file */
	u.u_dirp = "/usr/lpd/logs/logfile";
	ip = namei (&schar, 0);		/* file must already be on disk */
	if (ip == NULL)
		goto out;	/* else fix pointer and return */
	if (( !access (ip, IWRITE))	/* su allowed to write ? */
	&& (ip->i_mode & IFMT) == 0) {	/* is it a data file on disk */
		u.u_offset[0] = ip->i_size0;	/* seek eof */
		u.u_offset[1] =
			ip->i_size1 & 0177000; /* force to a block boundary */
		u.u_base = accbuf;	/* set up for write */
		u.u_count = 512;
		u.u_segflg = 1;		/* we are writing from sys space */
		writei (ip);		/* do the io */
	}
	iput (ip);			/* close the file */
out:
	u.u_uid = accsvuid;		/* relinquish su priv */
	u.u_error = 0;
	accbufp = accbuf;
}

#endif ACCTSYS