3400: 3401: /* 3402: * Everything in this file is a routine implementing a system call. 3403: * 3404: */ 3405: 3406: #include "../param.h" 3407: #include "../user.h" 3408: #include "../reg.h" 3409: #include "../inode.h" 3410: #include "../systm.h" 3411: #include "../proc.h" 3412: 3413: getswit() 3414: { 3415: 3416: u.u_ar0[R0] = SW->integ; 3417: } 3418: /* --------------------------- */ 3419: 3420: gtime() 3421: { 3422: 3423: u.u_ar0[R0] = time[0]; 3424: u.u_ar0[R1] = time[1]; 3425: } 3426: /* --------------------------- */ 3427: 3428: stime() 3429: { 3430: 3431: if(suser()) { 3432: time[0] = u.u_ar0[R0]; 3433: time[1] = u.u_ar0[R1]; 3434: wakeup(tout); 3435: } 3436: } 3437: /* --------------------------- */ 3438: 3439: setuid() 3440: { 3441: register uid; 3442: 3443: uid = u.u_ar0[R0].lobyte; 3444: if(u.u_ruid == uid.lobyte || suser()) { 3445: u.u_uid = uid; 3446: u.u_procp->p_uid = uid; 3447: u.u_ruid = uid; 3448: } 3449: } 3450: /* --------------------------- */ 3451: 3452: getuid() 3453: { 3454: 3455: u.u_ar0[R0].lobyte = u.u_ruid; 3456: u.u_ar0[R0].hibyte = u.u_uid; 3457: } 3458: /* --------------------------- */ 3459: 3460: setgid() 3461: { 3462: register gid; 3463: 3464: gid = u.u_ar0[R0].lobyte; 3465: if(u.u_rgid == gid.lobyte || suser()) { 3466: u.u_gid = gid; 3467: u.u_rgid = gid; 3468: } 3469: } 3470: /* --------------------------- */ 3471: 3472: getgid() 3473: { 3474: 3475: u.u_ar0[R0].lobyte = u.u_rgid; 3476: u.u_ar0[R0].hibyte = u.u_gid; 3477: } 3478: /* --------------------------- */ 3479: 3480: getpid() 3481: { 3482: u.u_ar0[R0] = u.u_procp->p_pid; 3483: } 3484: /* --------------------------- */ 3485: 3486: sync() 3487: { 3488: 3489: update(); 3490: } 3491: /* --------------------------- */ 3492: 3493: nice() 3494: { 3495: register n; 3496: 3497: n = u.u_ar0[R0]; 3498: if(n > 20) 3499: n = 20; 3500: if(n < 0 && !suser()) 3501: n = 0; 3502: u.u_procp->p_nice = n; 3503: } 3504: /* --------------------------- */ 3505: 3506: /* 3507: * Unlink system call. 3508: * panic: unlink -- "cannot happen" 3509: */ 3510: unlink() 3511: { 3512: register *ip, *pp; 3513: extern uchar; 3514: 3515: pp = namei(&uchar, 2); 3516: if(pp == NULL) 3517: return; 3518: prele(pp); 3519: ip = iget(pp->i_dev, u.u_dent.u_ino); 3520: if(ip == NULL) 3521: panic("unlink -- iget"); 3522: if((ip->i_mode&IFMT)==IFDIR && !suser()) 3523: goto out; 3524: u.u_offset[1] =- DIRSIZ+2; 3525: u.u_base = &u.u_dent; 3526: u.u_count = DIRSIZ+2; 3527: u.u_dent.u_ino = 0; 3528: writei(pp); 3529: ip->i_nlink--; 3530: ip->i_flag =| IUPD; 3531: 3532: out: 3533: iput(pp); 3534: iput(ip); 3535: } 3536: /* --------------------------- */ 3537: 3538: chdir() 3539: { 3540: register *ip; 3541: extern uchar; 3542: 3543: ip = namei(&uchar, 0); 3544: if(ip == NULL) 3545: return; 3546: if((ip->i_mode&IFMT) != IFDIR) { 3547: u.u_error = ENOTDIR; 3548: bad: 3549: iput(ip); 3550: return; 3551: } 3552: if(access(ip, IEXEC)) 3553: goto bad; 3554: iput(u.u_cdir); 3555: u.u_cdir = ip; 3556: prele(ip); 3557: } 3558: /* --------------------------- */ 3559: 3560: chmod() 3561: { 3562: register *ip; 3563: 3564: if ((ip = owner()) == NULL) 3565: return; 3566: ip->i_mode =& ~07777; 3567: if (u.u_uid) 3568: u.u_arg[1] =& ~ISVTX; 3569: ip->i_mode =| u.u_arg[1]&07777; 3570: ip->i_flag =| IUPD; 3571: iput(ip); 3572: } 3573: /* --------------------------- */ 3574: 3575: chown() 3576: { 3577: register *ip; 3578: 3579: if (!suser() || (ip = owner()) == NULL) 3580: return; 3581: ip->i_uid = u.u_arg[1].lobyte; 3582: ip->i_gid = u.u_arg[1].hibyte; 3583: ip->i_flag =| IUPD; 3584: iput(ip); 3585: } 3586: /* --------------------------- */ 3587: 3588: /* 3589: * Change modified date of file: 3590: * time to r0-r1; sys smdate; file 3591: * This call has been withdrawn because it messes up 3592: * incremental dumps (pseudo-old files aren't dumped). 3593: * It works though and you can uncomment it if you like. 3594: 3595: smdate() 3596: { 3597: register struct inode *ip; 3598: register int *tp; 3599: int tbuf[2]; 3600: 3601: if ((ip = owner()) == NULL) 3602: return; 3603: ip->i_flag =| IUPD; 3604: tp = &tbuf[2]; 3605: *--tp = u.u_ar0[R1]; 3606: *--tp = u.u_ar0[R0]; 3607: iupdat(ip, tp); 3608: ip->i_flag =& ~IUPD; 3609: iput(ip); 3610: } 3611: */ 3612: /* --------------------------- */ 3613: 3614: ssig() 3615: { 3616: register a; 3617: 3618: a = u.u_arg[0]; 3619: if(a<=0 || a>=NSIG || a ==SIGKIL) { 3620: u.u_error = EINVAL; 3621: return; 3622: } 3623: u.u_ar0[R0] = u.u_signal[a]; 3624: u.u_signal[a] = u.u_arg[1]; 3625: if(u.u_procp->p_sig == a) 3626: u.u_procp->p_sig = 0; 3627: } 3628: /* --------------------------- */ 3629: 3630: kill() 3631: { 3632: register struct proc *p, *q; 3633: register a; 3634: int f; 3635: 3636: f = 0; 3637: a = u.u_ar0[R0]; 3638: q = u.u_procp; 3639: for(p = &proc[0]; p < &proc[NPROC]; p++) { 3640: if(p == q) 3641: continue; 3642: if(a != 0 && p->p_pid != a) 3643: continue; 3644: if(a == 0 && (p->p_ttyp != q->p_ttyp || p <= &proc[1])) 3645: continue; 3646: if(u.u_uid != 0 && u.u_uid != p->p_uid) 3647: continue; 3648: f++; 3649: psignal(p, u.u_arg[0]); 3650: } 3651: if(f == 0) 3652: u.u_error = ESRCH; 3653: } 3654: /* --------------------------- */ 3655: 3656: times() 3657: { 3658: register *p; 3659: 3660: for(p = &u.u_utime; p < &u.u_utime+6;) { 3661: suword(u.u_arg[0], *p++); 3662: u.u_arg[0] =+ 2; 3663: } 3664: } 3665: /* --------------------------- */ 3666: 3667: profil() 3668: { 3669: 3670: u.u_prof[0] = u.u_arg[0] & ~1; /* base of sample buf */ 3671: u.u_prof[1] = u.u_arg[1]; /* size of same */ 3672: u.u_prof[2] = u.u_arg[2]; /* pc offset */ 3673: u.u_prof[3] = (u.u_arg[3]>>1) & 077777; /* pc scale */ 3674: } 3675: /* --------------------------- */