summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_prot.c
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2001-09-12 08:38:13 +0000
committerjulian <julian@FreeBSD.org>2001-09-12 08:38:13 +0000
commit5596676e6c6c1e81e899cd0531f9b1c28a292669 (patch)
treeb1a19fcdf05759281fab0d89efb13f0fdf42102e /sys/kern/kern_prot.c
parent83e00d4274950d2b531c24692cd123538ffbddb9 (diff)
downloadFreeBSD-src-5596676e6c6c1e81e899cd0531f9b1c28a292669.zip
FreeBSD-src-5596676e6c6c1e81e899cd0531f9b1c28a292669.tar.gz
KSE Milestone 2
Note ALL MODULES MUST BE RECOMPILED make the kernel aware that there are smaller units of scheduling than the process. (but only allow one thread per process at this time). This is functionally equivalent to teh previousl -current except that there is a thread associated with each process. Sorry john! (your next MFC will be a doosie!) Reviewed by: peter@freebsd.org, dillon@freebsd.org X-MFC after: ha ha ha ha
Diffstat (limited to 'sys/kern/kern_prot.c')
-rw-r--r--sys/kern/kern_prot.c199
1 files changed, 124 insertions, 75 deletions
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index baa73dd..0c2939c 100644
--- a/sys/kern/kern_prot.c
+++ b/sys/kern/kern_prot.c
@@ -81,16 +81,17 @@ struct getpid_args {
*/
/* ARGSUSED */
int
-getpid(p, uap)
- struct proc *p;
+getpid(td, uap)
+ struct thread *td;
struct getpid_args *uap;
{
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
- p->p_retval[0] = p->p_pid;
+ td->td_retval[0] = p->p_pid;
#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
PROC_LOCK(p);
- p->p_retval[1] = p->p_pptr->p_pid;
+ td->td_retval[1] = p->p_pptr->p_pid;
PROC_UNLOCK(p);
#endif
mtx_unlock(&Giant);
@@ -111,14 +112,15 @@ struct getppid_args {
*/
/* ARGSUSED */
int
-getppid(p, uap)
- struct proc *p;
+getppid(td, uap)
+ struct thread *td;
struct getppid_args *uap;
{
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
PROC_LOCK(p);
- p->p_retval[0] = p->p_pptr->p_pid;
+ td->td_retval[0] = p->p_pptr->p_pid;
PROC_UNLOCK(p);
mtx_unlock(&Giant);
return (0);
@@ -138,13 +140,14 @@ struct getpgrp_args {
* MPSAFE
*/
int
-getpgrp(p, uap)
- struct proc *p;
+getpgrp(td, uap)
+ struct thread *td;
struct getpgrp_args *uap;
{
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
- p->p_retval[0] = p->p_pgrp->pg_id;
+ td->td_retval[0] = p->p_pgrp->pg_id;
mtx_unlock(&Giant);
return (0);
}
@@ -160,16 +163,17 @@ struct getpgid_args {
* MPSAFE
*/
int
-getpgid(p, uap)
- struct proc *p;
+getpgid(td, uap)
+ struct thread *td;
struct getpgid_args *uap;
{
+ struct proc *p = td->td_proc;
struct proc *pt;
int error = 0;
mtx_lock(&Giant);
if (uap->pid == 0)
- p->p_retval[0] = p->p_pgrp->pg_id;
+ td->td_retval[0] = p->p_pgrp->pg_id;
else {
if ((pt = pfind(uap->pid)) == NULL) {
error = ESRCH;
@@ -179,7 +183,7 @@ getpgid(p, uap)
PROC_UNLOCK(pt);
goto done2;
}
- p->p_retval[0] = pt->p_pgrp->pg_id;
+ td->td_retval[0] = pt->p_pgrp->pg_id;
PROC_UNLOCK(pt);
}
done2:
@@ -200,16 +204,17 @@ struct getsid_args {
* MPSAFE
*/
int
-getsid(p, uap)
- struct proc *p;
+getsid(td, uap)
+ struct thread *td;
struct getsid_args *uap;
{
+ struct proc *p = td->td_proc;
struct proc *pt;
int error = 0;
mtx_lock(&Giant);
if (uap->pid == 0) {
- p->p_retval[0] = p->p_session->s_sid;
+ td->td_retval[0] = p->p_session->s_sid;
} else {
if ((pt = pfind(uap->pid)) == NULL) {
error = ESRCH;
@@ -219,7 +224,7 @@ getsid(p, uap)
PROC_UNLOCK(pt);
goto done2;
}
- p->p_retval[0] = pt->p_session->s_sid;
+ td->td_retval[0] = pt->p_session->s_sid;
PROC_UNLOCK(pt);
}
done2:
@@ -242,15 +247,16 @@ struct getuid_args {
*/
/* ARGSUSED */
int
-getuid(p, uap)
- struct proc *p;
+getuid(td, uap)
+ struct thread *td;
struct getuid_args *uap;
{
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
- p->p_retval[0] = p->p_ucred->cr_ruid;
+ td->td_retval[0] = p->p_ucred->cr_ruid;
#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
- p->p_retval[1] = p->p_ucred->cr_uid;
+ td->td_retval[1] = p->p_ucred->cr_uid;
#endif
mtx_unlock(&Giant);
return (0);
@@ -267,13 +273,12 @@ struct geteuid_args {
/* ARGSUSED */
int
-geteuid(p, uap)
- struct proc *p;
+geteuid(td, uap)
+ struct thread *td;
struct geteuid_args *uap;
{
-
mtx_lock(&Giant);
- p->p_retval[0] = p->p_ucred->cr_uid;
+ td->td_retval[0] = td->td_proc->p_ucred->cr_uid;
mtx_unlock(&Giant);
return (0);
}
@@ -292,15 +297,16 @@ struct getgid_args {
*/
/* ARGSUSED */
int
-getgid(p, uap)
- struct proc *p;
+getgid(td, uap)
+ struct thread *td;
struct getgid_args *uap;
{
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
- p->p_retval[0] = p->p_ucred->cr_rgid;
+ td->td_retval[0] = p->p_ucred->cr_rgid;
#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
- p->p_retval[1] = p->p_ucred->cr_groups[0];
+ td->td_retval[1] = p->p_ucred->cr_groups[0];
#endif
mtx_unlock(&Giant);
return (0);
@@ -322,13 +328,14 @@ struct getegid_args {
*/
/* ARGSUSED */
int
-getegid(p, uap)
- struct proc *p;
+getegid(td, uap)
+ struct thread *td;
struct getegid_args *uap;
{
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
- p->p_retval[0] = p->p_ucred->cr_groups[0];
+ td->td_retval[0] = p->p_ucred->cr_groups[0];
mtx_unlock(&Giant);
return (0);
}
@@ -343,18 +350,19 @@ struct getgroups_args {
* MPSAFE
*/
int
-getgroups(p, uap)
- struct proc *p;
+getgroups(td, uap)
+ struct thread *td;
register struct getgroups_args *uap;
{
struct ucred *cred;
+ struct proc *p = td->td_proc;
u_int ngrp;
int error = 0;
mtx_lock(&Giant);
cred = p->p_ucred;
if ((ngrp = uap->gidsetsize) == 0) {
- p->p_retval[0] = cred->cr_ngroups;
+ td->td_retval[0] = cred->cr_ngroups;
error = 0;
goto done2;
}
@@ -367,7 +375,7 @@ getgroups(p, uap)
(caddr_t)uap->gidset, ngrp * sizeof(gid_t)))) {
goto done2;
}
- p->p_retval[0] = ngrp;
+ td->td_retval[0] = ngrp;
done2:
mtx_unlock(&Giant);
return (error);
@@ -384,18 +392,19 @@ struct setsid_args {
*/
/* ARGSUSED */
int
-setsid(p, uap)
- register struct proc *p;
+setsid(td, uap)
+ register struct thread *td;
struct setsid_args *uap;
{
int error;
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
if (p->p_pgid == p->p_pid || pgfind(p->p_pid)) {
error = EPERM;
} else {
(void)enterpgrp(p, p->p_pid, 1);
- p->p_retval[0] = p->p_pid;
+ td->td_retval[0] = p->p_pid;
error = 0;
}
mtx_unlock(&Giant);
@@ -426,10 +435,11 @@ struct setpgid_args {
*/
/* ARGSUSED */
int
-setpgid(curp, uap)
- struct proc *curp;
+setpgid(td, uap)
+ struct thread *td;
register struct setpgid_args *uap;
{
+ struct proc *curp = td->td_proc;
register struct proc *targp; /* target process */
register struct pgrp *pgrp; /* target pgrp */
int error;
@@ -510,10 +520,11 @@ struct setuid_args {
*/
/* ARGSUSED */
int
-setuid(p, uap)
- struct proc *p;
+setuid(td, uap)
+ struct thread *td;
struct setuid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
uid_t uid;
int error = 0;
@@ -607,10 +618,11 @@ struct seteuid_args {
*/
/* ARGSUSED */
int
-seteuid(p, uap)
- struct proc *p;
+seteuid(td, uap)
+ struct thread *td;
struct seteuid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
uid_t euid;
int error = 0;
@@ -650,10 +662,11 @@ struct setgid_args {
*/
/* ARGSUSED */
int
-setgid(p, uap)
- struct proc *p;
+setgid(td, uap)
+ struct thread *td;
struct setgid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
gid_t gid;
int error = 0;
@@ -741,10 +754,11 @@ struct setegid_args {
*/
/* ARGSUSED */
int
-setegid(p, uap)
- struct proc *p;
+setegid(td, uap)
+ struct thread *td;
struct setegid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
gid_t egid;
int error = 0;
@@ -781,10 +795,11 @@ struct setgroups_args {
*/
/* ARGSUSED */
int
-setgroups(p, uap)
- struct proc *p;
+setgroups(td, uap)
+ struct thread *td;
struct setgroups_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
u_int ngrp;
int error;
@@ -839,10 +854,11 @@ struct setreuid_args {
*/
/* ARGSUSED */
int
-setreuid(p, uap)
- register struct proc *p;
+setreuid(td, uap)
+ register struct thread *td;
struct setreuid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
uid_t ruid, euid;
int error = 0;
@@ -892,10 +908,11 @@ struct setregid_args {
*/
/* ARGSUSED */
int
-setregid(p, uap)
- register struct proc *p;
+setregid(td, uap)
+ register struct thread *td;
struct setregid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
gid_t rgid, egid;
int error = 0;
@@ -952,10 +969,11 @@ struct setresuid_args {
*/
/* ARGSUSED */
int
-setresuid(p, uap)
- register struct proc *p;
+setresuid(td, uap)
+ register struct thread *td;
struct setresuid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
uid_t ruid, euid, suid;
int error;
@@ -1017,10 +1035,11 @@ struct setresgid_args {
*/
/* ARGSUSED */
int
-setresgid(p, uap)
- register struct proc *p;
+setresgid(td, uap)
+ register struct thread *td;
struct setresgid_args *uap;
{
+ struct proc *p = td->td_proc;
struct ucred *newcred, *oldcred;
gid_t rgid, egid, sgid;
int error;
@@ -1076,11 +1095,12 @@ struct getresuid_args {
*/
/* ARGSUSED */
int
-getresuid(p, uap)
- register struct proc *p;
+getresuid(td, uap)
+ register struct thread *td;
struct getresuid_args *uap;
{
struct ucred *cred;
+ struct proc *p = td->td_proc;
int error1 = 0, error2 = 0, error3 = 0;
mtx_lock(&Giant);
@@ -1111,11 +1131,12 @@ struct getresgid_args {
*/
/* ARGSUSED */
int
-getresgid(p, uap)
- register struct proc *p;
+getresgid(td, uap)
+ register struct thread *td;
struct getresgid_args *uap;
{
struct ucred *cred;
+ struct proc *p = td->td_proc;
int error1 = 0, error2 = 0, error3 = 0;
mtx_lock(&Giant);
@@ -1142,10 +1163,12 @@ struct issetugid_args {
#endif
/* ARGSUSED */
int
-issetugid(p, uap)
- register struct proc *p;
+issetugid(td, uap)
+ register struct thread *td;
struct issetugid_args *uap;
{
+ struct proc *p = td->td_proc;
+
/*
* Note: OpenBSD sets a P_SUGIDEXEC flag set at execve() time,
* we use P_SUGID because we consider changing the owners as
@@ -1154,7 +1177,7 @@ issetugid(p, uap)
* a user without an exec - programs cannot know *everything*
* that libc *might* have put in their data segment.
*/
- p->p_retval[0] = (p->p_flag & P_SUGID) ? 1 : 0;
+ td->td_retval[0] = (p->p_flag & P_SUGID) ? 1 : 0;
return (0);
}
@@ -1162,8 +1185,8 @@ issetugid(p, uap)
* MPSAFE
*/
int
-__setugid(p, uap)
- struct proc *p;
+__setugid(td, uap)
+ struct thread *td;
struct __setugid_args *uap;
{
#ifdef REGRESSION
@@ -1172,10 +1195,10 @@ __setugid(p, uap)
mtx_lock(&Giant);
switch (uap->flag) {
case 0:
- p->p_flag &= ~P_SUGID;
+ td->td_proc->p_flag &= ~P_SUGID;
break;
case 1:
- p->p_flag |= P_SUGID;
+ td->td_proc->p_flag |= P_SUGID;
break;
default:
error = EINVAL;
@@ -1231,6 +1254,30 @@ suser(p)
return suser_xxx(0, p, 0);
}
+/*
+ * version for when the thread pointer is available and not the proc.
+ * (saves having to include proc.h into every file that needs to do the change.)
+ */
+int
+suser_td(td)
+
+ struct thread *td;
+{
+ return suser_xxx(0, td->td_proc, 0);
+}
+
+/*
+ * wrapper to use if you have the thread on hand but not the proc.
+ */
+int
+suser_xxx_td(cred, td, flag)
+ struct ucred *cred;
+ struct thread *td;
+ int flag;
+{
+ return(suser_xxx(cred, td->td_proc, flag));
+}
+
int
suser_xxx(cred, proc, flag)
struct ucred *cred;
@@ -1566,11 +1613,12 @@ struct getlogin_args {
*/
/* ARGSUSED */
int
-getlogin(p, uap)
- struct proc *p;
+getlogin(td, uap)
+ struct thread *td;
struct getlogin_args *uap;
{
int error;
+ struct proc *p = td->td_proc;
mtx_lock(&Giant);
if (uap->namelen > MAXLOGNAME)
@@ -1594,10 +1642,11 @@ struct setlogin_args {
*/
/* ARGSUSED */
int
-setlogin(p, uap)
- struct proc *p;
+setlogin(td, uap)
+ struct thread *td;
struct setlogin_args *uap;
{
+ struct proc *p = td->td_proc;
int error;
char logintmp[MAXLOGNAME];
OpenPOWER on IntegriCloud