Files
retrobsd/sys/kernel/kern_prot.c
Serge Vakulenko 585773955b Fix include paths in the kernel sources.
Max32 kernel successfully compiled with kconfig utility.
2015-08-31 00:21:41 -07:00

156 lines
2.9 KiB
C

/*
* System calls related to processes and protection.
*
* Copyright (c) 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#include <sys/param.h>
#include <sys/user.h>
#include <sys/proc.h>
#include <sys/systm.h>
void
getpid()
{
u.u_rval = u.u_procp->p_pid;
}
void
getppid()
{
u.u_rval = u.u_procp->p_ppid;
}
void
getpgrp()
{
register struct a {
int pid;
} *uap = (struct a *)u.u_arg;
register struct proc *p;
if (uap->pid == 0) /* silly... */
uap->pid = u.u_procp->p_pid;
p = pfind(uap->pid);
if (p == 0) {
u.u_error = ESRCH;
return;
}
u.u_rval = p->p_pgrp;
}
void
getuid()
{
u.u_rval = u.u_ruid;
}
void
geteuid()
{
u.u_rval = u.u_uid;
}
void
getgid()
{
u.u_rval = u.u_rgid;
}
void
getegid()
{
u.u_rval = u.u_groups[0];
}
/*
* getgroups and setgroups differ from 4.X because the VAX stores group
* entries in the user structure as shorts and has to convert them to ints.
*/
void
getgroups()
{
register struct a {
u_int gidsetsize;
int *gidset;
} *uap = (struct a *)u.u_arg;
register gid_t *gp;
for (gp = &u.u_groups[NGROUPS]; gp > u.u_groups; gp--)
if (gp[-1] != NOGROUP)
break;
if (uap->gidsetsize < gp - u.u_groups) {
u.u_error = EINVAL;
return;
}
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]));
if (u.u_error)
return;
u.u_rval = uap->gidsetsize;
}
void
setpgrp()
{
register struct proc *p;
register struct a {
int pid;
int pgrp;
} *uap = (struct a *)u.u_arg;
if (uap->pid == 0) /* silly... */
uap->pid = u.u_procp->p_pid;
p = pfind(uap->pid);
if (p == 0) {
u.u_error = ESRCH;
return;
}
/* need better control mechanisms for process groups */
if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) {
u.u_error = EPERM;
return;
}
p->p_pgrp = uap->pgrp;
}
void
setgroups()
{
register struct a {
u_int gidsetsize;
int *gidset;
} *uap = (struct a *)u.u_arg;
register gid_t *gp;
if (!suser())
return;
if (uap->gidsetsize > sizeof (u.u_groups) / sizeof (u.u_groups[0])) {
u.u_error = EINVAL;
return;
}
u.u_error = copyin((caddr_t)uap->gidset, (caddr_t)u.u_groups,
uap->gidsetsize * sizeof (u.u_groups[0]));
if (u.u_error)
return;
for (gp = &u.u_groups[uap->gidsetsize]; gp < &u.u_groups[NGROUPS]; gp++)
*gp = NOGROUP;
}
/*
* Check if gid is a member of the group set.
*/
int
groupmember(gid)
gid_t gid;
{
register gid_t *gp;
for (gp = u.u_groups; gp < &u.u_groups[NGROUPS] && *gp != NOGROUP; gp++)
if (*gp == gid)
return (1);
return (0);
}