xref: /csrg-svn/sys/kern/kern_prot.c (revision 8100)
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