1*7866Sroot /* kern_prot.c 5.4 82/08/24 */ 27420Sroot 37420Sroot /* 47498Sroot * System calls related to processes and protection 57420Sroot */ 67420Sroot 77420Sroot #include "../h/param.h" 87420Sroot #include "../h/systm.h" 97420Sroot #include "../h/dir.h" 107420Sroot #include "../h/user.h" 117420Sroot #include "../h/reg.h" 127420Sroot #include "../h/inode.h" 137420Sroot #include "../h/proc.h" 147420Sroot #include "../h/clock.h" 157420Sroot #include "../h/mtpr.h" 167420Sroot #include "../h/timeb.h" 177420Sroot #include "../h/times.h" 187420Sroot #include "../h/reboot.h" 197420Sroot #include "../h/fs.h" 207420Sroot #include "../h/conf.h" 217420Sroot #include "../h/buf.h" 227420Sroot #include "../h/mount.h" 237489Skre #include "../h/quota.h" 247420Sroot 257498Sroot getpid() 267498Sroot { 277498Sroot 287498Sroot u.u_r.r_val1 = u.u_procp->p_pid; 297498Sroot u.u_r.r_val2 = u.u_procp->p_ppid; 307498Sroot } 317498Sroot 327498Sroot getpgrp() 337498Sroot { 347498Sroot register struct a { 357498Sroot int pid; 367498Sroot } *uap = (struct a *)u.u_ap; 377498Sroot register struct proc *p; 387498Sroot 397498Sroot if (uap->pid == 0) 407498Sroot uap->pid = u.u_procp->p_pid; 417498Sroot p = pfind(uap->pid); 427498Sroot if (p == 0) { 437498Sroot u.u_error = ESRCH; 447498Sroot return; 457498Sroot } 467498Sroot u.u_r.r_val1 = p->p_pgrp; 477498Sroot } 487498Sroot 497420Sroot getuid() 507420Sroot { 517420Sroot 527420Sroot u.u_r.r_val1 = u.u_ruid; 537420Sroot u.u_r.r_val2 = u.u_uid; 547420Sroot } 557420Sroot 567498Sroot getgid() 577498Sroot { 587498Sroot 597498Sroot u.u_r.r_val1 = u.u_rgid; 607498Sroot u.u_r.r_val2 = u.u_gid; 617498Sroot } 627498Sroot 63*7866Sroot getgroups() 647498Sroot { 657498Sroot register struct a { 66*7866Sroot int gidsetsize; 677498Sroot int *gidset; 687498Sroot } *uap = (struct a *)u.u_ap; 69*7866Sroot register int *gp; 707498Sroot 71*7866Sroot for (gp = &u.u_groups[NGROUPS]; gp > u.u_groups; gp--) 72*7866Sroot if (gp[-1] >= 0) 73*7866Sroot break; 74*7866Sroot if (uap->gidsetsize < gp - u.u_groups) { 75*7866Sroot u.u_error = EINVAL; 76*7866Sroot return; 77*7866Sroot } 78*7866Sroot uap->gidsetsize = gp - u.u_groups; 79*7866Sroot if (copyout((caddr_t)u.u_groups, (caddr_t)uap->gidset, 80*7866Sroot uap->gidsetsize * sizeof (u.u_groups[0]))) { 817498Sroot u.u_error = EFAULT; 827498Sroot return; 837498Sroot } 84*7866Sroot u.u_r.r_val1 = uap->gidsetsize; 857498Sroot } 867498Sroot 877498Sroot setpgrp() 887498Sroot { 897498Sroot register struct proc *p; 907498Sroot register struct a { 917498Sroot int pid; 927498Sroot int pgrp; 937498Sroot } *uap = (struct a *)u.u_ap; 947498Sroot 957498Sroot if (uap->pid == 0) 967498Sroot uap->pid = u.u_procp->p_pid; 977498Sroot p = pfind(uap->pid); 987498Sroot if (p == 0) { 997498Sroot u.u_error = ESRCH; 1007498Sroot return; 1017498Sroot } 102*7866Sroot /* need better control mechanisms for process groups */ 1037498Sroot if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 1047498Sroot u.u_error = EPERM; 1057498Sroot return; 1067498Sroot } 1077498Sroot p->p_pgrp = uap->pgrp; 1087498Sroot } 1097498Sroot 1107420Sroot setuid() 1117420Sroot { 1127420Sroot register uid; 1137420Sroot register struct a { 1147420Sroot int uid; 1157420Sroot } *uap; 1167420Sroot 1177420Sroot uap = (struct a *)u.u_ap; 1187420Sroot uid = uap->uid; 1197420Sroot if (u.u_ruid == uid || u.u_uid == uid || suser()) { 1207489Skre #ifdef QUOTA 1217489Skre if (u.u_quota->q_uid != uid) { 1227489Skre qclean(); 1237489Skre qstart(getquota(uid, 0, 0)); 1247489Skre } 1257489Skre #endif 1267420Sroot u.u_uid = uid; 1277420Sroot u.u_procp->p_uid = uid; 1287420Sroot u.u_ruid = uid; 1297420Sroot } 1307420Sroot } 1317420Sroot 1327420Sroot setgid() 1337420Sroot { 1347420Sroot register gid; 1357420Sroot register struct a { 1367420Sroot int gid; 1377420Sroot } *uap; 1387420Sroot 1397420Sroot uap = (struct a *)u.u_ap; 1407420Sroot gid = uap->gid; 1417420Sroot if (u.u_rgid == gid || u.u_gid == gid || suser()) { 142*7866Sroot leavegroup(u.u_gid); leavegroup(u.u_rgid); 143*7866Sroot (void) entergroup(gid); 1447420Sroot u.u_gid = gid; 1457420Sroot u.u_rgid = gid; 1467420Sroot } 1477420Sroot } 1487498Sroot 149*7866Sroot setgroups() 1507498Sroot { 1517498Sroot register struct a { 152*7866Sroot int gidsetsize; 1537498Sroot int *gidset; 1547498Sroot } *uap = (struct a *)u.u_ap; 155*7866Sroot register int *gp; 1567498Sroot 1577498Sroot if (suser()) 1587498Sroot return; 159*7866Sroot if (uap->gidsetsize > sizeof (u.u_groups) / sizeof (u.u_groups[0])) { 160*7866Sroot u.u_error = EINVAL; 1617498Sroot return; 1627498Sroot } 163*7866Sroot if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_groups, 164*7866Sroot uap->gidsetsize * sizeof (u.u_groups[0]))) { 1657498Sroot u.u_error = EFAULT; 1667498Sroot return; 1677498Sroot } 168*7866Sroot for (gp = &u.u_groups[uap->gidsetsize]; gp < &u.u_groups[NGROUPS]; gp++) 169*7866Sroot *gp = -1; 1707498Sroot } 1717498Sroot 1727498Sroot /* 1737498Sroot * Pid of zero implies current process. 1747498Sroot * Pgrp -1 is getpgrp system call returning 1757498Sroot * current process group. 1767498Sroot */ 1777498Sroot osetpgrp() 1787498Sroot { 1797498Sroot register struct proc *p; 1807498Sroot register struct a { 1817498Sroot int pid; 1827498Sroot int pgrp; 1837498Sroot } *uap; 1847498Sroot 1857498Sroot uap = (struct a *)u.u_ap; 1867498Sroot if (uap->pid == 0) 1877498Sroot p = u.u_procp; 1887498Sroot else { 1897498Sroot p = pfind(uap->pid); 1907498Sroot if (p == 0) { 1917498Sroot u.u_error = ESRCH; 1927498Sroot return; 1937498Sroot } 1947498Sroot } 1957498Sroot if (uap->pgrp <= 0) { 1967498Sroot u.u_r.r_val1 = p->p_pgrp; 1977498Sroot return; 1987498Sroot } 1997498Sroot if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 2007498Sroot u.u_error = EPERM; 2017498Sroot return; 2027498Sroot } 2037498Sroot p->p_pgrp = uap->pgrp; 2047498Sroot } 2057498Sroot /* END DEFUNCT */ 206*7866Sroot 207*7866Sroot leavegroup(gid) 208*7866Sroot int gid; 209*7866Sroot { 210*7866Sroot register int *gp; 211*7866Sroot 212*7866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 213*7866Sroot if (*gp == gid) 214*7866Sroot goto found; 215*7866Sroot return; 216*7866Sroot found: 217*7866Sroot for (; gp < &u.u_groups[NGROUPS-1]; gp++) 218*7866Sroot *gp = *(gp+1); 219*7866Sroot *gp = 0; 220*7866Sroot } 221*7866Sroot 222*7866Sroot entergroup(gid) 223*7866Sroot int gid; 224*7866Sroot { 225*7866Sroot register int *gp; 226*7866Sroot 227*7866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 228*7866Sroot if (*gp == gid) 229*7866Sroot return (0); 230*7866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 231*7866Sroot if (*gp < 0) { 232*7866Sroot *gp = gid; 233*7866Sroot return (0); 234*7866Sroot } 235*7866Sroot return (-1); 236*7866Sroot } 237