165523Spendry /*
265523Spendry  * Copyright (c) 1993 Jan-Simon Pendry
365809Sbostic  * Copyright (c) 1993
465809Sbostic  *	The Regents of the University of California.  All rights reserved.
565523Spendry  *
665523Spendry  * This code is derived from software contributed to Berkeley by
765523Spendry  * Jan-Simon Pendry.
865523Spendry  *
965523Spendry  * %sccs.include.redist.c%
1065523Spendry  *
11*67389Spendry  *	@(#)procfs_status.c	8.4 (Berkeley) 06/15/94
1265523Spendry  *
1365523Spendry  * From:
1465523Spendry  *	$Id: procfs_status.c,v 3.1 1993/12/15 09:40:17 jsp Exp $
1565523Spendry  */
1665523Spendry 
1765523Spendry #include <sys/param.h>
1865523Spendry #include <sys/systm.h>
1965523Spendry #include <sys/time.h>
2065523Spendry #include <sys/kernel.h>
2165523Spendry #include <sys/proc.h>
2265523Spendry #include <sys/vnode.h>
2365523Spendry #include <sys/ioctl.h>
2465523Spendry #include <sys/tty.h>
2565523Spendry #include <sys/resource.h>
2665523Spendry #include <sys/resourcevar.h>
2765523Spendry #include <miscfs/procfs/procfs.h>
2865523Spendry 
2965523Spendry int
procfs_dostatus(curp,p,pfs,uio)3065523Spendry procfs_dostatus(curp, p, pfs, uio)
3165523Spendry 	struct proc *curp;
3265523Spendry 	struct proc *p;
3365523Spendry 	struct pfsnode *pfs;
3465523Spendry 	struct uio *uio;
3565523Spendry {
3665523Spendry 	struct session *sess;
3765523Spendry 	struct tty *tp;
3865523Spendry 	struct ucred *cr;
3965523Spendry 	char *ps;
4065523Spendry 	char *sep;
4165523Spendry 	int pid, ppid, pgid, sid;
4265523Spendry 	int i;
4365523Spendry 	int xlen;
4465523Spendry 	int error;
4565523Spendry 	char psbuf[256];		/* XXX - conservative */
4665523Spendry 
4765523Spendry 	if (uio->uio_rw != UIO_READ)
4865523Spendry 		return (EOPNOTSUPP);
4965523Spendry 
5065523Spendry 	pid = p->p_pid;
5165523Spendry 	ppid = p->p_pptr ? p->p_pptr->p_pid : 0,
5265523Spendry 	pgid = p->p_pgrp->pg_id;
5365523Spendry 	sess = p->p_pgrp->pg_session;
5465523Spendry 	sid = sess->s_leader ? sess->s_leader->p_pid : 0;
5565523Spendry 
5665523Spendry /* comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg uid groups ... */
5765523Spendry 
5865523Spendry 	ps = psbuf;
5965523Spendry 	bcopy(p->p_comm, ps, MAXCOMLEN);
6065523Spendry 	ps[MAXCOMLEN] = '\0';
6165523Spendry 	ps += strlen(ps);
6265523Spendry 	ps += sprintf(ps, " %d %d %d %d ", pid, ppid, pgid, sid);
6365523Spendry 
6465523Spendry 	if ((p->p_flag&P_CONTROLT) && (tp = sess->s_ttyp))
6565523Spendry 		ps += sprintf(ps, "%d,%d ", major(tp->t_dev), minor(tp->t_dev));
6665523Spendry 	else
6765523Spendry 		ps += sprintf(ps, "%d,%d ", -1, -1);
6865523Spendry 
6965523Spendry 	sep = "";
7065523Spendry 	if (sess->s_ttyvp) {
7165523Spendry 		ps += sprintf(ps, "%sctty", sep);
7265523Spendry 		sep = ",";
7365523Spendry 	}
7465523Spendry 	if (SESS_LEADER(p)) {
7565523Spendry 		ps += sprintf(ps, "%ssldr", sep);
7665523Spendry 		sep = ",";
7765523Spendry 	}
7865523Spendry 	if (*sep != ',')
7965523Spendry 		ps += sprintf(ps, "noflags");
8065523Spendry 
8165523Spendry 	if (p->p_flag & P_INMEM)
8266142Spendry 		ps += sprintf(ps, " %d,%d",
8365523Spendry 			p->p_stats->p_start.tv_sec,
8465523Spendry 			p->p_stats->p_start.tv_usec);
8565523Spendry 	else
8666142Spendry 		ps += sprintf(ps, " -1,-1");
8765523Spendry 
8865523Spendry 	{
8965523Spendry 		struct timeval ut, st;
9065523Spendry 
9165523Spendry 		calcru(p, &ut, &st, (void *) 0);
9266142Spendry 		ps += sprintf(ps, " %d,%d %d,%d",
9365523Spendry 			ut.tv_sec,
9465523Spendry 			ut.tv_usec,
9565523Spendry 			st.tv_sec,
9665523Spendry 			st.tv_usec);
9765523Spendry 	}
9865523Spendry 
9965523Spendry 	ps += sprintf(ps, " %s",
10065523Spendry 		(p->p_wchan && p->p_wmesg) ? p->p_wmesg : "nochan");
10165523Spendry 
10265523Spendry 	cr = p->p_ucred;
10365523Spendry 
104*67389Spendry 	ps += sprintf(ps, " %d", cr->cr_uid);
10565523Spendry 	for (i = 0; i < cr->cr_ngroups; i++)
10666142Spendry 		ps += sprintf(ps, ",%d", cr->cr_groups[i]);
10765523Spendry 	ps += sprintf(ps, "\n");
10865523Spendry 
10965523Spendry 	xlen = ps - psbuf;
11065523Spendry 	xlen -= uio->uio_offset;
11165523Spendry 	ps = psbuf + uio->uio_offset;
112*67389Spendry 	xlen = imin(xlen, uio->uio_resid);
11365523Spendry 	if (xlen <= 0)
11465523Spendry 		error = 0;
11565523Spendry 	else
11665523Spendry 		error = uiomove(ps, xlen, uio);
11765523Spendry 
11865523Spendry 	return (error);
11965523Spendry }
120