BSD 4_3 release
[unix-history] / usr / src / sys / sys / kern_resource.c
index 25ec549..5e87064 100644 (file)
@@ -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.
 
 /*
  * Resource controls and accounting.
@@ -23,9 +29,8 @@ getpriority()
                int     who;
        } *uap = (struct a *)u.u_ap;
        register struct proc *p;
                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:
        switch (uap->which) {
 
        case PRIO_PROCESS:
@@ -34,44 +39,39 @@ getpriority()
                else
                        p = pfind(uap->who);
                if (p == 0)
                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;
                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 &&
                        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;
                }
                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 &&
                        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;
 
        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()
 }
 
 setpriority()
@@ -82,8 +82,8 @@ setpriority()
                int     prio;
        } *uap = (struct a *)u.u_ap;
        register struct proc *p;
                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:
        switch (uap->which) {
 
        case PRIO_PROCESS:
@@ -92,30 +92,37 @@ setpriority()
                else
                        p = pfind(uap->who);
                if (p == 0)
                else
                        p = pfind(uap->who);
                if (p == 0)
-                       return;
+                       break;
                donice(p, uap->prio);
                donice(p, uap->prio);
+               found++;
                break;
 
        case PRIO_PGRP:
                if (uap->who == 0)
                        uap->who = u.u_procp->p_pgrp;
                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);
                                donice(p, uap->prio);
+                               found++;
+                       }
                break;
 
        case PRIO_USER:
                if (uap->who == 0)
                        uap->who = u.u_uid;
                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);
                                donice(p, uap->prio);
+                               found++;
+                       }
                break;
 
        default:
                u.u_error = EINVAL;
                break;
 
        default:
                u.u_error = EINVAL;
-               break;
+               return;
        }
        }
+       if (found == 0)
+               u.u_error = ESRCH;
 }
 
 donice(p, n)
 }
 
 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) {
 
        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;
        }
                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 (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()
 }
 
 setrlimit()
@@ -151,6 +155,7 @@ setrlimit()
        } *uap = (struct a *)u.u_ap;
        struct rlimit alim;
        register struct rlimit *alimp;
        } *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;
 
        if (uap->which >= RLIM_NLIMITS) {
                u.u_error = EINVAL;
@@ -167,13 +172,17 @@ setrlimit()
        switch (uap->which) {
 
        case RLIMIT_DATA:
        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:
                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;
                break;
        }
        *alimp = alim;