Annotation of researchv10no/sys/os/acct.c, revision 1.1.1.1

1.1       root        1: /*     acct.c  4.4     81/03/08        */
                      2: 
                      3: #include "sys/param.h"
                      4: #include "sys/systm.h"
                      5: #include "sys/acct.h"
                      6: #include "sys/user.h"
                      7: #include "sys/inode.h"
                      8: 
                      9: struct inode *acctp;
                     10: 
                     11: /*
                     12:  * Perform process accounting functions.
                     13:  */
                     14: sysacct()
                     15: {
                     16:        register struct inode *ip;
                     17:        register struct a {
                     18:                char    *fname;
                     19:        } *uap;
                     20: 
                     21:        uap = (struct a *)u.u_ap;
                     22:        if (suser() == 0)
                     23:                return;
                     24:        if (uap->fname==NULL) {
                     25:                if (ip = acctp) {
                     26:                        plock(ip);
                     27:                        iput(ip);
                     28:                        acctp = NULL;
                     29:                }
                     30:                return;
                     31:        }
                     32:        if (acctp) {
                     33:                u.u_error = EBUSY;
                     34:                return;
                     35:        }
                     36:        ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1);
                     37:        if(ip == NULL)
                     38:                return;
                     39:        if((ip->i_mode & IFMT) != IFREG) {
                     40:                u.u_error = EACCES;
                     41:                iput(ip);
                     42:                return;
                     43:        }
                     44:        if (access(ip, IWRITE)) {
                     45:                iput(ip);
                     46:                return;
                     47:        }
                     48:        acctp = ip;
                     49:        prele(ip);
                     50: }
                     51: 
                     52: struct acct acctbuf;
                     53: /*
                     54:  * On exit, write a record on the accounting file.
                     55:  */
                     56: acct()
                     57: {
                     58:        register i;
                     59:        register struct inode *ip;
                     60:        off_t siz;
                     61:        register struct acct *ap = &acctbuf;
                     62: 
                     63:        if ((ip=acctp)==NULL)
                     64:                return;
                     65:        plock(ip);
                     66:        for (i=0; i<sizeof(ap->ac_comm); i++)
                     67:                ap->ac_comm[i] = u.u_comm[i];
                     68:        ap->ac_utime = compress((long)u.u_vm.vm_utime);
                     69:        ap->ac_stime = compress((long)u.u_vm.vm_stime);
                     70:        ap->ac_etime = compress((long)(time - u.u_start));
                     71:        ap->ac_btime = u.u_start;
                     72:        ap->ac_uid = u.u_ruid;
                     73:        ap->ac_gid = u.u_rgid;
                     74:        ap->ac_mem = 0;
                     75:        if (i = u.u_vm.vm_utime + u.u_vm.vm_stime)
                     76:                ap->ac_mem = (u.u_vm.vm_ixrss + u.u_vm.vm_idsrss) / i;
                     77:        ap->ac_io = compress((long)(u.u_vm.vm_inblk + u.u_vm.vm_oublk));
                     78:        ap->ac_tty = u.u_ttyino;
                     79:        ap->ac_flag = u.u_acflag;
                     80:        siz = ip->i_size;
                     81:        u.u_offset = ltoL(siz);
                     82:        u.u_base = (caddr_t)ap;
                     83:        u.u_count = sizeof(acctbuf);
                     84:        u.u_segflg = SEGSYS;
                     85:        u.u_error = 0;
                     86:        writei(ip);
                     87:        if(u.u_error)
                     88:                ip->i_size = siz;
                     89:        prele(ip);
                     90: }
                     91: 
                     92: /*
                     93:  * Produce a pseudo-floating point representation
                     94:  * with 3 bits base-8 exponent, 13 bits fraction.
                     95:  */
                     96: compress(t)
                     97: register long t;
                     98: {
                     99:        register exp = 0, round = 0;
                    100: 
                    101:        while (t >= 8192) {
                    102:                exp++;
                    103:                round = t&04;
                    104:                t >>= 3;
                    105:        }
                    106:        if (round) {
                    107:                t++;
                    108:                if (t >= 8192) {
                    109:                        t >>= 3;
                    110:                        exp++;
                    111:                }
                    112:        }
                    113:        return((exp<<13) + t);
                    114: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.