* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)kern_prot.c 7.2 (Berkeley) %G%
* System calls related to processes and protection
#include "../machine/reg.h"
u
.u_r
.r_val1
= u
.u_procp
->p_pid
;
u
.u_r
.r_val2
= u
.u_procp
->p_ppid
;
} *uap
= (struct a
*)u
.u_ap
;
else if ((p
= pfind(uap
->pid
)) == 0) {
u
.u_r
.r_val1
= p
->p_pgrp
->pg_id
;
} *uap
= (struct a
*)u
.u_ap
;
for (gp
= &u
.u_groups
[NGROUPS
]; gp
> u
.u_groups
; gp
--)
if (uap
->gidsetsize
< gp
- u
.u_groups
) {
uap
->gidsetsize
= gp
- u
.u_groups
;
for (lp
= groups
, gp
= u
.u_groups
; lp
< &groups
[uap
->gidsetsize
]; )
u
.u_error
= copyout((caddr_t
)groups
, (caddr_t
)uap
->gidset
,
uap
->gidsetsize
* sizeof (groups
[0]));
u
.u_r
.r_val1
= uap
->gidsetsize
;
register struct proc
*p
= u
.u_procp
;
if ((p
->p_pgid
== p
->p_pid
) || pgfind(p
->p_pid
))
* if target pid != caller's pid
* pid must be an inferior
* pid must be in same session
* pid can't have done an exec
* there must exist a pid with pgid in same session
* pid must not be session leader
} *uap
= (struct a
*)u
.u_ap
;
register struct pgrp
*pgrp
;
else if ((p
= pfind(uap
->pid
)) == 0 || !inferior(p
)) {
else if (p
!= u
.u_procp
) {
if (p
->p_session
!= u
.u_procp
->p_session
) {
else if ((uap
->pgid
!= p
->p_pid
) &&
(((pgrp
= pgfind(uap
->pgid
)) == 0) ||
pgrp
->pg_session
!= u
.u_procp
->p_session
)) {
* done checking, now doit
uap
= (struct a
*)u
.u_ap
;
if (u
.u_ruid
!= ruid
&& u
.u_uid
!= ruid
&& !suser())
if (u
.u_ruid
!= euid
&& u
.u_uid
!= euid
&& !suser())
* Everything's okay, do it.
if (u
.u_quota
->q_uid
!= ruid
) {
qstart(getquota((uid_t
)ruid
, 0, 0));
uap
= (struct a
*)u
.u_ap
;
if (u
.u_rgid
!= rgid
&& u
.u_gid
!= rgid
&& !suser())
if (u
.u_rgid
!= egid
&& u
.u_gid
!= egid
&& !suser())
(void) entergroup((gid_t
)rgid
);
} *uap
= (struct a
*)u
.u_ap
;
if (uap
->gidsetsize
> sizeof (u
.u_groups
) / sizeof (u
.u_groups
[0])) {
u
.u_error
= copyin((caddr_t
)uap
->gidset
, (caddr_t
)groups
,
uap
->gidsetsize
* sizeof (groups
[0]));
for (lp
= groups
, gp
= u
.u_groups
; lp
< &groups
[uap
->gidsetsize
]; )
for ( ; gp
< &u
.u_groups
[NGROUPS
]; gp
++)
* Group utility functions.
* Delete gid from the group set.
for (gp
= u
.u_groups
; gp
< &u
.u_groups
[NGROUPS
]; gp
++)
for (; gp
< &u
.u_groups
[NGROUPS
-1]; gp
++)
* Add gid to the group set.
for (gp
= u
.u_groups
; gp
< &u
.u_groups
[NGROUPS
]; gp
++) {
* Check if gid is a member of the group set.
for (gp
= u
.u_groups
; gp
< &u
.u_groups
[NGROUPS
] && *gp
!= NOGROUP
; gp
++)