165791Smckusick /*-
265791Smckusick  * Copyright (c) 1982, 1986, 1989, 1993
365791Smckusick  *	The Regents of the University of California.  All rights reserved.
465791Smckusick  * (c) UNIX System Laboratories, Inc.
565791Smckusick  * All or some portions of this file are derived from material licensed
665791Smckusick  * to the University of California by American Telephone and Telegraph
765791Smckusick  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
865791Smckusick  * the permission of UNIX System Laboratories, Inc.
949676Smckusick  *
1049676Smckusick  * %sccs.include.redist.c%
1149676Smckusick  *
12*67360Smckusick  *	from: @(#)kern_acct.c	8.4 (Berkeley) 6/2/94
1349676Smckusick  */
1449676Smckusick 
1565791Smckusick #include <sys/param.h>
1665791Smckusick #include <sys/proc.h>
1765791Smckusick #include <sys/mount.h>
1865791Smckusick #include <sys/vnode.h>
1965791Smckusick #include <sys/file.h>
2065791Smckusick #include <sys/syslog.h>
2165791Smckusick #include <sys/kernel.h>
2249676Smckusick 
2365791Smckusick struct acct_args {
2465791Smckusick 	char	*fname;
2565791Smckusick };
2665791Smckusick acct(a1, a2, a3)
2765791Smckusick 	struct proc *a1;
2865791Smckusick 	struct acct_args *a2;
2965791Smckusick 	int *a3;
3065791Smckusick {
3165791Smckusick 	/*
3265791Smckusick 	 * Body deleted.
3365791Smckusick 	 */
3465791Smckusick 	return (ENOSYS);
3565791Smckusick }
3649676Smckusick 
3765791Smckusick acct_process(a1)
3865791Smckusick 	struct proc *a1;
3949676Smckusick {
4049676Smckusick 
4149676Smckusick 	/*
4249676Smckusick 	 * Body deleted.
4349676Smckusick 	 */
4465791Smckusick 	return;
4549676Smckusick }
4649676Smckusick 
4749676Smckusick /*
4849676Smckusick  * Periodically check the file system to see if accounting
49*67360Smckusick  * should be turned on or off. Beware the case where the vnode
50*67360Smckusick  * has been vgone()'d out from underneath us, e.g. when the file
51*67360Smckusick  * system containing the accounting file has been forcibly unmounted.
5249676Smckusick  */
5365791Smckusick 
5465791Smckusick /*
5565791Smckusick  * Values associated with enabling and disabling accounting
5665791Smckusick  */
5765791Smckusick int	acctsuspend = 2;	/* stop accounting when < 2% free space left */
5865791Smckusick int	acctresume = 4;		/* resume when free space risen to > 4% */
5965791Smckusick int	acctchkfreq = 15;	/* frequency (in seconds) to check space */
6065791Smckusick 
6165791Smckusick /*
6265791Smckusick  * SHOULD REPLACE THIS WITH A DRIVER THAT CAN BE READ TO SIMPLIFY.
6365791Smckusick  */
6465791Smckusick struct	vnode *acctp;
6565791Smckusick struct	vnode *savacctp;
6665791Smckusick 
6765791Smckusick /* ARGSUSED */
6865791Smckusick void
6965791Smckusick acctwatch(a)
7065791Smckusick 	void *a;
7149676Smckusick {
7249676Smckusick 	struct statfs sb;
7349676Smckusick 
7449676Smckusick 	if (savacctp) {
75*67360Smckusick 		if (savacctp->v_type == VBAD) {
76*67360Smckusick 			(void) vn_close(savacctp, FWRITE, NOCRED, NULL);
77*67360Smckusick 			savacctp = NULL;
78*67360Smckusick 			return;
79*67360Smckusick 		}
8049676Smckusick 		(void)VFS_STATFS(savacctp->v_mount, &sb, (struct proc *)0);
8149676Smckusick 		if (sb.f_bavail > acctresume * sb.f_blocks / 100) {
8249676Smckusick 			acctp = savacctp;
8349676Smckusick 			savacctp = NULL;
8449676Smckusick 			log(LOG_NOTICE, "Accounting resumed\n");
8565791Smckusick 		}
8665791Smckusick 	} else {
8765791Smckusick 		if (acctp == NULL)
8849676Smckusick 			return;
89*67360Smckusick 		if (acctp->v_type == VBAD) {
90*67360Smckusick 			(void) vn_close(acctp, FWRITE, NOCRED, NULL);
91*67360Smckusick 			acctp = NULL;
92*67360Smckusick 			return;
93*67360Smckusick 		}
9465791Smckusick 		(void)VFS_STATFS(acctp->v_mount, &sb, (struct proc *)0);
9565791Smckusick 		if (sb.f_bavail <= acctsuspend * sb.f_blocks / 100) {
9665791Smckusick 			savacctp = acctp;
9765791Smckusick 			acctp = NULL;
9865791Smckusick 			log(LOG_NOTICE, "Accounting suspended\n");
9949676Smckusick 		}
10049676Smckusick 	}
10165791Smckusick 	timeout(acctwatch, NULL, acctchkfreq * hz);
10249676Smckusick }
103