|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)kern_resource.c 7.9 (Berkeley) 6/28/90
7: */
8:
9: #include "param.h"
10: #include "user.h"
11: #include "proc.h"
12:
13: /*
14: * Resource controls and accounting.
15: */
16:
17: getpriority(curp, uap, retval)
18: struct proc *curp;
19: register struct args {
20: int which;
21: int who;
22: } *uap;
23: int *retval;
24: {
25: register struct proc *p;
26: register int low = PRIO_MAX + 1;
27:
28: switch (uap->which) {
29:
30: case PRIO_PROCESS:
31: if (uap->who == 0)
32: p = curp;
33: else
34: p = pfind(uap->who);
35: if (p == 0)
36: break;
37: low = p->p_nice;
38: break;
39:
40: case PRIO_PGRP: {
41: register struct pgrp *pg;
42:
43: if (uap->who == 0)
44: pg = curp->p_pgrp;
45: else if ((pg = pgfind(uap->who)) == NULL)
46: break;
47: for (p = pg->pg_mem; p != NULL; p = p->p_pgrpnxt) {
48: if (p->p_nice < low)
49: low = p->p_nice;
50: }
51: break;
52: }
53:
54: case PRIO_USER:
55: if (uap->who == 0)
56: uap->who = p->p_uid;
57: for (p = allproc; p != NULL; p = p->p_nxt) {
58: if (p->p_uid == uap->who &&
59: p->p_nice < low)
60: low = p->p_nice;
61: }
62: break;
63:
64: default:
65: return (EINVAL);
66: }
67: if (low == PRIO_MAX + 1)
68: return (ESRCH);
69: *retval = low;
70: return (0);
71: }
72:
73: /* ARGSUSED */
74: setpriority(curp, uap, retval)
75: struct proc *curp;
76: register struct args {
77: int which;
78: int who;
79: int prio;
80: } *uap;
81: int *retval;
82: {
83: register struct proc *p;
84: int found = 0, error = 0;
85:
86: switch (uap->which) {
87:
88: case PRIO_PROCESS:
89: if (uap->who == 0)
90: p = curp;
91: else
92: p = pfind(uap->who);
93: if (p == 0)
94: break;
95: error = donice(curp, p, uap->prio);
96: found++;
97: break;
98:
99: case PRIO_PGRP: {
100: register struct pgrp *pg;
101:
102: if (uap->who == 0)
103: pg = curp->p_pgrp;
104: else if ((pg = pgfind(uap->who)) == NULL)
105: break;
106: for (p = pg->pg_mem; p != NULL; p = p->p_pgrpnxt) {
107: error = donice(curp, p, uap->prio);
108: found++;
109: }
110: break;
111: }
112:
113: case PRIO_USER:
114: if (uap->who == 0)
115: uap->who = p->p_uid;
116: for (p = allproc; p != NULL; p = p->p_nxt)
117: if (p->p_uid == uap->who) {
118: error = donice(curp, p, uap->prio);
119: found++;
120: }
121: break;
122:
123: default:
124: return (EINVAL);
125: }
126: if (found == 0)
127: return (ESRCH);
128: return (0);
129: }
130:
131: donice(curp, chgp, n)
132: register struct proc *curp, *chgp;
133: register int n;
134: {
135:
136: if (curp->p_uid && curp->p_ruid &&
137: curp->p_uid != chgp->p_uid && curp->p_ruid != chgp->p_uid)
138: return (EPERM);
139: if (n > PRIO_MAX)
140: n = PRIO_MAX;
141: if (n < PRIO_MIN)
142: n = PRIO_MIN;
143: if (n < chgp->p_nice && suser(u.u_cred, &u.u_acflag))
144: return (EACCES);
145: chgp->p_nice = n;
146: (void) setpri(chgp);
147: return (0);
148: }
149:
150: /* ARGSUSED */
151: setrlimit(p, uap, retval)
152: struct proc *p;
153: register struct args {
154: u_int which;
155: struct rlimit *lim;
156: } *uap;
157: int *retval;
158: {
159: struct rlimit alim;
160: register struct rlimit *alimp;
161: extern unsigned maxdmap;
162: int error;
163:
164: if (uap->which >= RLIM_NLIMITS)
165: return (EINVAL);
166: alimp = &u.u_rlimit[uap->which];
167: if (error =
168: copyin((caddr_t)uap->lim, (caddr_t)&alim, sizeof (struct rlimit)))
169: return (error);
170: if (alim.rlim_cur > alimp->rlim_max || alim.rlim_max > alimp->rlim_max)
171: if (error = suser(u.u_cred, &u.u_acflag))
172: return (error);
173: switch (uap->which) {
174:
175: case RLIMIT_DATA:
176: if (alim.rlim_cur > maxdmap)
177: alim.rlim_cur = maxdmap;
178: if (alim.rlim_max > maxdmap)
179: alim.rlim_max = maxdmap;
180: break;
181:
182: case RLIMIT_STACK:
183: if (alim.rlim_cur > maxdmap)
184: alim.rlim_cur = maxdmap;
185: if (alim.rlim_max > maxdmap)
186: alim.rlim_max = maxdmap;
187: break;
188: }
189: *alimp = alim;
190: if (uap->which == RLIMIT_RSS)
191: p->p_maxrss = alim.rlim_cur/NBPG;
192: return (0);
193: }
194:
195: /* ARGSUSED */
196: getrlimit(p, uap, retval)
197: struct proc *p;
198: register struct args {
199: u_int which;
200: struct rlimit *rlp;
201: } *uap;
202: int *retval;
203: {
204:
205: if (uap->which >= RLIM_NLIMITS)
206: return (EINVAL);
207: return (copyout((caddr_t)&u.u_rlimit[uap->which], (caddr_t)uap->rlp,
208: sizeof (struct rlimit)));
209: }
210:
211: /* ARGSUSED */
212: getrusage(p, uap, retval)
213: register struct proc *p;
214: register struct args {
215: int who;
216: struct rusage *rusage;
217: } *uap;
218: int *retval;
219: {
220: register struct rusage *rup;
221:
222: switch (uap->who) {
223:
224: case RUSAGE_SELF: {
225: int s;
226:
227: rup = &u.u_ru;
228: s = splclock();
229: rup->ru_stime = p->p_stime;
230: rup->ru_utime = p->p_utime;
231: splx(s);
232: break;
233: }
234:
235: case RUSAGE_CHILDREN:
236: rup = &u.u_cru;
237: break;
238:
239: default:
240: return (EINVAL);
241: }
242: return (copyout((caddr_t)rup, (caddr_t)uap->rusage,
243: sizeof (struct rusage)));
244: }
245:
246: ruadd(ru, ru2)
247: register struct rusage *ru, *ru2;
248: {
249: register long *ip, *ip2;
250: register int i;
251:
252: timevaladd(&ru->ru_utime, &ru2->ru_utime);
253: timevaladd(&ru->ru_stime, &ru2->ru_stime);
254: if (ru->ru_maxrss < ru2->ru_maxrss)
255: ru->ru_maxrss = ru2->ru_maxrss;
256: ip = &ru->ru_first; ip2 = &ru2->ru_first;
257: for (i = &ru->ru_last - &ru->ru_first; i > 0; i--)
258: *ip++ += *ip2++;
259: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.