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