-/* 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.
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:
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()
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:
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)
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()
} *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;
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;