#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>
#include <sys/tty.h>
#include <sys/signalvar.h>
#include <sys/syslog.h>
+#include <sys/kernel_types.h>
/*
* Structure associated with user cacheing.
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"};
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;
* 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 */
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
*/
#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);
*/
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;
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);
}
hispgrp->pg_jobc++;
else if (--hispgrp->pg_jobc == 0)
orphanpg(hispgrp);
-}
+ }
}
/*
}
#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",