1*8624Sroot /* kern_prot.c 5.9 82/10/17 */ 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/timeb.h" 157420Sroot #include "../h/times.h" 167420Sroot #include "../h/reboot.h" 177420Sroot #include "../h/fs.h" 187420Sroot #include "../h/conf.h" 197420Sroot #include "../h/buf.h" 207420Sroot #include "../h/mount.h" 217489Skre #include "../h/quota.h" 227420Sroot 237498Sroot getpid() 247498Sroot { 257498Sroot 267498Sroot u.u_r.r_val1 = u.u_procp->p_pid; 277498Sroot u.u_r.r_val2 = u.u_procp->p_ppid; 287498Sroot } 297498Sroot 307498Sroot getpgrp() 317498Sroot { 327498Sroot register struct a { 337498Sroot int pid; 347498Sroot } *uap = (struct a *)u.u_ap; 357498Sroot register struct proc *p; 367498Sroot 377498Sroot if (uap->pid == 0) 387498Sroot uap->pid = u.u_procp->p_pid; 397498Sroot p = pfind(uap->pid); 407498Sroot if (p == 0) { 417498Sroot u.u_error = ESRCH; 427498Sroot return; 437498Sroot } 447498Sroot u.u_r.r_val1 = p->p_pgrp; 457498Sroot } 467498Sroot 477420Sroot getuid() 487420Sroot { 497420Sroot 507420Sroot u.u_r.r_val1 = u.u_ruid; 517420Sroot u.u_r.r_val2 = u.u_uid; 527420Sroot } 537420Sroot 547498Sroot getgid() 557498Sroot { 567498Sroot 577498Sroot u.u_r.r_val1 = u.u_rgid; 587498Sroot u.u_r.r_val2 = u.u_gid; 597498Sroot } 607498Sroot 617866Sroot getgroups() 627498Sroot { 637498Sroot register struct a { 64*8624Sroot u_int gidsetsize; 657498Sroot int *gidset; 667498Sroot } *uap = (struct a *)u.u_ap; 677866Sroot register int *gp; 687498Sroot 697866Sroot for (gp = &u.u_groups[NGROUPS]; gp > u.u_groups; gp--) 707866Sroot if (gp[-1] >= 0) 717866Sroot break; 727866Sroot if (uap->gidsetsize < gp - u.u_groups) { 737866Sroot u.u_error = EINVAL; 747866Sroot return; 757866Sroot } 767866Sroot uap->gidsetsize = gp - u.u_groups; 777866Sroot if (copyout((caddr_t)u.u_groups, (caddr_t)uap->gidset, 787866Sroot uap->gidsetsize * sizeof (u.u_groups[0]))) { 797498Sroot u.u_error = EFAULT; 807498Sroot return; 817498Sroot } 827866Sroot u.u_r.r_val1 = uap->gidsetsize; 837498Sroot } 847498Sroot 857498Sroot setpgrp() 867498Sroot { 877498Sroot register struct proc *p; 887498Sroot register struct a { 897498Sroot int pid; 907498Sroot int pgrp; 917498Sroot } *uap = (struct a *)u.u_ap; 927498Sroot 937498Sroot if (uap->pid == 0) 947498Sroot uap->pid = u.u_procp->p_pid; 957498Sroot p = pfind(uap->pid); 967498Sroot if (p == 0) { 977498Sroot u.u_error = ESRCH; 987498Sroot return; 997498Sroot } 1007866Sroot /* need better control mechanisms for process groups */ 1017498Sroot if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 1027498Sroot u.u_error = EPERM; 1037498Sroot return; 1047498Sroot } 1057498Sroot p->p_pgrp = uap->pgrp; 1067498Sroot } 1077498Sroot 1087420Sroot setuid() 1097420Sroot { 1107420Sroot register uid; 1117420Sroot register struct a { 1127420Sroot int uid; 1137420Sroot } *uap; 1147420Sroot 1157420Sroot uap = (struct a *)u.u_ap; 1167420Sroot uid = uap->uid; 1177420Sroot if (u.u_ruid == uid || u.u_uid == uid || suser()) { 1187489Skre #ifdef QUOTA 1197489Skre if (u.u_quota->q_uid != uid) { 1207489Skre qclean(); 1217489Skre qstart(getquota(uid, 0, 0)); 1227489Skre } 1237489Skre #endif 1247420Sroot u.u_uid = uid; 1257420Sroot u.u_procp->p_uid = uid; 1267420Sroot u.u_ruid = uid; 1277420Sroot } 1287420Sroot } 1297420Sroot 1307420Sroot setgid() 1317420Sroot { 1327420Sroot register gid; 1337420Sroot register struct a { 1347420Sroot int gid; 1357420Sroot } *uap; 1367420Sroot 1377420Sroot uap = (struct a *)u.u_ap; 1387420Sroot gid = uap->gid; 1397420Sroot if (u.u_rgid == gid || u.u_gid == gid || suser()) { 1407866Sroot leavegroup(u.u_gid); leavegroup(u.u_rgid); 1417866Sroot (void) entergroup(gid); 1427420Sroot u.u_gid = gid; 1437420Sroot u.u_rgid = gid; 1447420Sroot } 1457420Sroot } 1467498Sroot 1477866Sroot setgroups() 1487498Sroot { 1497498Sroot register struct a { 150*8624Sroot u_int gidsetsize; 1517498Sroot int *gidset; 1527498Sroot } *uap = (struct a *)u.u_ap; 1537866Sroot register int *gp; 1547498Sroot 1558100Sroot if (!suser()) 1567498Sroot return; 1577866Sroot if (uap->gidsetsize > sizeof (u.u_groups) / sizeof (u.u_groups[0])) { 1587866Sroot u.u_error = EINVAL; 1597498Sroot return; 1607498Sroot } 1617866Sroot if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_groups, 1627866Sroot uap->gidsetsize * sizeof (u.u_groups[0]))) { 1637498Sroot u.u_error = EFAULT; 1647498Sroot return; 1657498Sroot } 1667866Sroot for (gp = &u.u_groups[uap->gidsetsize]; gp < &u.u_groups[NGROUPS]; gp++) 1677866Sroot *gp = -1; 1687498Sroot } 1697498Sroot 1707498Sroot /* 1717498Sroot * Pid of zero implies current process. 1727498Sroot * Pgrp -1 is getpgrp system call returning 1737498Sroot * current process group. 1747498Sroot */ 1757498Sroot osetpgrp() 1767498Sroot { 1777498Sroot register struct proc *p; 1787498Sroot register struct a { 1797498Sroot int pid; 1807498Sroot int pgrp; 1817498Sroot } *uap; 1827498Sroot 1837498Sroot uap = (struct a *)u.u_ap; 1847498Sroot if (uap->pid == 0) 1857498Sroot p = u.u_procp; 1867498Sroot else { 1877498Sroot p = pfind(uap->pid); 1887498Sroot if (p == 0) { 1897498Sroot u.u_error = ESRCH; 1907498Sroot return; 1917498Sroot } 1927498Sroot } 1937498Sroot if (uap->pgrp <= 0) { 1947498Sroot u.u_r.r_val1 = p->p_pgrp; 1957498Sroot return; 1967498Sroot } 1977498Sroot if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 1987498Sroot u.u_error = EPERM; 1997498Sroot return; 2007498Sroot } 2017498Sroot p->p_pgrp = uap->pgrp; 2027498Sroot } 2037498Sroot /* END DEFUNCT */ 2047866Sroot 2057866Sroot leavegroup(gid) 2067866Sroot int gid; 2077866Sroot { 2087866Sroot register int *gp; 2097866Sroot 2107866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 2117866Sroot if (*gp == gid) 2127866Sroot goto found; 2137866Sroot return; 2147866Sroot found: 2157866Sroot for (; gp < &u.u_groups[NGROUPS-1]; gp++) 2167866Sroot *gp = *(gp+1); 2177879Sroot *gp = -1; 2187866Sroot } 2197866Sroot 2207866Sroot entergroup(gid) 2217866Sroot int gid; 2227866Sroot { 2237866Sroot register int *gp; 2247866Sroot 2257866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 2267866Sroot if (*gp == gid) 2277866Sroot return (0); 2287866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 2297866Sroot if (*gp < 0) { 2307866Sroot *gp = gid; 2317866Sroot return (0); 2327866Sroot } 2337866Sroot return (-1); 2347866Sroot } 235