165523Spendry /* 265523Spendry * Copyright (c) 1993 Jan-Simon Pendry 3*65809Sbostic * Copyright (c) 1993 4*65809Sbostic * 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*65809Sbostic * @(#)procfs_status.c 8.2 (Berkeley) 01/21/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 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) 8265523Spendry ps += sprintf(ps, " %d %d", 8365523Spendry p->p_stats->p_start.tv_sec, 8465523Spendry p->p_stats->p_start.tv_usec); 8565523Spendry else 8665523Spendry ps += sprintf(ps, " -1 -1"); 8765523Spendry 8865523Spendry { 8965523Spendry struct timeval ut, st; 9065523Spendry 9165523Spendry calcru(p, &ut, &st, (void *) 0); 9265523Spendry 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 10465523Spendry ps += sprintf(ps, " %d %d", cr->cr_uid, cr->cr_gid); 10565523Spendry for (i = 0; i < cr->cr_ngroups; i++) 10665523Spendry 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; 11265523Spendry xlen = min(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