1*8100Sroot /* kern_prot.c 5.6 82/09/06 */ 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/mtpr.h" 157420Sroot #include "../h/timeb.h" 167420Sroot #include "../h/times.h" 177420Sroot #include "../h/reboot.h" 187420Sroot #include "../h/fs.h" 197420Sroot #include "../h/conf.h" 207420Sroot #include "../h/buf.h" 217420Sroot #include "../h/mount.h" 227489Skre #include "../h/quota.h" 237420Sroot 247498Sroot getpid() 257498Sroot { 267498Sroot 277498Sroot u.u_r.r_val1 = u.u_procp->p_pid; 287498Sroot u.u_r.r_val2 = u.u_procp->p_ppid; 297498Sroot } 307498Sroot 317498Sroot getpgrp() 327498Sroot { 337498Sroot register struct a { 347498Sroot int pid; 357498Sroot } *uap = (struct a *)u.u_ap; 367498Sroot register struct proc *p; 377498Sroot 387498Sroot if (uap->pid == 0) 397498Sroot uap->pid = u.u_procp->p_pid; 407498Sroot p = pfind(uap->pid); 417498Sroot if (p == 0) { 427498Sroot u.u_error = ESRCH; 437498Sroot return; 447498Sroot } 457498Sroot u.u_r.r_val1 = p->p_pgrp; 467498Sroot } 477498Sroot 487420Sroot getuid() 497420Sroot { 507420Sroot 517420Sroot u.u_r.r_val1 = u.u_ruid; 527420Sroot u.u_r.r_val2 = u.u_uid; 537420Sroot } 547420Sroot 557498Sroot getgid() 567498Sroot { 577498Sroot 587498Sroot u.u_r.r_val1 = u.u_rgid; 597498Sroot u.u_r.r_val2 = u.u_gid; 607498Sroot } 617498Sroot 627866Sroot getgroups() 637498Sroot { 647498Sroot register struct a { 657866Sroot int gidsetsize; 667498Sroot int *gidset; 677498Sroot } *uap = (struct a *)u.u_ap; 687866Sroot register int *gp; 697498Sroot 707866Sroot for (gp = &u.u_groups[NGROUPS]; gp > u.u_groups; gp--) 717866Sroot if (gp[-1] >= 0) 727866Sroot break; 737866Sroot if (uap->gidsetsize < gp - u.u_groups) { 747866Sroot u.u_error = EINVAL; 757866Sroot return; 767866Sroot } 777866Sroot uap->gidsetsize = gp - u.u_groups; 787866Sroot if (copyout((caddr_t)u.u_groups, (caddr_t)uap->gidset, 797866Sroot uap->gidsetsize * sizeof (u.u_groups[0]))) { 807498Sroot u.u_error = EFAULT; 817498Sroot return; 827498Sroot } 837866Sroot u.u_r.r_val1 = uap->gidsetsize; 847498Sroot } 857498Sroot 867498Sroot setpgrp() 877498Sroot { 887498Sroot register struct proc *p; 897498Sroot register struct a { 907498Sroot int pid; 917498Sroot int pgrp; 927498Sroot } *uap = (struct a *)u.u_ap; 937498Sroot 947498Sroot if (uap->pid == 0) 957498Sroot uap->pid = u.u_procp->p_pid; 967498Sroot p = pfind(uap->pid); 977498Sroot if (p == 0) { 987498Sroot u.u_error = ESRCH; 997498Sroot return; 1007498Sroot } 1017866Sroot /* need better control mechanisms for process groups */ 1027498Sroot if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 1037498Sroot u.u_error = EPERM; 1047498Sroot return; 1057498Sroot } 1067498Sroot p->p_pgrp = uap->pgrp; 1077498Sroot } 1087498Sroot 1097420Sroot setuid() 1107420Sroot { 1117420Sroot register uid; 1127420Sroot register struct a { 1137420Sroot int uid; 1147420Sroot } *uap; 1157420Sroot 1167420Sroot uap = (struct a *)u.u_ap; 1177420Sroot uid = uap->uid; 1187420Sroot if (u.u_ruid == uid || u.u_uid == uid || suser()) { 1197489Skre #ifdef QUOTA 1207489Skre if (u.u_quota->q_uid != uid) { 1217489Skre qclean(); 1227489Skre qstart(getquota(uid, 0, 0)); 1237489Skre } 1247489Skre #endif 1257420Sroot u.u_uid = uid; 1267420Sroot u.u_procp->p_uid = uid; 1277420Sroot u.u_ruid = uid; 1287420Sroot } 1297420Sroot } 1307420Sroot 1317420Sroot setgid() 1327420Sroot { 1337420Sroot register gid; 1347420Sroot register struct a { 1357420Sroot int gid; 1367420Sroot } *uap; 1377420Sroot 1387420Sroot uap = (struct a *)u.u_ap; 1397420Sroot gid = uap->gid; 1407420Sroot if (u.u_rgid == gid || u.u_gid == gid || suser()) { 1417866Sroot leavegroup(u.u_gid); leavegroup(u.u_rgid); 1427866Sroot (void) entergroup(gid); 1437420Sroot u.u_gid = gid; 1447420Sroot u.u_rgid = gid; 1457420Sroot } 1467420Sroot } 1477498Sroot 1487866Sroot setgroups() 1497498Sroot { 1507498Sroot register struct a { 1517866Sroot int gidsetsize; 1527498Sroot int *gidset; 1537498Sroot } *uap = (struct a *)u.u_ap; 1547866Sroot register int *gp; 1557498Sroot 156*8100Sroot printf("gidsetsize %d, gidset %x\n", uap->gidsetsize, uap->gidset); 157*8100Sroot if (!suser()) 1587498Sroot return; 1597866Sroot if (uap->gidsetsize > sizeof (u.u_groups) / sizeof (u.u_groups[0])) { 1607866Sroot u.u_error = EINVAL; 1617498Sroot return; 1627498Sroot } 1637866Sroot if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_groups, 1647866Sroot uap->gidsetsize * sizeof (u.u_groups[0]))) { 1657498Sroot u.u_error = EFAULT; 1667498Sroot return; 1677498Sroot } 168*8100Sroot printf("copied in %d %d ... \n", u.u_groups[0], u.u_groups[1]); 1697866Sroot for (gp = &u.u_groups[uap->gidsetsize]; gp < &u.u_groups[NGROUPS]; gp++) 1707866Sroot *gp = -1; 1717498Sroot } 1727498Sroot 1737498Sroot /* 1747498Sroot * Pid of zero implies current process. 1757498Sroot * Pgrp -1 is getpgrp system call returning 1767498Sroot * current process group. 1777498Sroot */ 1787498Sroot osetpgrp() 1797498Sroot { 1807498Sroot register struct proc *p; 1817498Sroot register struct a { 1827498Sroot int pid; 1837498Sroot int pgrp; 1847498Sroot } *uap; 1857498Sroot 1867498Sroot uap = (struct a *)u.u_ap; 1877498Sroot if (uap->pid == 0) 1887498Sroot p = u.u_procp; 1897498Sroot else { 1907498Sroot p = pfind(uap->pid); 1917498Sroot if (p == 0) { 1927498Sroot u.u_error = ESRCH; 1937498Sroot return; 1947498Sroot } 1957498Sroot } 1967498Sroot if (uap->pgrp <= 0) { 1977498Sroot u.u_r.r_val1 = p->p_pgrp; 1987498Sroot return; 1997498Sroot } 2007498Sroot if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 2017498Sroot u.u_error = EPERM; 2027498Sroot return; 2037498Sroot } 2047498Sroot p->p_pgrp = uap->pgrp; 2057498Sroot } 2067498Sroot /* END DEFUNCT */ 2077866Sroot 2087866Sroot leavegroup(gid) 2097866Sroot int gid; 2107866Sroot { 2117866Sroot register int *gp; 2127866Sroot 2137866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 2147866Sroot if (*gp == gid) 2157866Sroot goto found; 2167866Sroot return; 2177866Sroot found: 2187866Sroot for (; gp < &u.u_groups[NGROUPS-1]; gp++) 2197866Sroot *gp = *(gp+1); 2207879Sroot *gp = -1; 2217866Sroot } 2227866Sroot 2237866Sroot entergroup(gid) 2247866Sroot int gid; 2257866Sroot { 2267866Sroot register int *gp; 2277866Sroot 2287866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 2297866Sroot if (*gp == gid) 2307866Sroot return (0); 2317866Sroot for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++) 2327866Sroot if (*gp < 0) { 2337866Sroot *gp = gid; 2347866Sroot return (0); 2357866Sroot } 2367866Sroot return (-1); 2377866Sroot } 238