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