minor lint
[unix-history] / usr / src / sys / kern / kern_resource.c
CommitLineData
49c84d3f 1/* kern_resource.c 4.2 %G% */
1b64633a
BJ
2
3#include "../h/param.h"
4#include "../h/systm.h"
5#include "../h/acct.h"
6#include "../h/dir.h"
7#include "../h/user.h"
8#include "../h/inode.h"
9#include "../h/proc.h"
10#include "../h/seg.h"
11
12/*
13 * Perform process accounting functions.
14 */
15
16sysacct()
17{
18 register struct inode *ip;
19 register struct a {
20 char *fname;
21 } *uap;
22
23 uap = (struct a *)u.u_ap;
24 if (suser()) {
25 if (uap->fname==NULL) {
26 if (acctp) {
27 plock(acctp);
28 iput(acctp);
29 acctp = NULL;
30 }
31 return;
32 }
33 if (acctp) {
34 u.u_error = EBUSY;
35 return;
36 }
37 ip = namei(uchar, 0);
38 if(ip == NULL)
39 return;
40 if((ip->i_mode & IFMT) != IFREG) {
41 u.u_error = EACCES;
42 iput(ip);
43 return;
44 }
45 acctp = ip;
46 prele(ip);
47 }
48}
49
50/*
51 * On exit, write a record on the accounting file.
52 */
53acct()
54{
55 register i;
56 register struct inode *ip;
57 off_t siz;
58
59 if ((ip=acctp)==NULL)
60 return;
61 plock(ip);
62 for (i=0; i<sizeof(acctbuf.ac_comm); i++)
63 acctbuf.ac_comm[i] = u.u_comm[i];
49c84d3f
BJ
64 acctbuf.ac_utime = compress((long)u.u_vm.vm_utime);
65 acctbuf.ac_stime = compress((long)u.u_vm.vm_stime);
66 acctbuf.ac_etime = compress((long)(time - u.u_start));
1b64633a
BJ
67 acctbuf.ac_btime = u.u_start;
68 acctbuf.ac_uid = u.u_ruid;
69 acctbuf.ac_gid = u.u_rgid;
70 acctbuf.ac_mem = 0;
79c03a01
BJ
71 if (i = u.u_vm.vm_utime + u.u_vm.vm_stime)
72 acctbuf.ac_mem = (u.u_vm.vm_ixrss + u.u_vm.vm_idsrss) / i;
49c84d3f 73 acctbuf.ac_io = compress((long)(u.u_vm.vm_inblk + u.u_vm.vm_oublk));
1b64633a
BJ
74 acctbuf.ac_tty = u.u_ttyd;
75 acctbuf.ac_flag = u.u_acflag;
76 siz = ip->i_size;
77 u.u_offset = siz;
78 u.u_base = (caddr_t)&acctbuf;
79 u.u_count = sizeof(acctbuf);
80 u.u_segflg = 1;
81 u.u_error = 0;
82 writei(ip);
83 if(u.u_error)
84 ip->i_size = siz;
85 prele(ip);
86}
87
88/*
89 * Produce a pseudo-floating point representation
90 * with 3 bits base-8 exponent, 13 bits fraction.
91 */
92compress(t)
49c84d3f 93register long t;
1b64633a
BJ
94{
95 register exp = 0, round = 0;
96
97 while (t >= 8192) {
98 exp++;
99 round = t&04;
100 t >>= 3;
101 }
102 if (round) {
103 t++;
104 if (t >= 8192) {
105 t >>= 3;
106 exp++;
107 }
108 }
109 return((exp<<13) + t);
110}
111
112/*
113 * lock user into core as much
114 * as possible. swapping may still
115 * occur if core grows.
116 */
117syslock()
118{
119 register struct proc *p;
120 register struct a {
121 int flag;
122 } *uap;
123
124 uap = (struct a *)u.u_ap;
125 if(suser()) {
126 p = u.u_procp;
127 p->p_flag &= ~SULOCK;
128 if(uap->flag)
129 p->p_flag |= SULOCK;
130 }
131}