Annotation of researchv10dc/lsys/os/sys4.c, revision 1.1.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: }
                    323: 
                    324: /* chown with file descriptor*/
                    325: fchown()
                    326: {      register struct file *fp;
                    327:        register struct a {
                    328:                int fd;
                    329:                int uid;
                    330:                int gid;
                    331:        } *uap;
                    332: 
                    333:        uap = (struct a *)u.u_ap;
                    334:        if((fp = getf(uap->fd)) == NULL) {
                    335:                u.u_error = EBADF;
                    336:                return;
                    337:        }
                    338:        chown1(fp->f_inode, uap->uid, uap->gid);
                    339: }
                    340: 
                    341: chown()
                    342: {
                    343:        register struct inode *ip;
                    344:        register struct a {
                    345:                char    *fname;
                    346:                int     uid;
                    347:                int     gid;
                    348:        } *uap;
                    349: 
                    350:        uap = (struct a *)u.u_ap;
                    351:        if ((ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1)) == NULL)
                    352:                return;
                    353:        chown1(ip, uap->uid, uap->gid);
                    354:        iput(ip);
                    355: }
                    356: 
                    357: chown1(ip, uid, gid)
                    358:        register struct inode *ip;
                    359: {
                    360: 
                    361:        if (accowner(ip) == 0)
                    362:                return;
                    363:        if(u.u_uid){
                    364:                if((ip->i_uid != uid) || !groupmember(gid)){
                    365:                        u.u_error = EPERM;
                    366:                        return;
                    367:                }
                    368:                if((ip->i_mode&ICONC)==0 && gid != ip->i_gid)
                    369:                        ip->i_mode &=~ ISGID;
                    370:        }
                    371:        ip->i_uid = uid;
                    372:        ip->i_gid = gid;
                    373:        ip->i_flag |= ICHG;
                    374: }
                    375: 
                    376: ssig()
                    377: {
                    378:        register int (*f)();
                    379:        struct a {
                    380:                int     signo;
                    381:                int     (*fun)();
                    382:        } *uap;
                    383:        register struct proc *p = u.u_procp;
                    384:        register a;
                    385:        register long sigmask;
                    386: 
                    387:        uap = (struct a *)u.u_ap;
                    388:        a = uap->signo & SIGNUMMASK;
                    389:        f = uap->fun;
                    390:        if(a<=0 || a>=NSIG || a==SIGKILL || a==SIGSTOP) {
                    391:                u.u_error = EINVAL;
                    392:                return;
                    393:        }
                    394:        u.u_r.r_val1 = (int)u.u_signal[a];
                    395:        sigmask = SIGMASK(a);
                    396:        (void) spl6();
                    397:        if (u.u_signal[a] == SIG_IGN)
                    398:                p->p_sig &= ~sigmask;           /* never to be seen again */
                    399:        u.u_signal[a] = f;
                    400:        if (f == SIG_DFL)
                    401:                P_SETDFL(p, sigmask);
                    402:        else if (f == SIG_IGN)
                    403:                P_SETIGN(p, sigmask);
                    404:        else if (f == SIG_HOLD)
                    405:                P_SETHOLD(p, sigmask);
                    406:        else
                    407:                P_SETCATCH(p, sigmask);
                    408:        (void) spl0();
                    409:        if (uap->signo & SIGDOPAUSE)
                    410:                pause();
                    411: }
                    412: 
                    413: kill()
                    414: {
                    415:        register struct a {
                    416:                int     pid;
                    417:                int     signo;
                    418:        } *uap;
                    419: 
                    420:        u.u_error = ESRCH;              /* default error */
                    421:        uap = (struct a *)u.u_ap;
                    422:        if (uap->signo > NSIG || uap->signo < 0) {
                    423:                u.u_error = EINVAL;
                    424:                return;
                    425:        }
                    426:        if (uap->pid == -1)
                    427:                killall(uap->signo);
                    428:        else if(uap->pid > 0)
                    429:                killproc(uap->pid, uap->signo);
                    430:        else if (uap->pid < 0)
                    431:                killpgrp(-uap->pid, uap->signo);
                    432:        else
                    433:                killpgrp(u.u_procp->p_pgrp, uap->signo);
                    434: }
                    435: 
                    436: /*
                    437:  *  kill a single process
                    438:  */
                    439: killproc(pid, sig)
                    440:        register int pid, sig;
                    441: {
                    442:        register struct proc *p;
                    443: 
                    444:        for (p = proc; p < procNPROC; p++)
                    445:                if (p->p_stat && p->p_pid == pid)
                    446:                        break;
                    447:        if (p == procNPROC)
                    448:                return;
                    449:        if (u.u_uid && u.u_uid != p->p_uid) {   /* no permission */
                    450:                u.u_error = EPERM;
                    451:                return;
                    452:        }
                    453:        if (sig != 0)                           /* real signal? */
                    454:                psignal(p, sig);                /* yes, send it */
                    455:        u.u_error = 0;
                    456: }
                    457: 
                    458: /*
                    459:  *  Kill all processes within a process group but not system processes.
                    460:  *  SIGCONT may be sent to any descendants (can you say hack?).
                    461:  */
                    462: killpgrp(pgrp, sig)
                    463:        register int pgrp, sig;
                    464: {
                    465:        register struct proc *p;
                    466: 
                    467:        for(p = proc; p < procNPROC; p++) {
                    468:                if(p->p_stat == 0)
                    469:                        continue;               /* non-existent */
                    470:                if (p->p_pgrp!=pgrp || p->p_flag&SSYS)
                    471:                        continue;
                    472:                if(u.u_uid != 0 && u.u_uid != p->p_uid &&
                    473:                    (sig != SIGCONT || !inferior(p)))
                    474:                        continue;
                    475:                u.u_error = 0;
                    476:                if (sig != 0)                           /* real signal? */
                    477:                        psignal(p, sig);                /* yes, send it */
                    478:        }
                    479: }
                    480: 
                    481: /*
                    482:  * Kill all processes except the system processes and the current process
                    483:  */
                    484: killall(sig)
                    485:        register int sig;
                    486: {
                    487:        register struct proc *p;
                    488: 
                    489:        if (!suser())
                    490:                return;
                    491:        for(p = proc; p < procNPROC; p++) {
                    492:                if(p->p_stat == 0)
                    493:                        continue;
                    494:                if (p->p_flag&SSYS || p==u.u_procp)
                    495:                        continue;
                    496:                u.u_error = 0;
                    497:                psignal(p, sig);
                    498:        }
                    499: }
                    500: 
                    501: times()
                    502: {
                    503:        register struct a {
                    504:                time_t  (*times)[4];
                    505:        } *uap;
                    506:        struct tms tms;
                    507: 
                    508:        tms.tms_utime = u.u_vm.vm_utime;
                    509:        tms.tms_stime = u.u_vm.vm_stime;
                    510:        tms.tms_cutime = u.u_cvm.vm_utime;
                    511:        tms.tms_cstime = u.u_cvm.vm_stime;
                    512:        uap = (struct a *)u.u_ap;
                    513:        if (copyout((caddr_t)&tms, (caddr_t)uap->times, sizeof(struct tms)) < 0)
                    514:                u.u_error = EFAULT;
                    515: }
                    516: 
                    517: profil()
                    518: {
                    519:        register struct a {
                    520:                short   *bufbase;
                    521:                unsigned bufsize;
                    522:                unsigned pcoffset;
                    523:                unsigned pcscale;
                    524:        } *uap;
                    525: 
                    526:        uap = (struct a *)u.u_ap;
                    527:        u.u_prof.pr_base = uap->bufbase;
                    528:        u.u_prof.pr_size = uap->bufsize;
                    529:        u.u_prof.pr_off = uap->pcoffset;
                    530:        u.u_prof.pr_scale = uap->pcscale;
                    531: }
                    532: 
                    533: /*
                    534:  * alarm clock signal
                    535:  */
                    536: alarm()
                    537: {
                    538:        register struct proc *p;
                    539:        register c;
                    540:        register struct a {
                    541:                int     deltat;
                    542:        } *uap;
                    543: 
                    544:        uap = (struct a *)u.u_ap;
                    545:        p = u.u_procp;
                    546:        c = p->p_clktim;
                    547:        if (uap->deltat > 65535L)
                    548:                uap->deltat = 65535;
                    549:        p->p_clktim = uap->deltat;
                    550:        u.u_r.r_val1 = c;
                    551: }
                    552: 
                    553: /*
                    554:  * indefinite wait.
                    555:  * no one should wakeup(&u)
                    556:  */
                    557: pause()
                    558: {
                    559: 
                    560:        for(;;)
                    561:                sleep((caddr_t)&u, PSLEP);
                    562: }
                    563: 
                    564: /*
                    565:  * mode mask for creation of files
                    566:  */
                    567: umask()
                    568: {
                    569:        register struct a {
                    570:                int     mask;
                    571:        } *uap;
                    572:        register t;
                    573: 
                    574:        uap = (struct a *)u.u_ap;
                    575:        t = u.u_cmask;
                    576:        u.u_cmask = uap->mask & 0777;
                    577:        u.u_r.r_val1 = t;
                    578: }
                    579: 
                    580: /*
                    581:  * Set IUPD and IACC times on file.
                    582:  * Can't set ICHG.
                    583:  */
                    584: utime()
                    585: {
                    586:        register struct a {
                    587:                char    *fname;
                    588:                time_t  *tptr;
                    589:        } *uap;
                    590:        register struct inode *ip;
                    591:        time_t tv[2];
                    592: 
                    593:        uap = (struct a *)u.u_ap;
                    594:        if ((ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1)) == NULL)
                    595:                return;
                    596:        if (accowner(ip) == 0) {
                    597:                iput(ip);
                    598:                return;
                    599:        }
                    600:        if (copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof(tv))) {
                    601:                u.u_error = EFAULT;
                    602:        } else {
                    603:                ip->i_flag |= IACC|IUPD|ICHG;
                    604:                iupdat(ip, &tv[0], &tv[1], 0);
                    605:        }
                    606:        iput(ip);
                    607: }
                    608: 
                    609: /*
                    610:  * Setpgrp on specified process and its descendants.
                    611:  * Pid of zero implies current process.
                    612:  * Pgrp -1 is getpgrp system call returning
                    613:  * current process group.
                    614:  */
                    615: setpgrp()
                    616: {
                    617:        register struct proc *top;
                    618:        register struct a {
                    619:                int     pid;
                    620:                int     pgrp;
                    621:        } *uap;
                    622: 
                    623:        uap = (struct a *)u.u_ap;
                    624:        uap->pid = (short)uap->pid;     /* else 0x10000 would make pgrp 0 */
                    625:        uap->pgrp = (short)uap->pgrp;
                    626:        if (uap->pid == 0)
                    627:                top = u.u_procp;
                    628:        else {
                    629:                top = pfind(uap->pid);
                    630:                if (top == 0) {
                    631:                        u.u_error = ESRCH;
                    632:                        return;
                    633:                }
                    634:        }
                    635:        if (uap->pgrp == 0 && !suser())
                    636:                return;
                    637: 
                    638:        if (uap->pgrp < 0) {
                    639:                u.u_r.r_val1 = top->p_pgrp;
                    640:                return;
                    641:        }
                    642:        if (top->p_uid != u.u_uid && u.u_uid && !inferior(top))
                    643:                u.u_error = EPERM;
                    644:        else
                    645:                top->p_pgrp = uap->pgrp;
                    646: }
                    647: 
                    648: spgrp(top, npgrp)
                    649: register struct proc *top;
                    650: {
                    651:        register struct proc *pp, *p;
                    652:        int f = 0;
                    653: 
                    654:        for (p = top; npgrp == -1 || u.u_uid == p->p_uid ||
                    655:            !u.u_uid || inferior(p); p = pp) {
                    656:                if (npgrp == -1) {
                    657: #define        bit(a)  (1<<(a-1))
                    658:                        p->p_sig &= ~(bit(SIGTSTP)|bit(SIGTTIN)|bit(SIGTTOU));
                    659:                } else
                    660:                        p->p_pgrp = npgrp;
                    661:                f++;
                    662:                /*
                    663:                 * Search for children.
                    664:                 */
                    665:                for (pp = proc; pp < procNPROC; pp++)
                    666:                        if (pp->p_stat != 0 && pp->p_pptr == p)
                    667:                                goto cont;
                    668:                /*
                    669:                 * Search for siblings.
                    670:                 */
                    671:                for (; p != top; p = p->p_pptr)
                    672:                        for (pp = p + 1; pp < procNPROC; pp++)
                    673:                                if (pp->p_stat != 0 && pp->p_pptr == p->p_pptr)
                    674:                                        goto cont;
                    675:                break;
                    676:        cont:
                    677:                ;
                    678:        }
                    679:        return (f);
                    680: }
                    681: 
                    682: /*
                    683:  * Is p an inferior of the current process?
                    684:  */
                    685: inferior(p)
                    686: register struct proc *p;
                    687: {
                    688: 
                    689:        for (; p != u.u_procp; p = p->p_pptr)
                    690:                if (p < &proc[SYSPIDS])
                    691:                        return (0);
                    692:        return (1);
                    693: }
                    694: 
                    695: sysboot()
                    696: {
                    697:        register struct a {
                    698:                int     opt;
                    699:        };
                    700: 
                    701:        if (suser())
                    702:                boot(((struct a *)u.u_ap)->opt);
                    703: }
                    704: 
                    705: /*
                    706:  * lock user into core as much
                    707:  * as possible. swapping may still
                    708:  * occur if core grows.
                    709:  */
                    710: syslock()
                    711: {
                    712:        register struct proc *p;
                    713:        register struct a {
                    714:                int     flag;
                    715:        } *uap;
                    716: 
                    717:        uap = (struct a *)u.u_ap;
                    718:        if(suser()) {
                    719:                p = u.u_procp;
                    720:                p->p_flag &= ~SULOCK;
                    721:                if(uap->flag)
                    722:                        p->p_flag |= SULOCK;
                    723:        }
                    724: }
                    725: 
                    726: /*
                    727:  * nap for n clock ticks
                    728:  */
                    729: #define MAXNAP 120
                    730: nap()
                    731: {
                    732:         register struct a {
                    733:                 int     nticks;
                    734:         } *uap;
                    735:         register int n;
                    736: 
                    737:         uap = (struct a *)u.u_ap;
                    738:         n = uap->nticks;
                    739:         if (n < 0)
                    740:                 n = 0;
                    741:         if (n > MAXNAP)
                    742:                 n = MAXNAP;
                    743:         delay (n);
                    744: }
                    745: 
                    746: /*
                    747:  * get/set user's login name
                    748:  */
                    749: 
                    750: getlogname()
                    751: {
                    752:        register struct a {
                    753:                char *name;
                    754:                int flag;
                    755:        } *uap;
                    756: 
                    757:        uap = (struct a *)u.u_ap;
                    758:        if (uap->flag == 0) {
                    759:                if (copyout((caddr_t)u.u_logname, (caddr_t)uap->name, sizeof(u.u_logname)) < 0)
                    760:                        u.u_error = EFAULT;
                    761:                return;
                    762:        }
                    763:        if (suser() == 0)
                    764:                return;
                    765:        if (copyin((caddr_t)uap->name, (caddr_t)u.u_logname, sizeof(u.u_logname)))
                    766:                u.u_error = EFAULT;
                    767: }

unix.superglobalmegacorp.com

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