TODO: acct is not compatible / all other procedures are

This commit is contained in:
Oliver Lehmann 2008-05-17 21:23:05 +00:00
parent b31f9ab934
commit 8d8dafd919
1 changed files with 99 additions and 60 deletions

View File

@ -1,9 +1,31 @@
#include "sys/param.h" /******************************************************************************
#include "sys/systm.h" *******************************************************************************
#include "sys/acct.h"
#include "sys/dir.h" W E G A - Quelle
#include "sys/user.h"
#include "sys/inode.h" KERN 3.2 Modul: acct.c
Bearbeiter: O. Lehmann
Datum: 17.05.08
Version: 1.0
*******************************************************************************
******************************************************************************/
char acctwstr[] = "@[$]acct.c Rev : 4.1 08/27/83 11:53:34";
#include <sys/param.h>
#include <sys/sysinfo.h>
#include <sys/systm.h>
#include <sys/inode.h>
#include <sys/dir.h>
#include <sys/acct.h>
#include <sys/s.out.h>
#include <sys/mmu.h>
#include <sys/user.h>
#include <sys/proc.h>
/* /*
* Perform process accounting functions. * Perform process accounting functions.
@ -17,9 +39,9 @@ sysacct()
} *uap; } *uap;
uap = (struct a *)u.u_ap; uap = (struct a *)u.u_ap;
if (!suser()) if (suser()) {
return; if((!u.u_segmented && ((long)uap->fname==(USEGW << 16))) ||
if (uap->fname==NULL) { ( u.u_segmented && (uap->fname==NULL))) {
if (acctp) { if (acctp) {
plock(acctp); plock(acctp);
iput(acctp); iput(acctp);
@ -31,11 +53,7 @@ sysacct()
u.u_error = EBUSY; u.u_error = EBUSY;
return; return;
} }
#ifndef PNETDFS
ip = namei(uchar, 0); ip = namei(uchar, 0);
#else
ip = namei(uchar, 0, NULL);
#endif
if(ip == NULL) if(ip == NULL)
return; return;
if((ip->i_mode & IFMT) != IFREG) { if((ip->i_mode & IFMT) != IFREG) {
@ -45,43 +63,43 @@ sysacct()
} }
acctp = ip; acctp = ip;
prele(ip); prele(ip);
}
} }
/* /*
* On exit, write a record on the accounting file. * On exit, write a record on the accounting file.
*/ */
acct(st) acct()
{ {
register struct inode *ip; register struct inode *ip;
register int i;
off_t siz; off_t siz;
if ((ip=acctp)==NULL) if ((ip=acctp)) {
return;
plock(ip); plock(ip);
bcopy(u.u_comm,acctbuf.ac_comm,sizeof(acctbuf.ac_comm)); for (i=0; i<sizeof(acctbuf.ac_comm); i++)
acctbuf.ac_btime = u.u_start; acctbuf.ac_comm[i] = u.u_comm[i];
acctbuf.ac_utime = compress(u.u_utime); acctbuf.ac_utime = compress(u.u_utime);
acctbuf.ac_stime = compress(u.u_stime); acctbuf.ac_stime = compress(u.u_stime);
acctbuf.ac_etime = compress(lbolt - u.u_ticks); acctbuf.ac_etime = compress(time - u.u_start);
acctbuf.ac_mem = compress(u.u_mem); acctbuf.ac_btime = u.u_start;
acctbuf.ac_io = compress(u.u_ioch);
acctbuf.ac_rw = compress(u.u_ior+u.u_iow);
acctbuf.ac_uid = u.u_ruid; acctbuf.ac_uid = u.u_ruid;
acctbuf.ac_gid = u.u_rgid; acctbuf.ac_gid = u.u_rgid;
acctbuf.ac_tty = u.u_ttyp ? u.u_ttyd : NODEV; acctbuf.ac_mem = 0;
acctbuf.ac_stat = st; acctbuf.ac_io = 0;
acctbuf.ac_tty = u.u_ttyd;
acctbuf.ac_flag = u.u_acflag; acctbuf.ac_flag = u.u_acflag;
siz = ip->i_size; siz = ip->i_size;
u.u_offset = siz; u.u_offset = siz;
u.u_base = (caddr_t)&acctbuf; u.u_base.l = (caddr_t)&acctbuf;
u.u_count = sizeof(acctbuf); u.u_count = sizeof(acctbuf);
u.u_segflg = 1; u.u_segflg = 1;
u.u_error = 0; u.u_error = 0;
u.u_limit = (daddr_t)5000;
writei(ip); writei(ip);
if(u.u_error) if(u.u_error)
ip->i_size = siz; ip->i_size = siz;
prele(ip); prele(ip);
}
} }
/* /*
@ -107,3 +125,24 @@ register time_t t;
} }
return((exp<<13) + t); return((exp<<13) + t);
} }
/*
* lock user into core as much
* as possible. swapping may still
* occur if core grows.
*/
syslock()
{
register struct proc *p;
register struct a {
int flag;
} *uap;
uap = (struct a *)u.u_ap;
if(suser()) {
p = u.u_procp;
p->p_flag &= ~SULOCK;
if(uap->flag)
p->p_flag |= SULOCK;
}
}