/* kern_prot.c 5.17 83/05/27 */
* 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
;
uap
->pid
= u
.u_procp
->p_pid
;
u
.u_r
.r_val1
= p
->p_pgrp
;
} *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
;
u
.u_error
= copyout((caddr_t
)u
.u_groups
, (caddr_t
)uap
->gidset
,
uap
->gidsetsize
* sizeof (u
.u_groups
[0]));
u
.u_r
.r_val1
= uap
->gidsetsize
;
} *uap
= (struct a
*)u
.u_ap
;
uap
->pid
= u
.u_procp
->p_pid
;
/* need better control mechanisms for process groups */
if (p
->p_uid
!= u
.u_uid
&& u
.u_uid
&& !inferior(p
)) {
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(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())
} *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
)u
.u_groups
,
uap
->gidsetsize
* sizeof (u
.u_groups
[0]));
for (gp
= &u
.u_groups
[uap
->gidsetsize
]; 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
++)
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
++)