]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/kern_proc.c
xnu-792.tar.gz
[apple/xnu.git] / bsd / kern / kern_proc.c
index 2a46362175cde005fe03f67f8aee7009da31d10d..89a60a915f0a8bf191cc5ff7c9bcdd009e95ace4 100644 (file)
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
-#include <sys/proc.h>
-#include <sys/buf.h>
+#include <sys/proc_internal.h>
 #include <sys/acct.h>
 #include <sys/wait.h>
-#include <sys/file.h>
+#include <sys/file_internal.h>
 #include <ufs/ufs/quota.h>
 #include <sys/uio.h>
 #include <sys/malloc.h>
@@ -80,6 +79,7 @@
 #include <sys/tty.h>
 #include <sys/signalvar.h>
 #include <sys/syslog.h>
+#include <sys/kernel_types.h>
 
 /*
  * Structure associated with user cacheing.
@@ -102,6 +102,7 @@ struct pgrphashhead *pgrphashtbl;
 u_long pgrphash;
 struct proclist allproc;
 struct proclist zombproc;
+extern struct tty cons;
 
 /* Name to give to core files */
 __private_extern__ char corefilename[MAXPATHLEN+1] = {"/cores/core.%P"};
@@ -154,6 +155,8 @@ chgproccnt(uid, diff)
                panic("chgproccnt: lost user");
        }
        MALLOC_ZONE(uip, struct uidinfo *, sizeof(*uip), M_PROC, M_WAITOK);
+       if (uip == NULL)
+               panic("chgproccnt: M_PROC zone depleted");
        LIST_INSERT_HEAD(uipp, uip, ui_hash);
        uip->ui_uid = uid;
        uip->ui_proccnt = diff;
@@ -177,7 +180,7 @@ inferior(p)
  * Is p an inferior of t ?
  */
 int
-isinferior(struct proc *p, register struct proc *t)
+isinferior(struct proc *p, struct proc *t)
 {
 
        /* if p==t they are not inferior */
@@ -189,6 +192,186 @@ isinferior(struct proc *p, register struct proc *t)
        return (1);
 }
 
+int
+proc_isinferior(int pid1, int pid2)
+{
+       proc_t p;
+       proc_t t;
+
+       if (((p = pfind(pid1)) != (struct proc *)0 ) && ((t = pfind(pid2)) != (struct proc *)0))
+               return (isinferior(p, t));
+       return(0);
+}
+
+proc_t
+proc_find(int pid)
+{
+       return(pfind(pid));
+}
+
+int 
+proc_rele(__unused proc_t p)
+{
+       return(0);
+}
+
+proc_t
+proc_self()
+{
+       return(current_proc());
+}
+
+
+int
+proc_pid(proc_t p)
+{
+       return(p->p_pid);
+}
+
+int 
+proc_ppid(proc_t p)
+{
+       if (p->p_pptr != (struct proc *)0) 
+               return(p->p_pptr->p_pid);
+       return(0);
+}
+
+int 
+proc_selfpid(void)
+{
+       struct proc *p = current_proc();
+       return(p->p_pid);
+}
+
+
+int 
+proc_selfppid(void)
+{
+       struct proc *p = current_proc();
+       if (p->p_pptr)
+               return(p->p_pptr->p_pid);
+       else
+               return(0);
+}
+
+void
+proc_name(int pid, char * buf, int size)
+{
+       struct proc  *p;
+
+       if ((p = pfind(pid))!= (struct proc *)0) {
+               strncpy(buf, &p->p_comm[0], size);
+               buf[size-1] = 0;
+       }
+}
+
+void
+proc_selfname(char * buf, int  size)
+{
+       struct proc  *p;
+
+       if ((p = current_proc())!= (struct proc *)0) {
+               strncpy(buf, &p->p_comm[0], size);
+               buf[size-1] = 0;
+       }
+}
+
+void
+proc_signal(int pid, int signum)
+{
+       proc_t p;
+
+       if ((p = pfind(pid))!= (struct proc *)0) {
+                       psignal(p, signum);
+       }       
+}
+
+int
+proc_issignal(int pid, sigset_t mask)
+{
+       proc_t p;
+
+       if ((p = pfind(pid))!= (struct proc *)0) {
+               return(proc_pendingsignals(p, mask));
+       }       
+       return(0);
+}
+
+int
+proc_noremotehang(proc_t p)
+{
+       int retval = 0;
+
+       if (p)
+               retval = p->p_flag & P_NOREMOTEHANG;
+       return(retval? 1: 0);
+
+}
+
+int
+proc_exiting(proc_t p)
+{
+       int retval = 0;
+
+       if (p)
+               retval = p->p_flag & P_WEXIT;
+       return(retval? 1: 0);
+}
+
+
+int
+proc_forcequota(proc_t p)
+{
+       int retval = 0;
+
+       if (p)
+               retval = p->p_flag & P_FORCEQUOTA;
+       return(retval? 1: 0);
+
+}
+
+int
+proc_tbe(proc_t p)
+{
+       int retval = 0;
+
+       if (p)
+               retval = p->p_flag & P_TBE;
+       return(retval? 1: 0);
+
+}
+
+int
+proc_suser(proc_t p)
+{
+       return(suser(p->p_ucred, NULL));
+       
+}
+
+kauth_cred_t
+proc_ucred(proc_t p)
+{
+       return(p->p_ucred);
+}
+
+
+int
+proc_is64bit(proc_t p)
+{
+       return(IS_64BIT_PROCESS(p));
+}
+
+/* LP64todo - figure out how to identify 64-bit processes if NULL procp */
+int
+IS_64BIT_PROCESS(proc_t p)
+{
+       if (p && (p->p_flag & P_LP64))
+               return(1);
+       else
+               return(0);
+}
+
+
 /*
  * Locate a process by number
  */
@@ -267,6 +450,8 @@ enterpgrp(p, pgid, mksess)
 #endif
                MALLOC_ZONE(pgrp, struct pgrp *, sizeof(struct pgrp), M_PGRP,
                    M_WAITOK);
+               if (pgrp == NULL)
+                       panic("enterpgrp: M_PGRP zone depleted");
                if ((np = pfind(savepid)) == NULL || np != p) {
                        FREE_ZONE(pgrp, sizeof(struct pgrp), M_PGRP);
                        return (ESRCH);
@@ -279,6 +464,8 @@ enterpgrp(p, pgid, mksess)
                         */
                        MALLOC_ZONE(sess, struct session *,
                                sizeof(struct session), M_SESSION, M_WAITOK);
+                       if (sess == NULL)
+                               panic("enterpgrp: M_SESSION zone depleted");
                        sess->s_leader = p;
                        sess->s_sid = p->p_pid;
                        sess->s_count = 1;
@@ -341,13 +528,21 @@ void
 pgdelete(pgrp)
        register struct pgrp *pgrp;
 {
+       struct tty * ttyp;
+       int removettypgrp = 0;
 
+       ttyp = pgrp->pg_session->s_ttyp;
        if (pgrp->pg_session->s_ttyp != NULL && 
-           pgrp->pg_session->s_ttyp->t_pgrp == pgrp)
+           pgrp->pg_session->s_ttyp->t_pgrp == pgrp) {
                pgrp->pg_session->s_ttyp->t_pgrp = NULL;
+               removettypgrp = 1;
+       }
        LIST_REMOVE(pgrp, pg_hash);
-       if (--pgrp->pg_session->s_count == 0)
+       if (--pgrp->pg_session->s_count == 0) {
+               if (removettypgrp && (ttyp == &cons) && (ttyp->t_session == pgrp->pg_session))
+                       ttyp->t_session = 0;
                FREE_ZONE(pgrp->pg_session, sizeof(struct session), M_SESSION);
+       }
        FREE_ZONE(pgrp, sizeof *pgrp, M_PGRP);
 }
 
@@ -400,7 +595,7 @@ fixjobc(struct proc *p, struct pgrp *pgrp, int entering)
                                hispgrp->pg_jobc++;
                        else if (--hispgrp->pg_jobc == 0)
                                orphanpg(hispgrp);
-}
+               }
 }
 
 /* 
@@ -427,15 +622,17 @@ orphanpg(struct pgrp *pg)
 }
 
 #ifdef DEBUG
+void pgrpdump(void);   /* forward declare here (called from debugger) */
+
 void
-pgrpdump()
+pgrpdump(void)
 {
-       register struct pgrp *pgrp;
-       register struct proc *p;
-       register i;
+       struct pgrp *pgrp;
+       struct proc *p;
+       u_long i;
 
        for (i = 0; i <= pgrphash; i++) {
-               if (pgrp = pgrphashtbl[i].lh_first) {
+               if ((pgrp = pgrphashtbl[i].lh_first) != NULL) {
                        printf("\tindx %d\n", i);
                        for (; pgrp != 0; pgrp = pgrp->pg_hash.le_next) {
                                printf("\tpgrp 0x%08x, pgid %d, sess %p, sesscnt %d, mem %p\n",