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