X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/0f4556f12c8f75078501c9d1338ae7648a97f975..95f51977ddc18faa2e212f30c00a39540b39f325:/usr/src/sys/sys/kern_resource.c diff --git a/usr/src/sys/sys/kern_resource.c b/usr/src/sys/sys/kern_resource.c index 25ec549d16..5e870643ba 100644 --- a/usr/src/sys/sys/kern_resource.c +++ b/usr/src/sys/sys/kern_resource.c @@ -1,16 +1,22 @@ -/* kern_resource.c 6.1 83/07/29 */ - -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/dir.h" -#include "../h/user.h" -#include "../h/inode.h" -#include "../h/proc.h" -#include "../h/seg.h" -#include "../h/fs.h" -#include "../h/uio.h" -#include "../h/vm.h" -#include "../h/kernel.h" +/* + * Copyright (c) 1982, 1986 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + * + * @(#)kern_resource.c 7.1 (Berkeley) 6/5/86 + */ + +#include "param.h" +#include "systm.h" +#include "dir.h" +#include "user.h" +#include "inode.h" +#include "proc.h" +#include "seg.h" +#include "fs.h" +#include "uio.h" +#include "vm.h" +#include "kernel.h" /* * Resource controls and accounting. @@ -23,9 +29,8 @@ getpriority() int who; } *uap = (struct a *)u.u_ap; register struct proc *p; + int low = PRIO_MAX + 1; - u.u_r.r_val1 = NZERO+20; - u.u_error = ESRCH; switch (uap->which) { case PRIO_PROCESS: @@ -34,44 +39,39 @@ getpriority() else p = pfind(uap->who); if (p == 0) - return; - u.u_r.r_val1 = p->p_nice; - u.u_error = 0; + break; + low = p->p_nice; break; case PRIO_PGRP: if (uap->who == 0) uap->who = u.u_procp->p_pgrp; - for (p = proc; p < procNPROC; p++) { - if (p->p_stat == NULL) - continue; + for (p = allproc; p != NULL; p = p->p_nxt) { if (p->p_pgrp == uap->who && - p->p_nice < u.u_r.r_val1) { - u.u_r.r_val1 = p->p_nice; - u.u_error = 0; - } + p->p_nice < low) + low = p->p_nice; } break; case PRIO_USER: if (uap->who == 0) uap->who = u.u_uid; - for (p = proc; p < procNPROC; p++) { - if (p->p_stat == NULL) - continue; + for (p = allproc; p != NULL; p = p->p_nxt) { if (p->p_uid == uap->who && - p->p_nice < u.u_r.r_val1) { - u.u_r.r_val1 = p->p_nice; - u.u_error = 0; - } + p->p_nice < low) + low = p->p_nice; } break; default: u.u_error = EINVAL; - break; + return; } - u.u_r.r_val1 -= NZERO; + if (low == PRIO_MAX + 1) { + u.u_error = ESRCH; + return; + } + u.u_r.r_val1 = low; } setpriority() @@ -82,8 +82,8 @@ setpriority() int prio; } *uap = (struct a *)u.u_ap; register struct proc *p; + int found = 0; - u.u_error = ESRCH; switch (uap->which) { case PRIO_PROCESS: @@ -92,30 +92,37 @@ setpriority() else p = pfind(uap->who); if (p == 0) - return; + break; donice(p, uap->prio); + found++; break; case PRIO_PGRP: if (uap->who == 0) uap->who = u.u_procp->p_pgrp; - for (p = proc; p < procNPROC; p++) - if (p->p_pgrp == uap->who) + for (p = allproc; p != NULL; p = p->p_nxt) + if (p->p_pgrp == uap->who) { donice(p, uap->prio); + found++; + } break; case PRIO_USER: if (uap->who == 0) uap->who = u.u_uid; - for (p = proc; p < procNPROC; p++) - if (p->p_uid == uap->who) + for (p = allproc; p != NULL; p = p->p_nxt) + if (p->p_uid == uap->who) { donice(p, uap->prio); + found++; + } break; default: u.u_error = EINVAL; - break; + return; } + if (found == 0) + u.u_error = ESRCH; } donice(p, n) @@ -125,22 +132,19 @@ donice(p, n) if (u.u_uid && u.u_ruid && u.u_uid != p->p_uid && u.u_ruid != p->p_uid) { - u.u_error = EACCES; + u.u_error = EPERM; return; } - n += NZERO; - if (n >= 2*NZERO) - n = 2*NZERO - 1; - if (n < 0) - n = 0; + if (n > PRIO_MAX) + n = PRIO_MAX; + if (n < PRIO_MIN) + n = PRIO_MIN; if (n < p->p_nice && !suser()) { u.u_error = EACCES; return; } p->p_nice = n; (void) setpri(p); - if (u.u_error == ESRCH) - u.u_error = 0; } setrlimit() @@ -151,6 +155,7 @@ setrlimit() } *uap = (struct a *)u.u_ap; struct rlimit alim; register struct rlimit *alimp; + extern unsigned maxdmap; if (uap->which >= RLIM_NLIMITS) { u.u_error = EINVAL; @@ -167,13 +172,17 @@ setrlimit() switch (uap->which) { case RLIMIT_DATA: - if (alim.rlim_cur > ctob(MAXDSIZ)) - alim.rlim_cur = ctob(MAXDSIZ); + if (alim.rlim_cur > maxdmap) + alim.rlim_cur = maxdmap; + if (alim.rlim_max > maxdmap) + alim.rlim_max = maxdmap; break; case RLIMIT_STACK: - if (alim.rlim_cur > ctob(MAXSSIZ)) - alim.rlim_cur = ctob(MAXSSIZ); + if (alim.rlim_cur > maxdmap) + alim.rlim_cur = maxdmap; + if (alim.rlim_max > maxdmap) + alim.rlim_max = maxdmap; break; } *alimp = alim;