1*65523Spendry /* 2*65523Spendry * Copyright (c) 1993 The Regents of the University of California. 3*65523Spendry * Copyright (c) 1993 Jan-Simon Pendry 4*65523Spendry * All rights reserved. 5*65523Spendry * 6*65523Spendry * This code is derived from software contributed to Berkeley by 7*65523Spendry * Jan-Simon Pendry. 8*65523Spendry * 9*65523Spendry * %sccs.include.redist.c% 10*65523Spendry * 11*65523Spendry * @(#)procfs_status.c 8.1 (Berkeley) 01/05/94 12*65523Spendry * 13*65523Spendry * From: 14*65523Spendry * $Id: procfs_status.c,v 3.1 1993/12/15 09:40:17 jsp Exp $ 15*65523Spendry */ 16*65523Spendry 17*65523Spendry #include <sys/param.h> 18*65523Spendry #include <sys/systm.h> 19*65523Spendry #include <sys/time.h> 20*65523Spendry #include <sys/kernel.h> 21*65523Spendry #include <sys/proc.h> 22*65523Spendry #include <sys/vnode.h> 23*65523Spendry #include <sys/ioctl.h> 24*65523Spendry #include <sys/tty.h> 25*65523Spendry #include <sys/resource.h> 26*65523Spendry #include <sys/resourcevar.h> 27*65523Spendry #include <miscfs/procfs/procfs.h> 28*65523Spendry 29*65523Spendry int 30*65523Spendry procfs_dostatus(curp, p, pfs, uio) 31*65523Spendry struct proc *curp; 32*65523Spendry struct proc *p; 33*65523Spendry struct pfsnode *pfs; 34*65523Spendry struct uio *uio; 35*65523Spendry { 36*65523Spendry struct session *sess; 37*65523Spendry struct tty *tp; 38*65523Spendry struct ucred *cr; 39*65523Spendry char *ps; 40*65523Spendry char *sep; 41*65523Spendry int pid, ppid, pgid, sid; 42*65523Spendry int i; 43*65523Spendry int xlen; 44*65523Spendry int error; 45*65523Spendry char psbuf[256]; /* XXX - conservative */ 46*65523Spendry 47*65523Spendry if (uio->uio_rw != UIO_READ) 48*65523Spendry return (EOPNOTSUPP); 49*65523Spendry 50*65523Spendry pid = p->p_pid; 51*65523Spendry ppid = p->p_pptr ? p->p_pptr->p_pid : 0, 52*65523Spendry pgid = p->p_pgrp->pg_id; 53*65523Spendry sess = p->p_pgrp->pg_session; 54*65523Spendry sid = sess->s_leader ? sess->s_leader->p_pid : 0; 55*65523Spendry 56*65523Spendry /* comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg uid groups ... */ 57*65523Spendry 58*65523Spendry ps = psbuf; 59*65523Spendry bcopy(p->p_comm, ps, MAXCOMLEN); 60*65523Spendry ps[MAXCOMLEN] = '\0'; 61*65523Spendry ps += strlen(ps); 62*65523Spendry ps += sprintf(ps, " %d %d %d %d ", pid, ppid, pgid, sid); 63*65523Spendry 64*65523Spendry if ((p->p_flag&P_CONTROLT) && (tp = sess->s_ttyp)) 65*65523Spendry ps += sprintf(ps, "%d,%d ", major(tp->t_dev), minor(tp->t_dev)); 66*65523Spendry else 67*65523Spendry ps += sprintf(ps, "%d,%d ", -1, -1); 68*65523Spendry 69*65523Spendry sep = ""; 70*65523Spendry if (sess->s_ttyvp) { 71*65523Spendry ps += sprintf(ps, "%sctty", sep); 72*65523Spendry sep = ","; 73*65523Spendry } 74*65523Spendry if (SESS_LEADER(p)) { 75*65523Spendry ps += sprintf(ps, "%ssldr", sep); 76*65523Spendry sep = ","; 77*65523Spendry } 78*65523Spendry if (*sep != ',') 79*65523Spendry ps += sprintf(ps, "noflags"); 80*65523Spendry 81*65523Spendry if (p->p_flag & P_INMEM) 82*65523Spendry ps += sprintf(ps, " %d %d", 83*65523Spendry p->p_stats->p_start.tv_sec, 84*65523Spendry p->p_stats->p_start.tv_usec); 85*65523Spendry else 86*65523Spendry ps += sprintf(ps, " -1 -1"); 87*65523Spendry 88*65523Spendry { 89*65523Spendry struct timeval ut, st; 90*65523Spendry 91*65523Spendry calcru(p, &ut, &st, (void *) 0); 92*65523Spendry ps += sprintf(ps, " %d %d %d %d", 93*65523Spendry ut.tv_sec, 94*65523Spendry ut.tv_usec, 95*65523Spendry st.tv_sec, 96*65523Spendry st.tv_usec); 97*65523Spendry } 98*65523Spendry 99*65523Spendry ps += sprintf(ps, " %s", 100*65523Spendry (p->p_wchan && p->p_wmesg) ? p->p_wmesg : "nochan"); 101*65523Spendry 102*65523Spendry cr = p->p_ucred; 103*65523Spendry 104*65523Spendry ps += sprintf(ps, " %d %d", cr->cr_uid, cr->cr_gid); 105*65523Spendry for (i = 0; i < cr->cr_ngroups; i++) 106*65523Spendry ps += sprintf(ps, " %d", cr->cr_groups[i]); 107*65523Spendry ps += sprintf(ps, "\n"); 108*65523Spendry 109*65523Spendry xlen = ps - psbuf; 110*65523Spendry xlen -= uio->uio_offset; 111*65523Spendry ps = psbuf + uio->uio_offset; 112*65523Spendry xlen = min(xlen, uio->uio_resid); 113*65523Spendry if (xlen <= 0) 114*65523Spendry error = 0; 115*65523Spendry else 116*65523Spendry error = uiomove(ps, xlen, uio); 117*65523Spendry 118*65523Spendry return (error); 119*65523Spendry } 120