1df8bae1dSRodney W. Grimes /* 2df8bae1dSRodney W. Grimes * Copyright (c) 1993 Jan-Simon Pendry 3df8bae1dSRodney W. Grimes * Copyright (c) 1993 4df8bae1dSRodney W. Grimes * The Regents of the University of California. All rights reserved. 5df8bae1dSRodney W. Grimes * 6df8bae1dSRodney W. Grimes * This code is derived from software contributed to Berkeley by 7df8bae1dSRodney W. Grimes * Jan-Simon Pendry. 8df8bae1dSRodney W. Grimes * 9df8bae1dSRodney W. Grimes * Redistribution and use in source and binary forms, with or without 10df8bae1dSRodney W. Grimes * modification, are permitted provided that the following conditions 11df8bae1dSRodney W. Grimes * are met: 12df8bae1dSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 13df8bae1dSRodney W. Grimes * notice, this list of conditions and the following disclaimer. 14df8bae1dSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 15df8bae1dSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 16df8bae1dSRodney W. Grimes * documentation and/or other materials provided with the distribution. 17df8bae1dSRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 18df8bae1dSRodney W. Grimes * must display the following acknowledgement: 19df8bae1dSRodney W. Grimes * This product includes software developed by the University of 20df8bae1dSRodney W. Grimes * California, Berkeley and its contributors. 21df8bae1dSRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 22df8bae1dSRodney W. Grimes * may be used to endorse or promote products derived from this software 23df8bae1dSRodney W. Grimes * without specific prior written permission. 24df8bae1dSRodney W. Grimes * 25df8bae1dSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26df8bae1dSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27df8bae1dSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28df8bae1dSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29df8bae1dSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30df8bae1dSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31df8bae1dSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32df8bae1dSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33df8bae1dSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34df8bae1dSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35df8bae1dSRodney W. Grimes * SUCH DAMAGE. 36df8bae1dSRodney W. Grimes * 37996c772fSJohn Dyson * @(#)procfs_status.c 8.4 (Berkeley) 6/15/94 38df8bae1dSRodney W. Grimes * 39996c772fSJohn Dyson * From: 4075c13541SPoul-Henning Kamp * $Id: procfs_status.c,v 1.12 1999/01/05 03:53:06 peter Exp $ 41df8bae1dSRodney W. Grimes */ 42df8bae1dSRodney W. Grimes 43df8bae1dSRodney W. Grimes #include <sys/param.h> 44df8bae1dSRodney W. Grimes #include <sys/systm.h> 45df8bae1dSRodney W. Grimes #include <sys/proc.h> 4675c13541SPoul-Henning Kamp #include <sys/jail.h> 47df8bae1dSRodney W. Grimes #include <sys/vnode.h> 48df8bae1dSRodney W. Grimes #include <sys/tty.h> 49df8bae1dSRodney W. Grimes #include <sys/resourcevar.h> 50df8bae1dSRodney W. Grimes #include <miscfs/procfs/procfs.h> 51df8bae1dSRodney W. Grimes 52df8bae1dSRodney W. Grimes int 53df8bae1dSRodney W. Grimes procfs_dostatus(curp, p, pfs, uio) 54df8bae1dSRodney W. Grimes struct proc *curp; 55df8bae1dSRodney W. Grimes struct proc *p; 56df8bae1dSRodney W. Grimes struct pfsnode *pfs; 57df8bae1dSRodney W. Grimes struct uio *uio; 58df8bae1dSRodney W. Grimes { 59df8bae1dSRodney W. Grimes struct session *sess; 60df8bae1dSRodney W. Grimes struct tty *tp; 61df8bae1dSRodney W. Grimes struct ucred *cr; 62df8bae1dSRodney W. Grimes char *ps; 63df8bae1dSRodney W. Grimes char *sep; 64df8bae1dSRodney W. Grimes int pid, ppid, pgid, sid; 65df8bae1dSRodney W. Grimes int i; 66df8bae1dSRodney W. Grimes int xlen; 67df8bae1dSRodney W. Grimes int error; 68df8bae1dSRodney W. Grimes char psbuf[256]; /* XXX - conservative */ 69df8bae1dSRodney W. Grimes 70df8bae1dSRodney W. Grimes if (uio->uio_rw != UIO_READ) 71df8bae1dSRodney W. Grimes return (EOPNOTSUPP); 72df8bae1dSRodney W. Grimes 73df8bae1dSRodney W. Grimes pid = p->p_pid; 74df8bae1dSRodney W. Grimes ppid = p->p_pptr ? p->p_pptr->p_pid : 0, 75df8bae1dSRodney W. Grimes pgid = p->p_pgrp->pg_id; 76df8bae1dSRodney W. Grimes sess = p->p_pgrp->pg_session; 77df8bae1dSRodney W. Grimes sid = sess->s_leader ? sess->s_leader->p_pid : 0; 78df8bae1dSRodney W. Grimes 791d08058fSWolfram Schneider /* comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg 801d08058fSWolfram Schneider euid ruid rgid,egid,groups[1 .. NGROUPS] 811d08058fSWolfram Schneider */ 82df8bae1dSRodney W. Grimes ps = psbuf; 83df8bae1dSRodney W. Grimes bcopy(p->p_comm, ps, MAXCOMLEN); 84df8bae1dSRodney W. Grimes ps[MAXCOMLEN] = '\0'; 85df8bae1dSRodney W. Grimes ps += strlen(ps); 86df8bae1dSRodney W. Grimes ps += sprintf(ps, " %d %d %d %d ", pid, ppid, pgid, sid); 87df8bae1dSRodney W. Grimes 88df8bae1dSRodney W. Grimes if ((p->p_flag&P_CONTROLT) && (tp = sess->s_ttyp)) 89df8bae1dSRodney W. Grimes ps += sprintf(ps, "%d,%d ", major(tp->t_dev), minor(tp->t_dev)); 90df8bae1dSRodney W. Grimes else 91df8bae1dSRodney W. Grimes ps += sprintf(ps, "%d,%d ", -1, -1); 92df8bae1dSRodney W. Grimes 93df8bae1dSRodney W. Grimes sep = ""; 94df8bae1dSRodney W. Grimes if (sess->s_ttyvp) { 95df8bae1dSRodney W. Grimes ps += sprintf(ps, "%sctty", sep); 96df8bae1dSRodney W. Grimes sep = ","; 97df8bae1dSRodney W. Grimes } 98df8bae1dSRodney W. Grimes if (SESS_LEADER(p)) { 99df8bae1dSRodney W. Grimes ps += sprintf(ps, "%ssldr", sep); 100df8bae1dSRodney W. Grimes sep = ","; 101df8bae1dSRodney W. Grimes } 102df8bae1dSRodney W. Grimes if (*sep != ',') 103df8bae1dSRodney W. Grimes ps += sprintf(ps, "noflags"); 104df8bae1dSRodney W. Grimes 105df8bae1dSRodney W. Grimes if (p->p_flag & P_INMEM) 1063a773ad0SPoul-Henning Kamp ps += sprintf(ps, " %ld,%ld", 107df8bae1dSRodney W. Grimes p->p_stats->p_start.tv_sec, 108df8bae1dSRodney W. Grimes p->p_stats->p_start.tv_usec); 109df8bae1dSRodney W. Grimes else 110df8bae1dSRodney W. Grimes ps += sprintf(ps, " -1,-1"); 111df8bae1dSRodney W. Grimes 112df8bae1dSRodney W. Grimes { 113df8bae1dSRodney W. Grimes struct timeval ut, st; 114df8bae1dSRodney W. Grimes 115df8bae1dSRodney W. Grimes calcru(p, &ut, &st, (void *) 0); 1163a773ad0SPoul-Henning Kamp ps += sprintf(ps, " %ld,%ld %ld,%ld", 117df8bae1dSRodney W. Grimes ut.tv_sec, 118df8bae1dSRodney W. Grimes ut.tv_usec, 119df8bae1dSRodney W. Grimes st.tv_sec, 120df8bae1dSRodney W. Grimes st.tv_usec); 121df8bae1dSRodney W. Grimes } 122df8bae1dSRodney W. Grimes 123df8bae1dSRodney W. Grimes ps += sprintf(ps, " %s", 124df8bae1dSRodney W. Grimes (p->p_wchan && p->p_wmesg) ? p->p_wmesg : "nochan"); 125df8bae1dSRodney W. Grimes 126df8bae1dSRodney W. Grimes cr = p->p_ucred; 127df8bae1dSRodney W. Grimes 128ac1e407bSBruce Evans ps += sprintf(ps, " %lu %lu %lu", 129ac1e407bSBruce Evans (u_long)cr->cr_uid, 130ac1e407bSBruce Evans (u_long)p->p_cred->p_ruid, 131ac1e407bSBruce Evans (u_long)p->p_cred->p_rgid); 1321d08058fSWolfram Schneider 1331d08058fSWolfram Schneider /* egid (p->p_cred->p_svgid) is equal to cr_ngroups[0] 1341d08058fSWolfram Schneider see also getegid(2) in /sys/kern/kern_prot.c */ 1351d08058fSWolfram Schneider 136df8bae1dSRodney W. Grimes for (i = 0; i < cr->cr_ngroups; i++) 137ac1e407bSBruce Evans ps += sprintf(ps, ",%lu", (u_long)cr->cr_groups[i]); 13875c13541SPoul-Henning Kamp 13975c13541SPoul-Henning Kamp if (p->p_prison) 14075c13541SPoul-Henning Kamp ps += sprintf(ps, " %s", p->p_prison->pr_host); 14175c13541SPoul-Henning Kamp else 14275c13541SPoul-Henning Kamp ps += sprintf(ps, " -"); 143df8bae1dSRodney W. Grimes ps += sprintf(ps, "\n"); 144df8bae1dSRodney W. Grimes 145df8bae1dSRodney W. Grimes xlen = ps - psbuf; 146df8bae1dSRodney W. Grimes xlen -= uio->uio_offset; 147df8bae1dSRodney W. Grimes ps = psbuf + uio->uio_offset; 148996c772fSJohn Dyson xlen = imin(xlen, uio->uio_resid); 149df8bae1dSRodney W. Grimes if (xlen <= 0) 150df8bae1dSRodney W. Grimes error = 0; 151df8bae1dSRodney W. Grimes else 152df8bae1dSRodney W. Grimes error = uiomove(ps, xlen, uio); 153df8bae1dSRodney W. Grimes 154df8bae1dSRodney W. Grimes return (error); 155df8bae1dSRodney W. Grimes } 15675ba7757SPeter Wemm 15775ba7757SPeter Wemm int 15875ba7757SPeter Wemm procfs_docmdline(curp, p, pfs, uio) 15975ba7757SPeter Wemm struct proc *curp; 16075ba7757SPeter Wemm struct proc *p; 16175ba7757SPeter Wemm struct pfsnode *pfs; 16275ba7757SPeter Wemm struct uio *uio; 16375ba7757SPeter Wemm { 16475ba7757SPeter Wemm char *ps; 16575ba7757SPeter Wemm int xlen; 16675ba7757SPeter Wemm int error; 16775ba7757SPeter Wemm char psbuf[256]; 16875ba7757SPeter Wemm 16975ba7757SPeter Wemm if (uio->uio_rw != UIO_READ) 17075ba7757SPeter Wemm return (EOPNOTSUPP); 17175ba7757SPeter Wemm 17275ba7757SPeter Wemm /* 17375ba7757SPeter Wemm * For now, this is a hack. To implement this fully would require 17475ba7757SPeter Wemm * groping around in the process address space to follow argv etc. 17575ba7757SPeter Wemm */ 17675ba7757SPeter Wemm ps = psbuf; 17775ba7757SPeter Wemm bcopy(p->p_comm, ps, MAXCOMLEN); 17875ba7757SPeter Wemm ps[MAXCOMLEN] = '\0'; 17975ba7757SPeter Wemm ps += strlen(ps); 18075ba7757SPeter Wemm 18175ba7757SPeter Wemm ps += sprintf(ps, "\n"); 18275ba7757SPeter Wemm 18375ba7757SPeter Wemm xlen = ps - psbuf; 18475ba7757SPeter Wemm xlen -= uio->uio_offset; 18575ba7757SPeter Wemm ps = psbuf + uio->uio_offset; 18675ba7757SPeter Wemm xlen = min(xlen, uio->uio_resid); 18775ba7757SPeter Wemm if (xlen <= 0) 18875ba7757SPeter Wemm error = 0; 18975ba7757SPeter Wemm else 19075ba7757SPeter Wemm error = uiomove(ps, xlen, uio); 19175ba7757SPeter Wemm return (error); 19275ba7757SPeter Wemm } 193