+
+/*
+ * Fill in an eproc structure for the specified process.
+ */
+void
+fill_eproc(p, ep)
+ register struct proc *p;
+ register struct eproc *ep;
+{
+ register struct tty *tp;
+
+ ep->e_paddr = p;
+ ep->e_sess = p->p_pgrp->pg_session;
+ ep->e_pcred = *p->p_cred;
+ ep->e_ucred = *p->p_ucred;
+ ep->e_vm = *p->p_vmspace;
+ if (p->p_pptr)
+ ep->e_ppid = p->p_pptr->p_pid;
+ else
+ ep->e_ppid = 0;
+ ep->e_pgid = p->p_pgrp->pg_id;
+ ep->e_jobc = p->p_pgrp->pg_jobc;
+ if ((p->p_flag&SCTTY) &&
+ (tp = ep->e_sess->s_ttyp)) {
+ ep->e_tdev = tp->t_dev;
+ ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
+ ep->e_tsess = tp->t_session;
+ } else
+ ep->e_tdev = NODEV;
+ ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0;
+ if (SESS_LEADER(p))
+ ep->e_flag |= EPROC_SLEADER;
+ if (p->p_wmesg)
+ strncpy(ep->e_wmesg, p->p_wmesg, WMESGLEN);
+ ep->e_xsize = ep->e_xrssize = 0;
+ ep->e_xccount = ep->e_xswrss = 0;
+}
+
+/*
+ * Get file structures.
+ */
+kinfo_file(op, where, acopysize, arg, aneeded)
+ register char *where;
+ int *acopysize, *aneeded;
+{
+ int buflen, needed, error;
+ struct file *fp;
+ char *start = where;
+
+ if (where == NULL) {
+ /*
+ * overestimate by 10 files
+ */
+ *aneeded = sizeof (filehead) +
+ (nfiles + 10) * sizeof (struct file);
+ return (0);
+ }
+ buflen = *acopysize;
+ needed = 0;
+
+ /*
+ * first copyout filehead
+ */
+ if (buflen > sizeof (filehead)) {
+ if (error = copyout((caddr_t)&filehead, where,
+ sizeof (filehead)))
+ return (error);
+ buflen -= sizeof (filehead);
+ where += sizeof (filehead);
+ }
+ needed += sizeof (filehead);
+
+ /*
+ * followed by an array of file structures
+ */
+ for (fp = filehead; fp != NULL; fp = fp->f_filef) {
+ if (buflen > sizeof (struct file)) {
+ if (error = copyout((caddr_t)fp, where,
+ sizeof (struct file)))
+ return (error);
+ buflen -= sizeof (struct file);
+ where += sizeof (struct file);
+ }
+ needed += sizeof (struct file);
+ }
+ *acopysize = where - start;
+ *aneeded = needed;
+
+ return (0);
+}