Annotation of researchv10no/sys/os/sys4.c, revision 1.1

1.1     ! root        1: /*     sys4.c  4.10    81/07/04        */
        !             2: 
        !             3: #include "sys/param.h"
        !             4: #include "sys/systm.h"
        !             5: #include "sys/user.h"
        !             6: #include "sys/inode.h"
        !             7: #include "sys/proc.h"
        !             8: #include "sys/clock.h"
        !             9: #include "sys/timeb.h"
        !            10: #include "sys/times.h"
        !            11: #include "sys/file.h"
        !            12: 
        !            13: /*
        !            14:  * Everything in this file is a routine implementing a system call.
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  * return the current time (old-style entry)
        !            19:  */
        !            20: gtime()
        !            21: {
        !            22:        u.u_r.r_time = time;
        !            23:        clkcheck();
        !            24: }
        !            25: 
        !            26: /*
        !            27:  * New time entry-- return TOD with milliseconds, timezone,
        !            28:  * DST flag
        !            29:  */
        !            30: ftime()
        !            31: {
        !            32:        register struct a {
        !            33:                struct  timeb   *tp;
        !            34:        } *uap;
        !            35:        struct timeb t;
        !            36:        register unsigned ms;
        !            37:        extern int timezone, dstflag;
        !            38: 
        !            39:        uap = (struct a *)u.u_ap;
        !            40:        (void) spl7();
        !            41:        t.time = time;
        !            42:        ms = lbolt;
        !            43:        (void) spl0();
        !            44:        if (ms > HZ) {
        !            45:                ms -= HZ;
        !            46:                t.time++;
        !            47:        }
        !            48:        t.millitm = (1000*ms)/HZ;
        !            49:        t.timezone = timezone;
        !            50:        t.dstflag = dstflag;
        !            51:        if (copyout((caddr_t)&t, (caddr_t)uap->tp, sizeof(t)))
        !            52:                u.u_error = EFAULT;
        !            53:        clkcheck();
        !            54: }
        !            55: 
        !            56: /*
        !            57:  * Set the time
        !            58:  */
        !            59: stime()
        !            60: {
        !            61:        register struct a {
        !            62:                time_t  time;
        !            63:        } *uap;
        !            64:        extern time_t bootime;
        !            65: 
        !            66:        uap = (struct a *)u.u_ap;
        !            67:        if(suser()) {
        !            68:                bootime += uap->time - time;    /* silly */
        !            69:                time = uap->time;
        !            70:                clkset();
        !            71:        }
        !            72: }
        !            73: 
        !            74: setuid()
        !            75: {
        !            76:        register uid;
        !            77:        register struct a {
        !            78:                int     uid;
        !            79:        } *uap;
        !            80: 
        !            81:        uap = (struct a *)u.u_ap;
        !            82:        uid = uap->uid;
        !            83:        if(u.u_ruid == uid || u.u_uid == uid || suser()) {
        !            84:                u.u_uid = uid;
        !            85:                u.u_procp->p_uid = uid;
        !            86:                u.u_ruid = uid;
        !            87:        }
        !            88: }
        !            89: 
        !            90: getuid()
        !            91: {
        !            92: 
        !            93:        u.u_r.r_val1 = u.u_ruid;
        !            94:        u.u_r.r_val2 = u.u_uid;
        !            95: }
        !            96: 
        !            97: setruid()
        !            98: {
        !            99:        register uid;
        !           100:        register struct a {
        !           101:                int     uid;
        !           102:        } *uap;
        !           103: 
        !           104:        uap = (struct a *)u.u_ap;
        !           105:        uid = uap->uid;
        !           106:        if(suser())
        !           107:                u.u_ruid = uid;
        !           108: }
        !           109: 
        !           110: setgid()
        !           111: {
        !           112:        register gid;
        !           113:        register struct a {
        !           114:                int     gid;
        !           115:        } *uap;
        !           116: 
        !           117:        uap = (struct a *)u.u_ap;
        !           118:        gid = uap->gid;
        !           119:        if(u.u_rgid == gid || u.u_gid == gid || suser()) {
        !           120:                u.u_gid = gid;
        !           121:                u.u_rgid = gid;
        !           122:        }
        !           123: }
        !           124: 
        !           125: getgid()
        !           126: {
        !           127: 
        !           128:        u.u_r.r_val1 = u.u_rgid;
        !           129:        u.u_r.r_val2 = u.u_gid;
        !           130: }
        !           131: 
        !           132: setgroups()
        !           133: {
        !           134:        register struct a {
        !           135:                u_int   gidsetsize;
        !           136:                short   *gidset;
        !           137:        } *uap = (struct a *)u.u_ap;
        !           138:        register short *gp;
        !           139: 
        !           140:        if (!suser())
        !           141:                return;
        !           142:        if (uap->gidsetsize > sizeof u.u_groups / sizeof u.u_groups[0]) {
        !           143:                u.u_error = EINVAL;
        !           144:                return;
        !           145:        }
        !           146:        if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_groups,
        !           147:                        uap->gidsetsize * sizeof u.u_groups[0]) < 0) {
        !           148:                u.u_error = EFAULT;
        !           149:                return;
        !           150:        }
        !           151:        for (gp = &u.u_groups[uap->gidsetsize] ; gp < &u.u_groups[NGROUPS]; gp++)
        !           152:                *gp = NOGROUP;
        !           153: }
        !           154: 
        !           155: /*
        !           156:  * Check if gid is a member of the group set.
        !           157:  */
        !           158: groupmember(gid)
        !           159:        short gid;
        !           160: {
        !           161:        register short *gp;
        !           162: 
        !           163:        if (u.u_gid == gid)
        !           164:                return (1);
        !           165:        for (gp = u.u_groups; gp < &u.u_groups[NGROUPS] && *gp != NOGROUP; gp++)
        !           166:                if (*gp == gid)
        !           167:                        return (1);
        !           168:        return (0);
        !           169: }
        !           170: 
        !           171: getgroups()
        !           172: {
        !           173:        register struct a {
        !           174:                u_int   gidsetsize;
        !           175:                short   *gidset;
        !           176:        } *uap = (struct a *)u.u_ap;
        !           177:        register short *gp;
        !           178: 
        !           179:        for (gp = &u.u_groups[NGROUPS]; gp > u.u_groups; gp--)
        !           180:                if (gp[-1] != NOGROUP)
        !           181:                        break;
        !           182:        if (uap->gidsetsize < gp - u.u_groups) {
        !           183:                u.u_error = EINVAL;
        !           184:                return;
        !           185:        }
        !           186:        uap->gidsetsize = gp - u.u_groups;
        !           187:        if (copyout((caddr_t)u.u_groups, (caddr_t)uap->gidset,
        !           188:                        uap->gidsetsize * sizeof u.u_groups[0]) < 0) {
        !           189:                u.u_error = EFAULT;
        !           190:                return;
        !           191:        }
        !           192:        u.u_r.r_val1 = uap->gidsetsize;
        !           193: }
        !           194: 
        !           195: getpid()
        !           196: {
        !           197:        u.u_r.r_val1 = u.u_procp->p_pid;
        !           198:        u.u_r.r_val2 = u.u_procp->p_ppid;
        !           199: }
        !           200: 
        !           201: sync()
        !           202: {
        !           203: 
        !           204:        update();
        !           205: }
        !           206: 
        !           207: nice()
        !           208: {
        !           209:        register n;
        !           210:        register struct a {
        !           211:                int     niceness;
        !           212:        } *uap;
        !           213: 
        !           214:        uap = (struct a *)u.u_ap;
        !           215:        n = uap->niceness + u.u_procp->p_nice;
        !           216:        if(n >= 2*NZERO)
        !           217:                n = 2*NZERO -1;
        !           218:        if(n < 0)
        !           219:                n = 0;
        !           220:        if (n < u.u_procp->p_nice && !suser())
        !           221:                return;
        !           222:        u.u_procp->p_nice = n;
        !           223: }
        !           224: 
        !           225: /*
        !           226:  * Unlink system call.
        !           227:  * Hard to avoid races here, especially
        !           228:  * in unlinking directories.
        !           229:  */
        !           230: unlink()
        !           231: {
        !           232:        struct a {
        !           233:                char    *fname;
        !           234:        };
        !           235:        struct argnamei nmarg;
        !           236: 
        !           237:        nmarg = nilargnamei;
        !           238:        nmarg.flag = NI_DEL;
        !           239:        (void) namei(((struct a *)u.u_ap)->fname, SEGUDATA, &nmarg, 0);
        !           240: }
        !           241: chdir()
        !           242: {
        !           243:        chdirec(&u.u_cdir);
        !           244: }
        !           245: 
        !           246: chroot()
        !           247: {
        !           248:        if (suser())
        !           249:                chdirec(&u.u_rdir);
        !           250: }
        !           251: 
        !           252: chdirec(ipp)
        !           253: register struct inode **ipp;
        !           254: {
        !           255:        register struct inode *ip;
        !           256:        struct a {
        !           257:                char    *fname;
        !           258:        };
        !           259: 
        !           260:        ip = namei(((struct a *)u.u_ap)->fname, SEGUDATA, &nilargnamei, 1);
        !           261:        if(ip == NULL)
        !           262:                return;
        !           263:        if((ip->i_mode&IFMT) != IFDIR) {
        !           264:                u.u_error = ENOTDIR;
        !           265:                goto bad;
        !           266:        }
        !           267:        if(access(ip, IEXEC))
        !           268:                goto bad;
        !           269:        prele(ip);
        !           270:        if (*ipp) {
        !           271:                plock(*ipp);
        !           272:                iput(*ipp);
        !           273:        }
        !           274:        *ipp = ip;
        !           275:        return;
        !           276: 
        !           277: bad:
        !           278:        iput(ip);
        !           279: }
        !           280: 
        !           281: fchmod()
        !           282: {      register struct file *fp;
        !           283:        register struct a {
        !           284:                int fd;
        !           285:                int fmode;
        !           286:        } *uap;
        !           287: 
        !           288:        uap = (struct a *)u.u_ap;
        !           289:        if((fp = getf(uap->fd)) == NULL) {
        !           290:                u.u_error = EBADF;
        !           291:                return;
        !           292:        }
        !           293:        chmod1(fp->f_inode, uap->fmode);
        !           294: }
        !           295: 
        !           296: chmod()
        !           297: {
        !           298:        register struct inode *ip;
        !           299:        register struct a {
        !           300:                char    *fname;
        !           301:                int     fmode;
        !           302:        } *uap;
        !           303: 
        !           304:        uap = (struct a *)u.u_ap;
        !           305:        if ((ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1)) == NULL)
        !           306:                return;
        !           307:        chmod1(ip, uap->fmode);
        !           308:        iput(ip);
        !           309: }
        !           310: 
        !           311: chmod1(ip, mode)
        !           312: register struct inode *ip;
        !           313: {
        !           314: 
        !           315:        if (accowner(ip) == 0)
        !           316:                return;
        !           317:        ip->i_mode &= ~07777;
        !           318:        if (!(mode&ICONC) && u.u_uid!=0 && !groupmember(ip->i_gid))
        !           319:                mode &= ~ISGID;
        !           320:        ip->i_mode |= mode&07777;
        !           321:        ip->i_flag |= ICHG;
        !           322:        iupdat(ip, &time, &time, 0);
        !           323: }
        !           324: 
        !           325: /* chown with file descriptor*/
        !           326: fchown()
        !           327: {      register struct file *fp;
        !           328:        register struct a {
        !           329:                int fd;
        !           330:                int uid;
        !           331:                int gid;
        !           332:        } *uap;
        !           333: 
        !           334:        uap = (struct a *)u.u_ap;
        !           335:        if((fp = getf(uap->fd)) == NULL) {
        !           336:                u.u_error = EBADF;
        !           337:                return;
        !           338:        }
        !           339:        chown1(fp->f_inode, uap->uid, uap->gid);
        !           340: }
        !           341: 
        !           342: chown()
        !           343: {
        !           344:        register struct inode *ip;
        !           345:        register struct a {
        !           346:                char    *fname;
        !           347:                int     uid;
        !           348:                int     gid;
        !           349:        } *uap;
        !           350: 
        !           351:        uap = (struct a *)u.u_ap;
        !           352:        if ((ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1)) == NULL)
        !           353:                return;
        !           354:        chown1(ip, uap->uid, uap->gid);
        !           355:        iput(ip);
        !           356: }
        !           357: 
        !           358: chown1(ip, uid, gid)
        !           359:        register struct inode *ip;
        !           360: {
        !           361: 
        !           362:        if (accowner(ip) == 0)
        !           363:                return;
        !           364:        if(u.u_uid){
        !           365:                if((ip->i_uid != uid) || !groupmember(gid)){
        !           366:                        u.u_error = EPERM;
        !           367:                        return;
        !           368:                }
        !           369:                if((ip->i_mode&ICONC)==0 && gid != ip->i_gid)
        !           370:                        ip->i_mode &=~ ISGID;
        !           371:        }
        !           372:        ip->i_uid = uid;
        !           373:        ip->i_gid = gid;
        !           374:        ip->i_flag |= ICHG;
        !           375:        iupdat(ip, &time, &time, 0);
        !           376: }
        !           377: 
        !           378: ssig()
        !           379: {
        !           380:        register int (*f)();
        !           381:        struct a {
        !           382:                int     signo;
        !           383:                int     (*fun)();
        !           384:        } *uap;
        !           385:        register struct proc *p = u.u_procp;
        !           386:        register a;
        !           387:        register long sigmask;
        !           388: 
        !           389:        uap = (struct a *)u.u_ap;
        !           390:        a = uap->signo & SIGNUMMASK;
        !           391:        f = uap->fun;
        !           392:        if(a<=0 || a>=NSIG || a==SIGKILL || a==SIGSTOP) {
        !           393:                u.u_error = EINVAL;
        !           394:                return;
        !           395:        }
        !           396:        u.u_r.r_val1 = (int)u.u_signal[a];
        !           397:        sigmask = SIGMASK(a);
        !           398:        (void) spl6();
        !           399:        if (u.u_signal[a] == SIG_IGN)
        !           400:                p->p_sig &= ~sigmask;           /* never to be seen again */
        !           401:        u.u_signal[a] = f;
        !           402:        if (f == SIG_DFL)
        !           403:                P_SETDFL(p, sigmask);
        !           404:        else if (f == SIG_IGN)
        !           405:                P_SETIGN(p, sigmask);
        !           406:        else if (f == SIG_HOLD)
        !           407:                P_SETHOLD(p, sigmask);
        !           408:        else
        !           409:                P_SETCATCH(p, sigmask);
        !           410:        (void) spl0();
        !           411:        if (uap->signo & SIGDOPAUSE)
        !           412:                pause();
        !           413: }
        !           414: 
        !           415: kill()
        !           416: {
        !           417:        register struct a {
        !           418:                int     pid;
        !           419:                int     signo;
        !           420:        } *uap;
        !           421: 
        !           422:        u.u_error = ESRCH;              /* default error */
        !           423:        uap = (struct a *)u.u_ap;
        !           424:        if (uap->signo > NSIG || uap->signo < 0) {
        !           425:                u.u_error = EINVAL;
        !           426:                return;
        !           427:        }
        !           428:        if (uap->pid == -1)
        !           429:                killall(uap->signo);
        !           430:        else if(uap->pid > 0)
        !           431:                killproc(uap->pid, uap->signo);
        !           432:        else if (uap->pid < 0)
        !           433:                killpgrp(-uap->pid, uap->signo);
        !           434:        else
        !           435:                killpgrp(u.u_procp->p_pgrp, uap->signo);
        !           436: }
        !           437: 
        !           438: /*
        !           439:  *  kill a single process
        !           440:  */
        !           441: killproc(pid, sig)
        !           442:        register int pid, sig;
        !           443: {
        !           444:        register struct proc *p;
        !           445: 
        !           446:        for (p = proc; p < procNPROC; p++)
        !           447:                if (p->p_stat && p->p_pid == pid)
        !           448:                        break;
        !           449:        if (p == procNPROC)
        !           450:                return;
        !           451:        if (u.u_uid && u.u_uid != p->p_uid) {   /* no permission */
        !           452:                u.u_error = EPERM;
        !           453:                return;
        !           454:        }
        !           455:        if (sig != 0)                           /* real signal? */
        !           456:                psignal(p, sig);                /* yes, send it */
        !           457:        u.u_error = 0;
        !           458: }
        !           459: 
        !           460: /*
        !           461:  *  Kill all processes within a process group but not system processes.
        !           462:  *  SIGCONT may be sent to any descendants (can you say hack?).
        !           463:  */
        !           464: killpgrp(pgrp, sig)
        !           465:        register int pgrp, sig;
        !           466: {
        !           467:        register struct proc *p;
        !           468: 
        !           469:        for(p = proc; p < procNPROC; p++) {
        !           470:                if(p->p_stat == 0)
        !           471:                        continue;               /* non-existent */
        !           472:                if (p->p_pgrp!=pgrp || p->p_flag&SSYS)
        !           473:                        continue;
        !           474:                if(u.u_uid != 0 && u.u_uid != p->p_uid &&
        !           475:                    (sig != SIGCONT || !inferior(p)))
        !           476:                        continue;
        !           477:                u.u_error = 0;
        !           478:                if (sig != 0)                           /* real signal? */
        !           479:                        psignal(p, sig);                /* yes, send it */
        !           480:        }
        !           481: }
        !           482: 
        !           483: /*
        !           484:  * Kill all processes except the system processes and the current process
        !           485:  */
        !           486: killall(sig)
        !           487:        register int sig;
        !           488: {
        !           489:        register struct proc *p;
        !           490: 
        !           491:        if (!suser())
        !           492:                return;
        !           493:        for(p = proc; p < procNPROC; p++) {
        !           494:                if(p->p_stat == 0)
        !           495:                        continue;
        !           496:                if (p->p_flag&SSYS || p==u.u_procp)
        !           497:                        continue;
        !           498:                u.u_error = 0;
        !           499:                psignal(p, sig);
        !           500:        }
        !           501: }
        !           502: 
        !           503: times()
        !           504: {
        !           505:        register struct a {
        !           506:                time_t  (*times)[4];
        !           507:        } *uap;
        !           508:        struct tms tms;
        !           509: 
        !           510:        tms.tms_utime = u.u_vm.vm_utime;
        !           511:        tms.tms_stime = u.u_vm.vm_stime;
        !           512:        tms.tms_cutime = u.u_cvm.vm_utime;
        !           513:        tms.tms_cstime = u.u_cvm.vm_stime;
        !           514:        uap = (struct a *)u.u_ap;
        !           515:        if (copyout((caddr_t)&tms, (caddr_t)uap->times, sizeof(struct tms)) < 0)
        !           516:                u.u_error = EFAULT;
        !           517: }
        !           518: 
        !           519: profil()
        !           520: {
        !           521:        register struct a {
        !           522:                short   *bufbase;
        !           523:                unsigned bufsize;
        !           524:                unsigned pcoffset;
        !           525:                unsigned pcscale;
        !           526:        } *uap;
        !           527: 
        !           528:        uap = (struct a *)u.u_ap;
        !           529:        u.u_prof.pr_base = uap->bufbase;
        !           530:        u.u_prof.pr_size = uap->bufsize;
        !           531:        u.u_prof.pr_off = uap->pcoffset;
        !           532:        u.u_prof.pr_scale = uap->pcscale;
        !           533: }
        !           534: 
        !           535: /*
        !           536:  * alarm clock signal
        !           537:  */
        !           538: alarm()
        !           539: {
        !           540:        register struct proc *p;
        !           541:        register c;
        !           542:        register struct a {
        !           543:                int     deltat;
        !           544:        } *uap;
        !           545: 
        !           546:        uap = (struct a *)u.u_ap;
        !           547:        p = u.u_procp;
        !           548:        c = p->p_clktim;
        !           549:        if (uap->deltat > 65535L)
        !           550:                uap->deltat = 65535;
        !           551:        p->p_clktim = uap->deltat;
        !           552:        u.u_r.r_val1 = c;
        !           553: }
        !           554: 
        !           555: /*
        !           556:  * indefinite wait.
        !           557:  * no one should wakeup(&u)
        !           558:  */
        !           559: pause()
        !           560: {
        !           561: 
        !           562:        for(;;)
        !           563:                sleep((caddr_t)&u, PSLEP);
        !           564: }
        !           565: 
        !           566: /*
        !           567:  * mode mask for creation of files
        !           568:  */
        !           569: umask()
        !           570: {
        !           571:        register struct a {
        !           572:                int     mask;
        !           573:        } *uap;
        !           574:        register t;
        !           575: 
        !           576:        uap = (struct a *)u.u_ap;
        !           577:        t = u.u_cmask;
        !           578:        u.u_cmask = uap->mask & 0777;
        !           579:        u.u_r.r_val1 = t;
        !           580: }
        !           581: 
        !           582: /*
        !           583:  * Set IUPD and IACC times on file.
        !           584:  * Can't set ICHG.
        !           585:  */
        !           586: utime()
        !           587: {
        !           588:        register struct a {
        !           589:                char    *fname;
        !           590:                time_t  *tptr;
        !           591:        } *uap;
        !           592:        register struct inode *ip;
        !           593:        time_t tv[2];
        !           594: 
        !           595:        uap = (struct a *)u.u_ap;
        !           596:        if ((ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1)) == NULL)
        !           597:                return;
        !           598:        if (accowner(ip) == 0) {
        !           599:                iput(ip);
        !           600:                return;
        !           601:        }
        !           602:        if (copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof(tv))) {
        !           603:                u.u_error = EFAULT;
        !           604:        } else {
        !           605:                ip->i_flag |= IACC|IUPD|ICHG;
        !           606:                iupdat(ip, &tv[0], &tv[1], 0);
        !           607:        }
        !           608:        iput(ip);
        !           609: }
        !           610: 
        !           611: /*
        !           612:  * Setpgrp on specified process and its descendants.
        !           613:  * Pid of zero implies current process.
        !           614:  * Pgrp -1 is getpgrp system call returning
        !           615:  * current process group.
        !           616:  */
        !           617: setpgrp()
        !           618: {
        !           619:        register struct proc *top;
        !           620:        register struct a {
        !           621:                int     pid;
        !           622:                int     pgrp;
        !           623:        } *uap;
        !           624: 
        !           625:        uap = (struct a *)u.u_ap;
        !           626:        uap->pid = (short)uap->pid;     /* else 0x10000 would make pgrp 0 */
        !           627:        uap->pgrp = (short)uap->pgrp;
        !           628:        if (uap->pid == 0)
        !           629:                top = u.u_procp;
        !           630:        else {
        !           631:                top = pfind(uap->pid);
        !           632:                if (top == 0) {
        !           633:                        u.u_error = ESRCH;
        !           634:                        return;
        !           635:                }
        !           636:        }
        !           637:        if (uap->pgrp == 0 && !suser())
        !           638:                return;
        !           639: 
        !           640:        if (uap->pgrp < 0) {
        !           641:                u.u_r.r_val1 = top->p_pgrp;
        !           642:                return;
        !           643:        }
        !           644:        if (top->p_uid != u.u_uid && u.u_uid && !inferior(top))
        !           645:                u.u_error = EPERM;
        !           646:        else
        !           647:                top->p_pgrp = uap->pgrp;
        !           648: }
        !           649: 
        !           650: spgrp(top, npgrp)
        !           651: register struct proc *top;
        !           652: {
        !           653:        register struct proc *pp, *p;
        !           654:        int f = 0;
        !           655: 
        !           656:        for (p = top; npgrp == -1 || u.u_uid == p->p_uid ||
        !           657:            !u.u_uid || inferior(p); p = pp) {
        !           658:                if (npgrp == -1) {
        !           659: #define        bit(a)  (1<<(a-1))
        !           660:                        p->p_sig &= ~(bit(SIGTSTP)|bit(SIGTTIN)|bit(SIGTTOU));
        !           661:                } else
        !           662:                        p->p_pgrp = npgrp;
        !           663:                f++;
        !           664:                /*
        !           665:                 * Search for children.
        !           666:                 */
        !           667:                for (pp = proc; pp < procNPROC; pp++)
        !           668:                        if (pp->p_stat != 0 && pp->p_pptr == p)
        !           669:                                goto cont;
        !           670:                /*
        !           671:                 * Search for siblings.
        !           672:                 */
        !           673:                for (; p != top; p = p->p_pptr)
        !           674:                        for (pp = p + 1; pp < procNPROC; pp++)
        !           675:                                if (pp->p_stat != 0 && pp->p_pptr == p->p_pptr)
        !           676:                                        goto cont;
        !           677:                break;
        !           678:        cont:
        !           679:                ;
        !           680:        }
        !           681:        return (f);
        !           682: }
        !           683: 
        !           684: /*
        !           685:  * Is p an inferior of the current process?
        !           686:  */
        !           687: inferior(p)
        !           688: register struct proc *p;
        !           689: {
        !           690: 
        !           691:        for (; p != u.u_procp; p = p->p_pptr)
        !           692:                if (p < &proc[SYSPIDS])
        !           693:                        return (0);
        !           694:        return (1);
        !           695: }
        !           696: 
        !           697: sysboot()
        !           698: {
        !           699:        register struct a {
        !           700:                int     opt;
        !           701:        };
        !           702: 
        !           703:        if (suser())
        !           704:                boot(((struct a *)u.u_ap)->opt);
        !           705: }
        !           706: 
        !           707: /*
        !           708:  * lock user into core as much
        !           709:  * as possible. swapping may still
        !           710:  * occur if core grows.
        !           711:  */
        !           712: syslock()
        !           713: {
        !           714:        register struct proc *p;
        !           715:        register struct a {
        !           716:                int     flag;
        !           717:        } *uap;
        !           718: 
        !           719:        uap = (struct a *)u.u_ap;
        !           720:        if(suser()) {
        !           721:                p = u.u_procp;
        !           722:                p->p_flag &= ~SULOCK;
        !           723:                if(uap->flag)
        !           724:                        p->p_flag |= SULOCK;
        !           725:        }
        !           726: }
        !           727: 
        !           728: /*
        !           729:  * nap for n clock ticks
        !           730:  */
        !           731: #define MAXNAP 120
        !           732: nap()
        !           733: {
        !           734:         register struct a {
        !           735:                 int     nticks;
        !           736:         } *uap;
        !           737:         register int n;
        !           738: 
        !           739:         uap = (struct a *)u.u_ap;
        !           740:         n = uap->nticks;
        !           741:         if (n < 0)
        !           742:                 n = 0;
        !           743:         if (n > MAXNAP)
        !           744:                 n = MAXNAP;
        !           745:         delay (n);
        !           746: }
        !           747: 
        !           748: /*
        !           749:  * get/set user's login name
        !           750:  */
        !           751: 
        !           752: getlogname()
        !           753: {
        !           754:        register struct a {
        !           755:                char *name;
        !           756:                int flag;
        !           757:        } *uap;
        !           758: 
        !           759:        uap = (struct a *)u.u_ap;
        !           760:        if (uap->flag == 0) {
        !           761:                if (copyout((caddr_t)u.u_logname, (caddr_t)uap->name, sizeof(u.u_logname)) < 0)
        !           762:                        u.u_error = EFAULT;
        !           763:                return;
        !           764:        }
        !           765:        if (suser() == 0)
        !           766:                return;
        !           767:        if (copyin((caddr_t)uap->name, (caddr_t)u.u_logname, sizeof(u.u_logname)))
        !           768:                u.u_error = EFAULT;
        !           769: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.