* 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.1 (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
;
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
;
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
;
} *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((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
++)