xref: /minix3/external/bsd/top/dist/machine/m_svr5.c (revision b89261ba018da33f0bd8cd05f5a1fe9e7a9c837b)
1*b89261baSDavid van Moolenbroek /*
2*b89261baSDavid van Moolenbroek  * Copyright (c) 1984 through 2008, William LeFebvre
3*b89261baSDavid van Moolenbroek  * All rights reserved.
4*b89261baSDavid van Moolenbroek  *
5*b89261baSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
6*b89261baSDavid van Moolenbroek  * modification, are permitted provided that the following conditions are met:
7*b89261baSDavid van Moolenbroek  *
8*b89261baSDavid van Moolenbroek  *     * Redistributions of source code must retain the above copyright
9*b89261baSDavid van Moolenbroek  * notice, this list of conditions and the following disclaimer.
10*b89261baSDavid van Moolenbroek  *
11*b89261baSDavid van Moolenbroek  *     * Redistributions in binary form must reproduce the above
12*b89261baSDavid van Moolenbroek  * copyright notice, this list of conditions and the following disclaimer
13*b89261baSDavid van Moolenbroek  * in the documentation and/or other materials provided with the
14*b89261baSDavid van Moolenbroek  * distribution.
15*b89261baSDavid van Moolenbroek  *
16*b89261baSDavid van Moolenbroek  *     * Neither the name of William LeFebvre nor the names of other
17*b89261baSDavid van Moolenbroek  * contributors may be used to endorse or promote products derived from
18*b89261baSDavid van Moolenbroek  * this software without specific prior written permission.
19*b89261baSDavid van Moolenbroek  *
20*b89261baSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*b89261baSDavid van Moolenbroek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*b89261baSDavid van Moolenbroek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*b89261baSDavid van Moolenbroek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*b89261baSDavid van Moolenbroek  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*b89261baSDavid van Moolenbroek  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*b89261baSDavid van Moolenbroek  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*b89261baSDavid van Moolenbroek  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*b89261baSDavid van Moolenbroek  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*b89261baSDavid van Moolenbroek  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*b89261baSDavid van Moolenbroek  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*b89261baSDavid van Moolenbroek  */
32*b89261baSDavid van Moolenbroek 
33*b89261baSDavid van Moolenbroek /*
34*b89261baSDavid van Moolenbroek  * top - a top users display for Unix
35*b89261baSDavid van Moolenbroek  *
36*b89261baSDavid van Moolenbroek  * SYNOPSIS:  For Intel based System V Release 5 (Unixware7)
37*b89261baSDavid van Moolenbroek  *
38*b89261baSDavid van Moolenbroek  * DESCRIPTION:
39*b89261baSDavid van Moolenbroek  * System V release 5 for i[3456]86
40*b89261baSDavid van Moolenbroek  * Works for:
41*b89261baSDavid van Moolenbroek  * i586-sco-sysv5uw7  i386 SCO UNIX_SVR5 (UnixWare 7)
42*b89261baSDavid van Moolenbroek  *
43*b89261baSDavid van Moolenbroek  * LIBS:  -lelf -lmas
44*b89261baSDavid van Moolenbroek  *
45*b89261baSDavid van Moolenbroek  * CFLAGS: -DHAVE_GETOPT -DORDER
46*b89261baSDavid van Moolenbroek  *
47*b89261baSDavid van Moolenbroek  * AUTHORS: Mike Hopkirk       <hops@sco.com>
48*b89261baSDavid van Moolenbroek  *          David Cutter       <dpc@grail.com>
49*b89261baSDavid van Moolenbroek  *          Andrew Herbert     <andrew@werple.apana.org.au>
50*b89261baSDavid van Moolenbroek  *          Robert Boucher     <boucher@sofkin.ca>
51*b89261baSDavid van Moolenbroek  */
52*b89261baSDavid van Moolenbroek 
53*b89261baSDavid van Moolenbroek /* build config
54*b89261baSDavid van Moolenbroek  *  SHOW_NICE - process nice fields don't seem to be being updated so changed
55*b89261baSDavid van Moolenbroek  *     default to display # of threads in use instead.
56*b89261baSDavid van Moolenbroek  *     define this to display nice fields (values always 0)
57*b89261baSDavid van Moolenbroek  * #define SHOW_NICE 1
58*b89261baSDavid van Moolenbroek  */
59*b89261baSDavid van Moolenbroek 
60*b89261baSDavid van Moolenbroek #define _KMEMUSER
61*b89261baSDavid van Moolenbroek #define prpsinfo psinfo
62*b89261baSDavid van Moolenbroek #include <sys/procfs.h>
63*b89261baSDavid van Moolenbroek 
64*b89261baSDavid van Moolenbroek #define pr_state pr_lwp.pr_state
65*b89261baSDavid van Moolenbroek #define pr_nice pr_lwp.pr_nice
66*b89261baSDavid van Moolenbroek #define pr_pri pr_lwp.pr_pri
67*b89261baSDavid van Moolenbroek #define pr_onpro pr_lwp.pr_onpro
68*b89261baSDavid van Moolenbroek #define ZOMBIE(p)	((p)->pr_nlwp == 0)
69*b89261baSDavid van Moolenbroek #define SIZE_K(p)	pagetok((p)->pr_size)
70*b89261baSDavid van Moolenbroek #define RSS_K(p)	pagetok((p)->pr_rssize)
71*b89261baSDavid van Moolenbroek 
72*b89261baSDavid van Moolenbroek 
73*b89261baSDavid van Moolenbroek #include <stdio.h>
74*b89261baSDavid van Moolenbroek #include <fcntl.h>
75*b89261baSDavid van Moolenbroek #include <unistd.h>
76*b89261baSDavid van Moolenbroek #include <stdlib.h>
77*b89261baSDavid van Moolenbroek #include <errno.h>
78*b89261baSDavid van Moolenbroek #include <dirent.h>
79*b89261baSDavid van Moolenbroek #include <nlist.h>
80*b89261baSDavid van Moolenbroek #include <string.h>
81*b89261baSDavid van Moolenbroek #include <sys/types.h>
82*b89261baSDavid van Moolenbroek #include <sys/param.h>
83*b89261baSDavid van Moolenbroek #include <sys/proc.h>
84*b89261baSDavid van Moolenbroek #include <sys/sysmacros.h>
85*b89261baSDavid van Moolenbroek #include <vm/anon.h>
86*b89261baSDavid van Moolenbroek #include <sys/priocntl.h>
87*b89261baSDavid van Moolenbroek #include <sys/tspriocntl.h>
88*b89261baSDavid van Moolenbroek #include <sys/var.h>
89*b89261baSDavid van Moolenbroek 
90*b89261baSDavid van Moolenbroek #include "top.h"
91*b89261baSDavid van Moolenbroek #include "machine.h"
92*b89261baSDavid van Moolenbroek #include "utils.h"
93*b89261baSDavid van Moolenbroek 
94*b89261baSDavid van Moolenbroek #define UNIX "/stand/unix"
95*b89261baSDavid van Moolenbroek #define KMEM "/dev/kmem"
96*b89261baSDavid van Moolenbroek #define PROCFS "/proc"
97*b89261baSDavid van Moolenbroek #define CPUSTATES	5
98*b89261baSDavid van Moolenbroek 
99*b89261baSDavid van Moolenbroek #ifndef PRIO_MAX
100*b89261baSDavid van Moolenbroek #define PRIO_MAX	20
101*b89261baSDavid van Moolenbroek #endif
102*b89261baSDavid van Moolenbroek #ifndef PRIO_MIN
103*b89261baSDavid van Moolenbroek #define PRIO_MIN	-20
104*b89261baSDavid van Moolenbroek #endif
105*b89261baSDavid van Moolenbroek 
106*b89261baSDavid van Moolenbroek #ifndef FSCALE
107*b89261baSDavid van Moolenbroek #define FSHIFT  8		/* bits to right of fixed binary point */
108*b89261baSDavid van Moolenbroek #define FSCALE  (1<<FSHIFT)
109*b89261baSDavid van Moolenbroek #endif
110*b89261baSDavid van Moolenbroek 
111*b89261baSDavid van Moolenbroek #define loaddouble(x) ((double)x/FSCALE)
112*b89261baSDavid van Moolenbroek #define pagetok(size) ((size) * pagesz) >> LOG1024
113*b89261baSDavid van Moolenbroek 
114*b89261baSDavid van Moolenbroek /* definitions for the index in the nlist array */
115*b89261baSDavid van Moolenbroek #define X_AVENRUN	0
116*b89261baSDavid van Moolenbroek #define X_V		1
117*b89261baSDavid van Moolenbroek #define X_MPID		2
118*b89261baSDavid van Moolenbroek 
119*b89261baSDavid van Moolenbroek static struct nlist nlst[] =
120*b89261baSDavid van Moolenbroek {
121*b89261baSDavid van Moolenbroek    {"avenrun"},		        /* 0 */
122*b89261baSDavid van Moolenbroek    {"v"},			/* 1 */
123*b89261baSDavid van Moolenbroek    {"nextpid"},                 /* 2 */
124*b89261baSDavid van Moolenbroek   {NULL}
125*b89261baSDavid van Moolenbroek };
126*b89261baSDavid van Moolenbroek 
127*b89261baSDavid van Moolenbroek static unsigned long avenrun_offset;
128*b89261baSDavid van Moolenbroek static unsigned long mpid_offset;
129*b89261baSDavid van Moolenbroek 
130*b89261baSDavid van Moolenbroek static unsigned int pagesz;
131*b89261baSDavid van Moolenbroek 
132*b89261baSDavid van Moolenbroek static void reallocproc(int n);
133*b89261baSDavid van Moolenbroek static int maxprocs;
134*b89261baSDavid van Moolenbroek 
135*b89261baSDavid van Moolenbroek /* get_process_info passes back a handle.  This is what it looks like: */
136*b89261baSDavid van Moolenbroek 
137*b89261baSDavid van Moolenbroek struct handle
138*b89261baSDavid van Moolenbroek {
139*b89261baSDavid van Moolenbroek     struct prpsinfo **next_proc;/* points to next valid proc pointer */
140*b89261baSDavid van Moolenbroek     int remaining;		/* number of pointers remaining */
141*b89261baSDavid van Moolenbroek };
142*b89261baSDavid van Moolenbroek 
143*b89261baSDavid van Moolenbroek /*
144*b89261baSDavid van Moolenbroek  *  These definitions control the format of the per-process area
145*b89261baSDavid van Moolenbroek  */
146*b89261baSDavid van Moolenbroek 
147*b89261baSDavid van Moolenbroek static char header[] =
148*b89261baSDavid van Moolenbroek #ifdef SHOW_NICE
149*b89261baSDavid van Moolenbroek "  PID X        PRI NICE  SIZE   RES STATE   TIME      CPU  COMMAND";
150*b89261baSDavid van Moolenbroek #else
151*b89261baSDavid van Moolenbroek "  PID X        PRI  THR  SIZE   RES STATE   TIME      CPU  COMMAND";
152*b89261baSDavid van Moolenbroek #endif
153*b89261baSDavid van Moolenbroek /* 0123456   -- field to fill in starts at header+6 */
154*b89261baSDavid van Moolenbroek #define UNAME_START 6
155*b89261baSDavid van Moolenbroek #define Proc_format \
156*b89261baSDavid van Moolenbroek 	"%5d %-8.8s %3d %4d %5s %5s %-5s %6s %8.4f%% %.16s"
157*b89261baSDavid van Moolenbroek 
158*b89261baSDavid van Moolenbroek char *state_abbrev[] =
159*b89261baSDavid van Moolenbroek {"oncpu", "run", "sleep",  "stop", "idle", "zombie"};
160*b89261baSDavid van Moolenbroek 
161*b89261baSDavid van Moolenbroek #define sZOMB 5
162*b89261baSDavid van Moolenbroek int process_states[8];
163*b89261baSDavid van Moolenbroek char *procstatenames[] =
164*b89261baSDavid van Moolenbroek {
165*b89261baSDavid van Moolenbroek   " on cpu, ", " running, ", " sleeping, ", " stopped, ",
166*b89261baSDavid van Moolenbroek   " idling ",  " zombie, ",
167*b89261baSDavid van Moolenbroek   NULL
168*b89261baSDavid van Moolenbroek };
169*b89261baSDavid van Moolenbroek 
170*b89261baSDavid van Moolenbroek int cpu_states[CPUSTATES];
171*b89261baSDavid van Moolenbroek char *cpustatenames[] =
172*b89261baSDavid van Moolenbroek {"idle", "user", "kernel", "wait", NULL};
173*b89261baSDavid van Moolenbroek 
174*b89261baSDavid van Moolenbroek 
175*b89261baSDavid van Moolenbroek /* these are for detailing the memory statistics */
176*b89261baSDavid van Moolenbroek long memory_stats[5];
177*b89261baSDavid van Moolenbroek char *memorynames[] =
178*b89261baSDavid van Moolenbroek {"K phys, ", "K used, ", "K free, ", "K swapUsed, ", "K swapFree", NULL};
179*b89261baSDavid van Moolenbroek 
180*b89261baSDavid van Moolenbroek /* these are names given to allowed sorting orders -- first is default */
181*b89261baSDavid van Moolenbroek char *ordernames[] =
182*b89261baSDavid van Moolenbroek {"state", "cpu", "size", "res", "time", "pid", "uid", "rpid", "ruid", NULL};
183*b89261baSDavid van Moolenbroek 
184*b89261baSDavid van Moolenbroek /* forward definitions for comparison functions */
185*b89261baSDavid van Moolenbroek int proc_compare();
186*b89261baSDavid van Moolenbroek int compare_cpu();
187*b89261baSDavid van Moolenbroek int compare_size();
188*b89261baSDavid van Moolenbroek int compare_res();
189*b89261baSDavid van Moolenbroek int compare_time();
190*b89261baSDavid van Moolenbroek int compare_pid();
191*b89261baSDavid van Moolenbroek int compare_uid();
192*b89261baSDavid van Moolenbroek int compare_rpid();
193*b89261baSDavid van Moolenbroek int compare_ruid();
194*b89261baSDavid van Moolenbroek 
195*b89261baSDavid van Moolenbroek int (*proc_compares[])() = {
196*b89261baSDavid van Moolenbroek     proc_compare,
197*b89261baSDavid van Moolenbroek     compare_cpu,
198*b89261baSDavid van Moolenbroek     compare_size,
199*b89261baSDavid van Moolenbroek     compare_res,
200*b89261baSDavid van Moolenbroek     compare_time,
201*b89261baSDavid van Moolenbroek     compare_pid,
202*b89261baSDavid van Moolenbroek     compare_uid,
203*b89261baSDavid van Moolenbroek     compare_rpid,
204*b89261baSDavid van Moolenbroek     compare_ruid,
205*b89261baSDavid van Moolenbroek     NULL };
206*b89261baSDavid van Moolenbroek 
207*b89261baSDavid van Moolenbroek 
208*b89261baSDavid van Moolenbroek static int kmem = -1;
209*b89261baSDavid van Moolenbroek static int nproc;
210*b89261baSDavid van Moolenbroek static int bytes;
211*b89261baSDavid van Moolenbroek static struct prpsinfo *pbase;
212*b89261baSDavid van Moolenbroek static struct prpsinfo **pref;
213*b89261baSDavid van Moolenbroek static DIR *procdir;
214*b89261baSDavid van Moolenbroek 
215*b89261baSDavid van Moolenbroek /* useful externals */
216*b89261baSDavid van Moolenbroek extern int errno;
217*b89261baSDavid van Moolenbroek extern char *sys_errlist[];
218*b89261baSDavid van Moolenbroek extern char *myname;
219*b89261baSDavid van Moolenbroek extern long percentages ();
220*b89261baSDavid van Moolenbroek extern int check_nlist ();
221*b89261baSDavid van Moolenbroek extern int getkval ();
222*b89261baSDavid van Moolenbroek extern void perror ();
223*b89261baSDavid van Moolenbroek extern void getptable ();
224*b89261baSDavid van Moolenbroek extern void quit ();
225*b89261baSDavid van Moolenbroek extern int nlist ();
226*b89261baSDavid van Moolenbroek 
227*b89261baSDavid van Moolenbroek /* fwd dcls */
228*b89261baSDavid van Moolenbroek static int kmet_init(void );
229*b89261baSDavid van Moolenbroek static int get_cpustates(int *new);
230*b89261baSDavid van Moolenbroek 
231*b89261baSDavid van Moolenbroek 
232*b89261baSDavid van Moolenbroek int
machine_init(struct statics * statics)233*b89261baSDavid van Moolenbroek machine_init (struct statics *statics)
234*b89261baSDavid van Moolenbroek   {
235*b89261baSDavid van Moolenbroek     static struct var v;
236*b89261baSDavid van Moolenbroek     int i;
237*b89261baSDavid van Moolenbroek 
238*b89261baSDavid van Moolenbroek     /* fill in the statics information */
239*b89261baSDavid van Moolenbroek     statics->procstate_names = procstatenames;
240*b89261baSDavid van Moolenbroek     statics->cpustate_names = cpustatenames;
241*b89261baSDavid van Moolenbroek     statics->memory_names = memorynames;
242*b89261baSDavid van Moolenbroek     statics->order_names = ordernames;
243*b89261baSDavid van Moolenbroek 
244*b89261baSDavid van Moolenbroek     /* get the list of symbols we want to access in the kernel */
245*b89261baSDavid van Moolenbroek     if (nlist (UNIX, nlst))
246*b89261baSDavid van Moolenbroek       {
247*b89261baSDavid van Moolenbroek 	(void) fprintf (stderr, "Unable to nlist %s\n", UNIX);
248*b89261baSDavid van Moolenbroek 	return (-1);
249*b89261baSDavid van Moolenbroek       }
250*b89261baSDavid van Moolenbroek 
251*b89261baSDavid van Moolenbroek     /* make sure they were all found */
252*b89261baSDavid van Moolenbroek     if (check_nlist (nlst) > 0)
253*b89261baSDavid van Moolenbroek       return (-1);
254*b89261baSDavid van Moolenbroek 
255*b89261baSDavid van Moolenbroek     /* open kernel memory */
256*b89261baSDavid van Moolenbroek     if ((kmem = open (KMEM, O_RDONLY)) == -1)
257*b89261baSDavid van Moolenbroek       {
258*b89261baSDavid van Moolenbroek 	perror (KMEM);
259*b89261baSDavid van Moolenbroek 	return (-1);
260*b89261baSDavid van Moolenbroek       }
261*b89261baSDavid van Moolenbroek 
262*b89261baSDavid van Moolenbroek     v.v_proc=200;   /* arbitrary default */
263*b89261baSDavid van Moolenbroek     /* get the symbol values out of kmem */
264*b89261baSDavid van Moolenbroek     /* NPROC Tuning parameter for max number of processes */
265*b89261baSDavid van Moolenbroek     (void) getkval (nlst[X_V].n_value, &v, sizeof (struct var), nlst[X_V].n_name);
266*b89261baSDavid van Moolenbroek     nproc = v.v_proc;
267*b89261baSDavid van Moolenbroek     maxprocs = nproc;
268*b89261baSDavid van Moolenbroek 
269*b89261baSDavid van Moolenbroek     /* stash away certain offsets for later use */
270*b89261baSDavid van Moolenbroek     mpid_offset = nlst[X_MPID].n_value;
271*b89261baSDavid van Moolenbroek     avenrun_offset = nlst[X_AVENRUN].n_value;
272*b89261baSDavid van Moolenbroek 
273*b89261baSDavid van Moolenbroek     /* allocate space for proc structure array and array of pointers */
274*b89261baSDavid van Moolenbroek     bytes = nproc * sizeof (struct prpsinfo);
275*b89261baSDavid van Moolenbroek     pbase = (struct prpsinfo *) malloc (bytes);
276*b89261baSDavid van Moolenbroek     pref = (struct prpsinfo **) malloc (nproc * sizeof (struct prpsinfo *));
277*b89261baSDavid van Moolenbroek 
278*b89261baSDavid van Moolenbroek     pagesz = sysconf(_SC_PAGESIZE);
279*b89261baSDavid van Moolenbroek 
280*b89261baSDavid van Moolenbroek 
281*b89261baSDavid van Moolenbroek     /* Just in case ... */
282*b89261baSDavid van Moolenbroek     if (pbase == (struct prpsinfo *) NULL || pref == (struct prpsinfo **) NULL)
283*b89261baSDavid van Moolenbroek       {
284*b89261baSDavid van Moolenbroek 	(void) fprintf (stderr, "%s: can't allocate sufficient memory\n", myname);
285*b89261baSDavid van Moolenbroek 	return (-1);
286*b89261baSDavid van Moolenbroek       }
287*b89261baSDavid van Moolenbroek 
288*b89261baSDavid van Moolenbroek     if (!(procdir = opendir (PROCFS)))
289*b89261baSDavid van Moolenbroek       {
290*b89261baSDavid van Moolenbroek 	(void) fprintf (stderr, "Unable to open %s\n", PROCFS);
291*b89261baSDavid van Moolenbroek 	return (-1);
292*b89261baSDavid van Moolenbroek       }
293*b89261baSDavid van Moolenbroek 
294*b89261baSDavid van Moolenbroek     if (chdir (PROCFS))
295*b89261baSDavid van Moolenbroek     {				/* handy for later on when we're reading it */
296*b89261baSDavid van Moolenbroek 	(void) fprintf (stderr, "Unable to chdir to %s\n", PROCFS);
297*b89261baSDavid van Moolenbroek 	return (-1);
298*b89261baSDavid van Moolenbroek     }
299*b89261baSDavid van Moolenbroek 
300*b89261baSDavid van Moolenbroek 
301*b89261baSDavid van Moolenbroek     kmet_init();
302*b89261baSDavid van Moolenbroek 
303*b89261baSDavid van Moolenbroek     /* all done! */
304*b89261baSDavid van Moolenbroek     return (0);
305*b89261baSDavid van Moolenbroek   }
306*b89261baSDavid van Moolenbroek 
307*b89261baSDavid van Moolenbroek char *
format_header(char * uname_field)308*b89261baSDavid van Moolenbroek format_header (char *uname_field)
309*b89261baSDavid van Moolenbroek {
310*b89261baSDavid van Moolenbroek   register char *ptr;
311*b89261baSDavid van Moolenbroek 
312*b89261baSDavid van Moolenbroek   ptr = header + UNAME_START;
313*b89261baSDavid van Moolenbroek   while (*uname_field != '\0')
314*b89261baSDavid van Moolenbroek     *ptr++ = *uname_field++;
315*b89261baSDavid van Moolenbroek 
316*b89261baSDavid van Moolenbroek   return (header);
317*b89261baSDavid van Moolenbroek }
318*b89261baSDavid van Moolenbroek 
319*b89261baSDavid van Moolenbroek void
get_system_info(struct system_info * si)320*b89261baSDavid van Moolenbroek get_system_info (struct system_info *si)
321*b89261baSDavid van Moolenbroek {
322*b89261baSDavid van Moolenbroek   long avenrun[3];
323*b89261baSDavid van Moolenbroek   long mem;
324*b89261baSDavid van Moolenbroek   static time_t cp_old[CPUSTATES];
325*b89261baSDavid van Moolenbroek   static time_t cp_diff[CPUSTATES];	/* for cpu state percentages */
326*b89261baSDavid van Moolenbroek   register int i;
327*b89261baSDavid van Moolenbroek   static long swap_total;
328*b89261baSDavid van Moolenbroek   static long swap_free;
329*b89261baSDavid van Moolenbroek   int new_states[CPUSTATES];
330*b89261baSDavid van Moolenbroek 
331*b89261baSDavid van Moolenbroek   get_cpustates(new_states);
332*b89261baSDavid van Moolenbroek 
333*b89261baSDavid van Moolenbroek   /* convert cp_time counts to percentages */
334*b89261baSDavid van Moolenbroek   (void) percentages (CPUSTATES, cpu_states, new_states, cp_old, cp_diff);
335*b89261baSDavid van Moolenbroek 
336*b89261baSDavid van Moolenbroek 
337*b89261baSDavid van Moolenbroek   si->last_pid = -1;
338*b89261baSDavid van Moolenbroek   /* get mpid -- process id of last process
339*b89261baSDavid van Moolenbroek    * svr5 is nextpid - next pid to be assigned (already incremented)
340*b89261baSDavid van Moolenbroek    */
341*b89261baSDavid van Moolenbroek    (void) getkval (mpid_offset, &(si->last_pid), sizeof (si->last_pid),
342*b89261baSDavid van Moolenbroek    		  "nextpid");
343*b89261baSDavid van Moolenbroek    (si->last_pid)--;    /* so we shld decrement for display */
344*b89261baSDavid van Moolenbroek 
345*b89261baSDavid van Moolenbroek 
346*b89261baSDavid van Moolenbroek   /* get load average array */
347*b89261baSDavid van Moolenbroek   (void) getkval (avenrun_offset, (int *) avenrun, sizeof (avenrun), "avenrun");
348*b89261baSDavid van Moolenbroek   /* convert load averages to doubles */
349*b89261baSDavid van Moolenbroek   for (i = 0; i < 3; i++)
350*b89261baSDavid van Moolenbroek     si->load_avg[i] = loaddouble(avenrun[i]);
351*b89261baSDavid van Moolenbroek 
352*b89261baSDavid van Moolenbroek   mem = sysconf(_SC_TOTAL_MEMORY);      /* physical mem */
353*b89261baSDavid van Moolenbroek   memory_stats[0] = pagetok (mem);
354*b89261baSDavid van Moolenbroek 
355*b89261baSDavid van Moolenbroek   mem = kmet_get_freemem();             /* free mem */
356*b89261baSDavid van Moolenbroek   memory_stats[2] = pagetok (mem);
357*b89261baSDavid van Moolenbroek 
358*b89261baSDavid van Moolenbroek   /* mem = sysconf(_SC_GENERAL_MEMORY);    */
359*b89261baSDavid van Moolenbroek   memory_stats[1] = memory_stats[0] - memory_stats[2]; /* active */
360*b89261baSDavid van Moolenbroek 
361*b89261baSDavid van Moolenbroek   get_swapinfo(&swap_total, &swap_free);
362*b89261baSDavid van Moolenbroek   memory_stats[3] = pagetok(swap_total - swap_free);
363*b89261baSDavid van Moolenbroek   memory_stats[4] = pagetok(swap_free);
364*b89261baSDavid van Moolenbroek 
365*b89261baSDavid van Moolenbroek 
366*b89261baSDavid van Moolenbroek   /* set arrays and strings */
367*b89261baSDavid van Moolenbroek   si->cpustates = cpu_states;
368*b89261baSDavid van Moolenbroek   si->memory = memory_stats;
369*b89261baSDavid van Moolenbroek }
370*b89261baSDavid van Moolenbroek 
371*b89261baSDavid van Moolenbroek static struct handle handle;
372*b89261baSDavid van Moolenbroek 
373*b89261baSDavid van Moolenbroek caddr_t
get_process_info(struct system_info * si,struct process_select * sel,int idx)374*b89261baSDavid van Moolenbroek get_process_info (
375*b89261baSDavid van Moolenbroek 		   struct system_info *si,
376*b89261baSDavid van Moolenbroek 		   struct process_select *sel,
377*b89261baSDavid van Moolenbroek 		   int idx)
378*b89261baSDavid van Moolenbroek {
379*b89261baSDavid van Moolenbroek   register int i;
380*b89261baSDavid van Moolenbroek   register int total_procs;
381*b89261baSDavid van Moolenbroek   register int active_procs;
382*b89261baSDavid van Moolenbroek   register struct prpsinfo **prefp;
383*b89261baSDavid van Moolenbroek   register struct prpsinfo *pp;
384*b89261baSDavid van Moolenbroek 
385*b89261baSDavid van Moolenbroek   /* these are copied out of sel for speed */
386*b89261baSDavid van Moolenbroek   int show_idle;
387*b89261baSDavid van Moolenbroek   int show_system;
388*b89261baSDavid van Moolenbroek   int show_uid;
389*b89261baSDavid van Moolenbroek 
390*b89261baSDavid van Moolenbroek   /* Get current number of processes */
391*b89261baSDavid van Moolenbroek 
392*b89261baSDavid van Moolenbroek   /* read all the proc structures */
393*b89261baSDavid van Moolenbroek   getptable (pbase);
394*b89261baSDavid van Moolenbroek 
395*b89261baSDavid van Moolenbroek   /* get a pointer to the states summary array */
396*b89261baSDavid van Moolenbroek   si->procstates = process_states;
397*b89261baSDavid van Moolenbroek 
398*b89261baSDavid van Moolenbroek   /* set up flags which define what we are going to select */
399*b89261baSDavid van Moolenbroek   show_idle   = sel->idle;
400*b89261baSDavid van Moolenbroek   show_system = sel->system;
401*b89261baSDavid van Moolenbroek   show_uid    = sel->uid != -1;
402*b89261baSDavid van Moolenbroek 
403*b89261baSDavid van Moolenbroek   nproc = kmet_get_nproc();
404*b89261baSDavid van Moolenbroek 
405*b89261baSDavid van Moolenbroek   /* count up process states and get pointers to interesting procs */
406*b89261baSDavid van Moolenbroek   total_procs = 0;
407*b89261baSDavid van Moolenbroek   active_procs = 0;
408*b89261baSDavid van Moolenbroek   (void) memset (process_states, 0, sizeof (process_states));
409*b89261baSDavid van Moolenbroek   prefp = pref;
410*b89261baSDavid van Moolenbroek 
411*b89261baSDavid van Moolenbroek   for (pp = pbase, i = 0; i < nproc; pp++, i++)
412*b89261baSDavid van Moolenbroek   {
413*b89261baSDavid van Moolenbroek       /*
414*b89261baSDavid van Moolenbroek 	 *  Place pointers to each valid proc structure in pref[].
415*b89261baSDavid van Moolenbroek 	 *  Process slots that are actually in use have a non-zero
416*b89261baSDavid van Moolenbroek 	 *  status field.  Processes with PR_ISSYS set are system
417*b89261baSDavid van Moolenbroek 	 *  processes---these get ignored unless show_sysprocs is set.
418*b89261baSDavid van Moolenbroek 	 */
419*b89261baSDavid van Moolenbroek       if ((pp->pr_state >= SONPROC && pp->pr_state <= SIDL)  &&
420*b89261baSDavid van Moolenbroek 	  (show_system || ((pp->pr_flag & PR_ISSYS) == 0)))
421*b89261baSDavid van Moolenbroek       {
422*b89261baSDavid van Moolenbroek 	  total_procs++;
423*b89261baSDavid van Moolenbroek 	  process_states[pp->pr_state]++;
424*b89261baSDavid van Moolenbroek 	  if ((!ZOMBIE(pp)) &&
425*b89261baSDavid van Moolenbroek 	      (show_idle || (pp->pr_state == SRUN) || (pp->pr_state == SONPROC)) &&
426*b89261baSDavid van Moolenbroek 	      (!show_uid || pp->pr_uid == (uid_t) sel->uid))
427*b89261baSDavid van Moolenbroek 	  {
428*b89261baSDavid van Moolenbroek 	      *prefp++ = pp;
429*b89261baSDavid van Moolenbroek 	      active_procs++;
430*b89261baSDavid van Moolenbroek 	  }
431*b89261baSDavid van Moolenbroek 	  if (ZOMBIE(pp))
432*b89261baSDavid van Moolenbroek     	    process_states[sZOMB]++;    /* invented */
433*b89261baSDavid van Moolenbroek 
434*b89261baSDavid van Moolenbroek       }
435*b89261baSDavid van Moolenbroek   }
436*b89261baSDavid van Moolenbroek 
437*b89261baSDavid van Moolenbroek   /* if requested, sort the "interesting" processes */
438*b89261baSDavid van Moolenbroek   qsort ((char *) pref, active_procs, sizeof (struct prpsinfo *),
439*b89261baSDavid van Moolenbroek 	 proc_compares[idx]);
440*b89261baSDavid van Moolenbroek 
441*b89261baSDavid van Moolenbroek   /* remember active and total counts */
442*b89261baSDavid van Moolenbroek   si->p_total = total_procs;
443*b89261baSDavid van Moolenbroek   si->P_ACTIVE = active_procs;
444*b89261baSDavid van Moolenbroek 
445*b89261baSDavid van Moolenbroek   /* pass back a handle */
446*b89261baSDavid van Moolenbroek   handle.next_proc = pref;
447*b89261baSDavid van Moolenbroek   handle.remaining = active_procs;
448*b89261baSDavid van Moolenbroek   return ((caddr_t) & handle);
449*b89261baSDavid van Moolenbroek }
450*b89261baSDavid van Moolenbroek 
451*b89261baSDavid van Moolenbroek /*
452*b89261baSDavid van Moolenbroek  * cpu percentage calculation is as fm ps.c
453*b89261baSDavid van Moolenbroek  * seems to be ratio of (sys+user time used)/(elapsed time)
454*b89261baSDavid van Moolenbroek  * i.e percent of cpu utilised when on cpu
455*b89261baSDavid van Moolenbroek  */
percent_cpu(struct prpsinfo * pp)456*b89261baSDavid van Moolenbroek static double percent_cpu( struct prpsinfo *pp)
457*b89261baSDavid van Moolenbroek {
458*b89261baSDavid van Moolenbroek     static time_t tim = 0L;
459*b89261baSDavid van Moolenbroek     time_t starttime;
460*b89261baSDavid van Moolenbroek     time_t ctime;
461*b89261baSDavid van Moolenbroek     time_t etime;
462*b89261baSDavid van Moolenbroek 
463*b89261baSDavid van Moolenbroek     /* if (tim == 0L) */
464*b89261baSDavid van Moolenbroek         tim = time((time_t *) 0);
465*b89261baSDavid van Moolenbroek     starttime = pp->pr_start.tv_sec;
466*b89261baSDavid van Moolenbroek     if (pp->pr_start.tv_nsec > 500000000)
467*b89261baSDavid van Moolenbroek             starttime++;
468*b89261baSDavid van Moolenbroek     etime = (tim - starttime);
469*b89261baSDavid van Moolenbroek     ctime = pp->pr_time.tv_sec;
470*b89261baSDavid van Moolenbroek     if (pp->pr_time.tv_nsec > 500000000)
471*b89261baSDavid van Moolenbroek     ctime++;
472*b89261baSDavid van Moolenbroek     if (etime)
473*b89261baSDavid van Moolenbroek     {
474*b89261baSDavid van Moolenbroek         /* return  (float)(ctime * 100) / (unsigned)etime; */
475*b89261baSDavid van Moolenbroek         /* this was ocasionally giving vals >100 for some
476*b89261baSDavid van Moolenbroek          * unknown reason so the below normalises it
477*b89261baSDavid van Moolenbroek          */
478*b89261baSDavid van Moolenbroek 
479*b89261baSDavid van Moolenbroek         double pct;
480*b89261baSDavid van Moolenbroek         pct = (float)(ctime * 100) / (unsigned)etime;
481*b89261baSDavid van Moolenbroek         return (pct < 100.0) ? pct : 100.00;
482*b89261baSDavid van Moolenbroek     }
483*b89261baSDavid van Moolenbroek     return 0.00;
484*b89261baSDavid van Moolenbroek }
485*b89261baSDavid van Moolenbroek 
486*b89261baSDavid van Moolenbroek 
487*b89261baSDavid van Moolenbroek char fmt[MAX_COLS];			/* static area where result is built */
488*b89261baSDavid van Moolenbroek 
489*b89261baSDavid van Moolenbroek char *
format_next_process(caddr_t handle,char * (* get_userid)())490*b89261baSDavid van Moolenbroek format_next_process (
491*b89261baSDavid van Moolenbroek 		      caddr_t handle,
492*b89261baSDavid van Moolenbroek 		      char *(*get_userid) ())
493*b89261baSDavid van Moolenbroek {
494*b89261baSDavid van Moolenbroek   register struct prpsinfo *pp;
495*b89261baSDavid van Moolenbroek   struct handle *hp;
496*b89261baSDavid van Moolenbroek   register long cputime;
497*b89261baSDavid van Moolenbroek   register double pctcpu;
498*b89261baSDavid van Moolenbroek 
499*b89261baSDavid van Moolenbroek   /* find and remember the next proc structure */
500*b89261baSDavid van Moolenbroek   hp = (struct handle *) handle;
501*b89261baSDavid van Moolenbroek   pp = *(hp->next_proc++);
502*b89261baSDavid van Moolenbroek   hp->remaining--;
503*b89261baSDavid van Moolenbroek 
504*b89261baSDavid van Moolenbroek   /* get the cpu usage and calculate the cpu percentages */
505*b89261baSDavid van Moolenbroek   cputime = pp->pr_time.tv_sec;
506*b89261baSDavid van Moolenbroek   pctcpu = percent_cpu(pp);
507*b89261baSDavid van Moolenbroek 
508*b89261baSDavid van Moolenbroek 
509*b89261baSDavid van Moolenbroek   /* format this entry */
510*b89261baSDavid van Moolenbroek   (void) sprintf (fmt,
511*b89261baSDavid van Moolenbroek 		  Proc_format,
512*b89261baSDavid van Moolenbroek 		  pp->pr_pid,
513*b89261baSDavid van Moolenbroek 		  (*get_userid) (pp->pr_uid),
514*b89261baSDavid van Moolenbroek                   pp->pr_pri,
515*b89261baSDavid van Moolenbroek #ifdef SHOW_NICE
516*b89261baSDavid van Moolenbroek 		  pp->pr_nice,
517*b89261baSDavid van Moolenbroek #else
518*b89261baSDavid van Moolenbroek 	          (u_short)pp->pr_nlwp < 999 ? (u_short)pp->pr_nlwp : 999,
519*b89261baSDavid van Moolenbroek #endif
520*b89261baSDavid van Moolenbroek 	          format_k(SIZE_K(pp)),
521*b89261baSDavid van Moolenbroek                   format_k(RSS_K(pp)),
522*b89261baSDavid van Moolenbroek 	          (ZOMBIE(pp))  ? state_abbrev[sZOMB]
523*b89261baSDavid van Moolenbroek                                 : state_abbrev[pp->pr_state],
524*b89261baSDavid van Moolenbroek 		  format_time(cputime),
525*b89261baSDavid van Moolenbroek 		  /* 100.0 * */ pctcpu,
526*b89261baSDavid van Moolenbroek 		  printable(pp->pr_fname));
527*b89261baSDavid van Moolenbroek 
528*b89261baSDavid van Moolenbroek   /* return the result */
529*b89261baSDavid van Moolenbroek   return (fmt);
530*b89261baSDavid van Moolenbroek }
531*b89261baSDavid van Moolenbroek 
532*b89261baSDavid van Moolenbroek /*
533*b89261baSDavid van Moolenbroek  * check_nlist(nlst) - checks the nlist to see if any symbols were not
534*b89261baSDavid van Moolenbroek  *		found.  For every symbol that was not found, a one-line
535*b89261baSDavid van Moolenbroek  *		message is printed to stderr.  The routine returns the
536*b89261baSDavid van Moolenbroek  *		number of symbols NOT found.
537*b89261baSDavid van Moolenbroek  */
538*b89261baSDavid van Moolenbroek int
check_nlist(register struct nlist * nlst)539*b89261baSDavid van Moolenbroek check_nlist (register struct nlist *nlst)
540*b89261baSDavid van Moolenbroek {
541*b89261baSDavid van Moolenbroek   register int i;
542*b89261baSDavid van Moolenbroek 
543*b89261baSDavid van Moolenbroek   /* check to see if we got ALL the symbols we requested */
544*b89261baSDavid van Moolenbroek   /* this will write one line to stderr for every symbol not found */
545*b89261baSDavid van Moolenbroek 
546*b89261baSDavid van Moolenbroek   i = 0;
547*b89261baSDavid van Moolenbroek   while (nlst->n_name != NULL)
548*b89261baSDavid van Moolenbroek     {
549*b89261baSDavid van Moolenbroek       if (nlst->n_value == 0)
550*b89261baSDavid van Moolenbroek 	{
551*b89261baSDavid van Moolenbroek 	  /* this one wasn't found */
552*b89261baSDavid van Moolenbroek 	  (void) fprintf (stderr, "kernel: no symbol named `%s'\n", nlst->n_name);
553*b89261baSDavid van Moolenbroek 	  i = 1;
554*b89261baSDavid van Moolenbroek 	}
555*b89261baSDavid van Moolenbroek       nlst++;
556*b89261baSDavid van Moolenbroek     }
557*b89261baSDavid van Moolenbroek   return (i);
558*b89261baSDavid van Moolenbroek }
559*b89261baSDavid van Moolenbroek 
560*b89261baSDavid van Moolenbroek 
561*b89261baSDavid van Moolenbroek /*
562*b89261baSDavid van Moolenbroek  *  getkval(offset, ptr, size, refstr) - get a value out of the kernel.
563*b89261baSDavid van Moolenbroek  *	"offset" is the byte offset into the kernel for the desired value,
564*b89261baSDavid van Moolenbroek  *  	"ptr" points to a buffer into which the value is retrieved,
565*b89261baSDavid van Moolenbroek  *  	"size" is the size of the buffer (and the object to retrieve),
566*b89261baSDavid van Moolenbroek  *  	"refstr" is a reference string used when printing error meessages,
567*b89261baSDavid van Moolenbroek  *	    if "refstr" starts with a '!', then a failure on read will not
568*b89261baSDavid van Moolenbroek  *  	    be fatal (this may seem like a silly way to do things, but I
569*b89261baSDavid van Moolenbroek  *  	    really didn't want the overhead of another argument).
570*b89261baSDavid van Moolenbroek  *
571*b89261baSDavid van Moolenbroek  */
572*b89261baSDavid van Moolenbroek int
getkval(unsigned long offset,int * ptr,int size,char * refstr)573*b89261baSDavid van Moolenbroek getkval (
574*b89261baSDavid van Moolenbroek 	  unsigned long offset,
575*b89261baSDavid van Moolenbroek 	  int *ptr,
576*b89261baSDavid van Moolenbroek 	  int size,
577*b89261baSDavid van Moolenbroek 	  char *refstr)
578*b89261baSDavid van Moolenbroek {
579*b89261baSDavid van Moolenbroek   if (lseek (kmem, (long) offset, 0) == -1)
580*b89261baSDavid van Moolenbroek     {
581*b89261baSDavid van Moolenbroek       if (*refstr == '!')
582*b89261baSDavid van Moolenbroek 	refstr++;
583*b89261baSDavid van Moolenbroek       (void) fprintf (stderr, "%s: lseek to %s: %s\n",
584*b89261baSDavid van Moolenbroek 		      myname, refstr, sys_errlist[errno]);
585*b89261baSDavid van Moolenbroek       quit (22);
586*b89261baSDavid van Moolenbroek     }
587*b89261baSDavid van Moolenbroek   if (read (kmem, (char *) ptr, size) == -1)
588*b89261baSDavid van Moolenbroek     if (*refstr == '!')
589*b89261baSDavid van Moolenbroek       /* we lost the race with the kernel, process isn't in memory */
590*b89261baSDavid van Moolenbroek       return (0);
591*b89261baSDavid van Moolenbroek     else
592*b89261baSDavid van Moolenbroek       {
593*b89261baSDavid van Moolenbroek 	(void) fprintf (stderr, "%s: reading %s: %s\n",
594*b89261baSDavid van Moolenbroek 			myname, refstr, sys_errlist[errno]);
595*b89261baSDavid van Moolenbroek 	quit (23);
596*b89261baSDavid van Moolenbroek       }
597*b89261baSDavid van Moolenbroek   return (1);
598*b89261baSDavid van Moolenbroek }
599*b89261baSDavid van Moolenbroek 
600*b89261baSDavid van Moolenbroek /* ----------------- comparison routines for qsort ---------------- */
601*b89261baSDavid van Moolenbroek 
602*b89261baSDavid van Moolenbroek /* First, the possible comparison keys.  These are defined in such a way
603*b89261baSDavid van Moolenbroek    that they can be merely listed in the source code to define the actual
604*b89261baSDavid van Moolenbroek    desired ordering.
605*b89261baSDavid van Moolenbroek  */
606*b89261baSDavid van Moolenbroek 
607*b89261baSDavid van Moolenbroek #define ORDERKEY_PCTCPU  if (dresult = percent_cpu (p2) - percent_cpu (p1),\
608*b89261baSDavid van Moolenbroek 			     (result = dresult > 0.0 ? 1 : \
609*b89261baSDavid van Moolenbroek 			     dresult < 0.0 ? -1 : 0) == 0)
610*b89261baSDavid van Moolenbroek 
611*b89261baSDavid van Moolenbroek #define ORDERKEY_CPTICKS if ((result = p2->pr_time.tv_sec - p1->pr_time.tv_sec) == 0)
612*b89261baSDavid van Moolenbroek #define ORDERKEY_STATE   if ((result = (long) (sorted_state[p2->pr_state] - \
613*b89261baSDavid van Moolenbroek 			       sorted_state[p1->pr_state])) == 0)
614*b89261baSDavid van Moolenbroek 
615*b89261baSDavid van Moolenbroek #define ORDERKEY_PRIO    if ((result = p2->pr_pri    - p1->pr_pri)    == 0)
616*b89261baSDavid van Moolenbroek #define ORDERKEY_RSSIZE  if ((result = p2->pr_rssize - p1->pr_rssize) == 0)
617*b89261baSDavid van Moolenbroek #define ORDERKEY_MEM     if ((result = (p2->pr_size  - p1->pr_size))  == 0)
618*b89261baSDavid van Moolenbroek 
619*b89261baSDavid van Moolenbroek #define ORDERKEY_PID     if ((result = (p2->pr_pid  - p1->pr_pid))  == 0)
620*b89261baSDavid van Moolenbroek #define ORDERKEY_UID     if ((result = (p2->pr_uid  - p1->pr_uid))  == 0)
621*b89261baSDavid van Moolenbroek #define ORDERKEY_RPID    if ((result = (p1->pr_pid  - p2->pr_pid))  == 0)
622*b89261baSDavid van Moolenbroek #define ORDERKEY_RUID    if ((result = (p1->pr_uid  - p2->pr_uid))  == 0)
623*b89261baSDavid van Moolenbroek 
624*b89261baSDavid van Moolenbroek /* states enum {SONPROC, SRUN, SSLEEP, SSTOP, SIDL}  */
625*b89261baSDavid van Moolenbroek unsigned char sorted_state[] =
626*b89261baSDavid van Moolenbroek {
627*b89261baSDavid van Moolenbroek   7,				/* onproc		*/
628*b89261baSDavid van Moolenbroek   6,				/* run		        */
629*b89261baSDavid van Moolenbroek   5,				/* sleep		*/
630*b89261baSDavid van Moolenbroek   4,				/* stop		        */
631*b89261baSDavid van Moolenbroek   3,				/* idle			*/
632*b89261baSDavid van Moolenbroek   2,				/* zombie		*/
633*b89261baSDavid van Moolenbroek   0,				/* unused               */
634*b89261baSDavid van Moolenbroek   0				/* unused	        */
635*b89261baSDavid van Moolenbroek };
636*b89261baSDavid van Moolenbroek 
637*b89261baSDavid van Moolenbroek #if 0
638*b89261baSDavid van Moolenbroek /*
639*b89261baSDavid van Moolenbroek  *  proc_compare - original singleton comparison function for "qsort"
640*b89261baSDavid van Moolenbroek  *	Compares the resource consumption of two processes using five
641*b89261baSDavid van Moolenbroek  *  	distinct keys.  The keys (in descending order of importance) are:
642*b89261baSDavid van Moolenbroek  *  	percent cpu, cpu ticks, state, resident set size, total virtual
643*b89261baSDavid van Moolenbroek  *  	memory usage.  The process states are ordered as follows (from least
644*b89261baSDavid van Moolenbroek  *  	to most important):  WAIT, zombie, sleep, stop, start, run.  The
645*b89261baSDavid van Moolenbroek  *  	array declaration below maps a process state index into a number
646*b89261baSDavid van Moolenbroek  *  	that reflects this ordering.
647*b89261baSDavid van Moolenbroek  */
648*b89261baSDavid van Moolenbroek  /* default comparison rtn */
649*b89261baSDavid van Moolenbroek int
650*b89261baSDavid van Moolenbroek original_proc_compare (
651*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
652*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
653*b89261baSDavid van Moolenbroek   {
654*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
655*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
656*b89261baSDavid van Moolenbroek     register long result;
657*b89261baSDavid van Moolenbroek     double dresult;
658*b89261baSDavid van Moolenbroek 
659*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
660*b89261baSDavid van Moolenbroek     p1 = *pp1;
661*b89261baSDavid van Moolenbroek     p2 = *pp2;
662*b89261baSDavid van Moolenbroek 
663*b89261baSDavid van Moolenbroek     /* compare percent cpu (pctcpu) */
664*b89261baSDavid van Moolenbroek     dresult = percent_cpu(p2) - percent_cpu (p1);
665*b89261baSDavid van Moolenbroek     result = dresult > 0.0 ?  1 :
666*b89261baSDavid van Moolenbroek              dresult < 0.0 ? -1 : 0;
667*b89261baSDavid van Moolenbroek     if (result)
668*b89261baSDavid van Moolenbroek     {
669*b89261baSDavid van Moolenbroek 	/* use cpticks to break the tie */
670*b89261baSDavid van Moolenbroek 	if ((result = p2->pr_time.tv_sec - p1->pr_time.tv_sec) == 0)
671*b89261baSDavid van Moolenbroek 	  {
672*b89261baSDavid van Moolenbroek 	    /* use process state to break the tie */
673*b89261baSDavid van Moolenbroek 	    if ((result = (long) (sorted_state[p2->pr_state] -
674*b89261baSDavid van Moolenbroek 				  sorted_state[p1->pr_state])) == 0)
675*b89261baSDavid van Moolenbroek 	      {
676*b89261baSDavid van Moolenbroek 		/* use priority to break the tie */
677*b89261baSDavid van Moolenbroek 		if ((result = p2->pr_pri - p1->pr_pri) == 0)
678*b89261baSDavid van Moolenbroek 		  {
679*b89261baSDavid van Moolenbroek 		    /* use resident set size (rssize) to break the tie */
680*b89261baSDavid van Moolenbroek 		    if ((result = p2->pr_rssize - p1->pr_rssize) == 0)
681*b89261baSDavid van Moolenbroek 		      {
682*b89261baSDavid van Moolenbroek 			/* use total memory to break the tie */
683*b89261baSDavid van Moolenbroek 			result = (p2->pr_size - p1->pr_size);
684*b89261baSDavid van Moolenbroek 		      }
685*b89261baSDavid van Moolenbroek 		  }
686*b89261baSDavid van Moolenbroek 	      }
687*b89261baSDavid van Moolenbroek 	  }
688*b89261baSDavid van Moolenbroek     }
689*b89261baSDavid van Moolenbroek     return (result);
690*b89261baSDavid van Moolenbroek   }
691*b89261baSDavid van Moolenbroek #endif  /* original comparison rtn */
692*b89261baSDavid van Moolenbroek 
693*b89261baSDavid van Moolenbroek /* compare_state - comparison function for sorting by state,pri,time,size */
694*b89261baSDavid van Moolenbroek int
proc_compare(struct prpsinfo ** pp1,struct prpsinfo ** pp2)695*b89261baSDavid van Moolenbroek proc_compare (
696*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
697*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
698*b89261baSDavid van Moolenbroek   {
699*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
700*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
701*b89261baSDavid van Moolenbroek     register long result;
702*b89261baSDavid van Moolenbroek     double dresult;
703*b89261baSDavid van Moolenbroek 
704*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
705*b89261baSDavid van Moolenbroek     p1 = *pp1;
706*b89261baSDavid van Moolenbroek     p2 = *pp2;
707*b89261baSDavid van Moolenbroek 
708*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
709*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
710*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
711*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
712*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
713*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
714*b89261baSDavid van Moolenbroek     ;
715*b89261baSDavid van Moolenbroek 
716*b89261baSDavid van Moolenbroek     return (result);
717*b89261baSDavid van Moolenbroek   }
718*b89261baSDavid van Moolenbroek 
719*b89261baSDavid van Moolenbroek 
720*b89261baSDavid van Moolenbroek /* compare_cpu - the comparison function for sorting by cpu % (deflt) */
721*b89261baSDavid van Moolenbroek int
compare_cpu(struct prpsinfo ** pp1,struct prpsinfo ** pp2)722*b89261baSDavid van Moolenbroek compare_cpu (
723*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
724*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
725*b89261baSDavid van Moolenbroek   {
726*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
727*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
728*b89261baSDavid van Moolenbroek     register long result;
729*b89261baSDavid van Moolenbroek     double dresult;
730*b89261baSDavid van Moolenbroek 
731*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
732*b89261baSDavid van Moolenbroek     p1 = *pp1;
733*b89261baSDavid van Moolenbroek     p2 = *pp2;
734*b89261baSDavid van Moolenbroek 
735*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
736*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
737*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
738*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
739*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
740*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
741*b89261baSDavid van Moolenbroek     ;
742*b89261baSDavid van Moolenbroek 
743*b89261baSDavid van Moolenbroek     return (result);
744*b89261baSDavid van Moolenbroek   }
745*b89261baSDavid van Moolenbroek 
746*b89261baSDavid van Moolenbroek /* compare_size - the comparison function for sorting by total memory usage */
747*b89261baSDavid van Moolenbroek int
compare_size(struct prpsinfo ** pp1,struct prpsinfo ** pp2)748*b89261baSDavid van Moolenbroek compare_size (
749*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
750*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
751*b89261baSDavid van Moolenbroek   {
752*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
753*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
754*b89261baSDavid van Moolenbroek     register long result;
755*b89261baSDavid van Moolenbroek     double dresult;
756*b89261baSDavid van Moolenbroek 
757*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
758*b89261baSDavid van Moolenbroek     p1 = *pp1;
759*b89261baSDavid van Moolenbroek     p2 = *pp2;
760*b89261baSDavid van Moolenbroek 
761*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
762*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
763*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
764*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
765*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
766*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
767*b89261baSDavid van Moolenbroek     ;
768*b89261baSDavid van Moolenbroek 
769*b89261baSDavid van Moolenbroek     return (result);
770*b89261baSDavid van Moolenbroek   }
771*b89261baSDavid van Moolenbroek 
772*b89261baSDavid van Moolenbroek /* compare_res - the comparison function for sorting by resident set size */
773*b89261baSDavid van Moolenbroek int
compare_res(struct prpsinfo ** pp1,struct prpsinfo ** pp2)774*b89261baSDavid van Moolenbroek compare_res (
775*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
776*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
777*b89261baSDavid van Moolenbroek   {
778*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
779*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
780*b89261baSDavid van Moolenbroek     register long result;
781*b89261baSDavid van Moolenbroek     double dresult;
782*b89261baSDavid van Moolenbroek 
783*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
784*b89261baSDavid van Moolenbroek     p1 = *pp1;
785*b89261baSDavid van Moolenbroek     p2 = *pp2;
786*b89261baSDavid van Moolenbroek 
787*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
788*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
789*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
790*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
791*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
792*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
793*b89261baSDavid van Moolenbroek     ;
794*b89261baSDavid van Moolenbroek 
795*b89261baSDavid van Moolenbroek     return (result);
796*b89261baSDavid van Moolenbroek   }
797*b89261baSDavid van Moolenbroek 
798*b89261baSDavid van Moolenbroek /* compare_time - the comparison function for sorting by total cpu time */
799*b89261baSDavid van Moolenbroek int
compare_time(struct prpsinfo ** pp1,struct prpsinfo ** pp2)800*b89261baSDavid van Moolenbroek compare_time (
801*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
802*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
803*b89261baSDavid van Moolenbroek   {
804*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
805*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
806*b89261baSDavid van Moolenbroek     register long result;
807*b89261baSDavid van Moolenbroek     double dresult;
808*b89261baSDavid van Moolenbroek 
809*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
810*b89261baSDavid van Moolenbroek     p1 = *pp1;
811*b89261baSDavid van Moolenbroek     p2 = *pp2;
812*b89261baSDavid van Moolenbroek 
813*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
814*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
815*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
816*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
817*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
818*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
819*b89261baSDavid van Moolenbroek     ;
820*b89261baSDavid van Moolenbroek 
821*b89261baSDavid van Moolenbroek     return (result);
822*b89261baSDavid van Moolenbroek   }
823*b89261baSDavid van Moolenbroek 
824*b89261baSDavid van Moolenbroek /* compare_pid - the comparison function for sorting by pid */
825*b89261baSDavid van Moolenbroek int
compare_pid(struct prpsinfo ** pp1,struct prpsinfo ** pp2)826*b89261baSDavid van Moolenbroek compare_pid (
827*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
828*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
829*b89261baSDavid van Moolenbroek   {
830*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
831*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
832*b89261baSDavid van Moolenbroek     register long result;
833*b89261baSDavid van Moolenbroek     double dresult;
834*b89261baSDavid van Moolenbroek 
835*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
836*b89261baSDavid van Moolenbroek     p1 = *pp1;
837*b89261baSDavid van Moolenbroek     p2 = *pp2;
838*b89261baSDavid van Moolenbroek 
839*b89261baSDavid van Moolenbroek     ORDERKEY_PID
840*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
841*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
842*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
843*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
844*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
845*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
846*b89261baSDavid van Moolenbroek     ;
847*b89261baSDavid van Moolenbroek 
848*b89261baSDavid van Moolenbroek     return (result);
849*b89261baSDavid van Moolenbroek   }
850*b89261baSDavid van Moolenbroek 
851*b89261baSDavid van Moolenbroek /* compare_uid - the comparison function for sorting by user ID */
852*b89261baSDavid van Moolenbroek int
compare_uid(struct prpsinfo ** pp1,struct prpsinfo ** pp2)853*b89261baSDavid van Moolenbroek compare_uid (
854*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
855*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
856*b89261baSDavid van Moolenbroek   {
857*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
858*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
859*b89261baSDavid van Moolenbroek     register long result;
860*b89261baSDavid van Moolenbroek     double dresult;
861*b89261baSDavid van Moolenbroek 
862*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
863*b89261baSDavid van Moolenbroek     p1 = *pp1;
864*b89261baSDavid van Moolenbroek     p2 = *pp2;
865*b89261baSDavid van Moolenbroek 
866*b89261baSDavid van Moolenbroek     ORDERKEY_UID
867*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
868*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
869*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
870*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
871*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
872*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
873*b89261baSDavid van Moolenbroek     ;
874*b89261baSDavid van Moolenbroek 
875*b89261baSDavid van Moolenbroek     return (result);
876*b89261baSDavid van Moolenbroek   }
877*b89261baSDavid van Moolenbroek 
878*b89261baSDavid van Moolenbroek /* compare_rpid - the comparison function for sorting by pid ascending */
879*b89261baSDavid van Moolenbroek int
compare_rpid(struct prpsinfo ** pp1,struct prpsinfo ** pp2)880*b89261baSDavid van Moolenbroek compare_rpid (
881*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
882*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
883*b89261baSDavid van Moolenbroek   {
884*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
885*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
886*b89261baSDavid van Moolenbroek     register long result;
887*b89261baSDavid van Moolenbroek     double dresult;
888*b89261baSDavid van Moolenbroek 
889*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
890*b89261baSDavid van Moolenbroek     p1 = *pp1;
891*b89261baSDavid van Moolenbroek     p2 = *pp2;
892*b89261baSDavid van Moolenbroek 
893*b89261baSDavid van Moolenbroek     ORDERKEY_RPID
894*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
895*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
896*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
897*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
898*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
899*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
900*b89261baSDavid van Moolenbroek     ;
901*b89261baSDavid van Moolenbroek 
902*b89261baSDavid van Moolenbroek     return (result);
903*b89261baSDavid van Moolenbroek   }
904*b89261baSDavid van Moolenbroek 
905*b89261baSDavid van Moolenbroek /* compare_uid - the comparison function for sorting by user ID ascending */
906*b89261baSDavid van Moolenbroek int
compare_ruid(struct prpsinfo ** pp1,struct prpsinfo ** pp2)907*b89261baSDavid van Moolenbroek compare_ruid (
908*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp1,
909*b89261baSDavid van Moolenbroek 	       struct prpsinfo **pp2)
910*b89261baSDavid van Moolenbroek   {
911*b89261baSDavid van Moolenbroek     register struct prpsinfo *p1;
912*b89261baSDavid van Moolenbroek     register struct prpsinfo *p2;
913*b89261baSDavid van Moolenbroek     register long result;
914*b89261baSDavid van Moolenbroek     double dresult;
915*b89261baSDavid van Moolenbroek 
916*b89261baSDavid van Moolenbroek     /* remove one level of indirection */
917*b89261baSDavid van Moolenbroek     p1 = *pp1;
918*b89261baSDavid van Moolenbroek     p2 = *pp2;
919*b89261baSDavid van Moolenbroek 
920*b89261baSDavid van Moolenbroek     ORDERKEY_RUID
921*b89261baSDavid van Moolenbroek     ORDERKEY_CPTICKS
922*b89261baSDavid van Moolenbroek     ORDERKEY_PCTCPU
923*b89261baSDavid van Moolenbroek     ORDERKEY_STATE
924*b89261baSDavid van Moolenbroek     ORDERKEY_PRIO
925*b89261baSDavid van Moolenbroek     ORDERKEY_MEM
926*b89261baSDavid van Moolenbroek     ORDERKEY_RSSIZE
927*b89261baSDavid van Moolenbroek     ;
928*b89261baSDavid van Moolenbroek 
929*b89261baSDavid van Moolenbroek     return (result);
930*b89261baSDavid van Moolenbroek   }
931*b89261baSDavid van Moolenbroek 
932*b89261baSDavid van Moolenbroek 
933*b89261baSDavid van Moolenbroek /* ---------------- helper rtns ---------------- */
934*b89261baSDavid van Moolenbroek 
935*b89261baSDavid van Moolenbroek /*
936*b89261baSDavid van Moolenbroek  * get process table
937*b89261baSDavid van Moolenbroek  */
938*b89261baSDavid van Moolenbroek void
getptable(struct prpsinfo * baseptr)939*b89261baSDavid van Moolenbroek getptable (struct prpsinfo *baseptr)
940*b89261baSDavid van Moolenbroek {
941*b89261baSDavid van Moolenbroek   struct prpsinfo *currproc;	/* pointer to current proc structure	*/
942*b89261baSDavid van Moolenbroek   int numprocs = 0;
943*b89261baSDavid van Moolenbroek   struct dirent *direntp;
944*b89261baSDavid van Moolenbroek 
945*b89261baSDavid van Moolenbroek   currproc = baseptr;
946*b89261baSDavid van Moolenbroek   for (rewinddir (procdir); direntp = readdir (procdir);)
947*b89261baSDavid van Moolenbroek     {
948*b89261baSDavid van Moolenbroek       int fd;
949*b89261baSDavid van Moolenbroek       char buf[30];
950*b89261baSDavid van Moolenbroek 
951*b89261baSDavid van Moolenbroek       sprintf(buf,"%s/psinfo", direntp->d_name);
952*b89261baSDavid van Moolenbroek 
953*b89261baSDavid van Moolenbroek       if ((fd = open (buf, O_RDONLY)) < 0)
954*b89261baSDavid van Moolenbroek 	continue;
955*b89261baSDavid van Moolenbroek 
956*b89261baSDavid van Moolenbroek       if (read(fd, currproc, sizeof(psinfo_t)) != sizeof(psinfo_t))
957*b89261baSDavid van Moolenbroek       {
958*b89261baSDavid van Moolenbroek 	  (void) close (fd);
959*b89261baSDavid van Moolenbroek 	  continue;
960*b89261baSDavid van Moolenbroek       }
961*b89261baSDavid van Moolenbroek 
962*b89261baSDavid van Moolenbroek       numprocs++;
963*b89261baSDavid van Moolenbroek       currproc++;
964*b89261baSDavid van Moolenbroek 
965*b89261baSDavid van Moolenbroek       (void) close (fd);
966*b89261baSDavid van Moolenbroek 
967*b89261baSDavid van Moolenbroek       /* Atypical place for growth */
968*b89261baSDavid van Moolenbroek       if (numprocs >= maxprocs)
969*b89261baSDavid van Moolenbroek       {
970*b89261baSDavid van Moolenbroek 	    reallocproc(2 * numprocs);
971*b89261baSDavid van Moolenbroek 	    currproc = (struct prpsinfo *)
972*b89261baSDavid van Moolenbroek 		    ((char *)baseptr + sizeof(psinfo_t) * numprocs);
973*b89261baSDavid van Moolenbroek       }
974*b89261baSDavid van Moolenbroek 
975*b89261baSDavid van Moolenbroek     }
976*b89261baSDavid van Moolenbroek 
977*b89261baSDavid van Moolenbroek   if (nproc != numprocs)
978*b89261baSDavid van Moolenbroek     nproc = numprocs;
979*b89261baSDavid van Moolenbroek }
980*b89261baSDavid van Moolenbroek 
981*b89261baSDavid van Moolenbroek /* return the owner of the specified process, for use in commands.c as we're
982*b89261baSDavid van Moolenbroek    running setuid root */
983*b89261baSDavid van Moolenbroek int
proc_owner(int pid)984*b89261baSDavid van Moolenbroek proc_owner (int pid)
985*b89261baSDavid van Moolenbroek {
986*b89261baSDavid van Moolenbroek   register struct prpsinfo *p;
987*b89261baSDavid van Moolenbroek   int i;
988*b89261baSDavid van Moolenbroek   for (i = 0, p = pbase; i < nproc; i++, p++)
989*b89261baSDavid van Moolenbroek     if (p->pr_pid == (pid_t)pid)
990*b89261baSDavid van Moolenbroek       return ((int)(p->pr_uid));
991*b89261baSDavid van Moolenbroek 
992*b89261baSDavid van Moolenbroek   return (-1);
993*b89261baSDavid van Moolenbroek }
994*b89261baSDavid van Moolenbroek 
995*b89261baSDavid van Moolenbroek int
setpriority(int dummy,int who,int niceval)996*b89261baSDavid van Moolenbroek setpriority (int dummy, int who, int niceval)
997*b89261baSDavid van Moolenbroek {
998*b89261baSDavid van Moolenbroek   int scale;
999*b89261baSDavid van Moolenbroek   int prio;
1000*b89261baSDavid van Moolenbroek   pcinfo_t pcinfo;
1001*b89261baSDavid van Moolenbroek   pcparms_t pcparms;
1002*b89261baSDavid van Moolenbroek   tsparms_t *tsparms;
1003*b89261baSDavid van Moolenbroek 
1004*b89261baSDavid van Moolenbroek   strcpy (pcinfo.pc_clname, "TS");
1005*b89261baSDavid van Moolenbroek   if (priocntl (0, 0, PC_GETCID, (caddr_t) & pcinfo) == -1)
1006*b89261baSDavid van Moolenbroek     return (-1);
1007*b89261baSDavid van Moolenbroek 
1008*b89261baSDavid van Moolenbroek   prio = niceval;
1009*b89261baSDavid van Moolenbroek   if (prio > PRIO_MAX)
1010*b89261baSDavid van Moolenbroek     prio = PRIO_MAX;
1011*b89261baSDavid van Moolenbroek   else if (prio < PRIO_MIN)
1012*b89261baSDavid van Moolenbroek     prio = PRIO_MIN;
1013*b89261baSDavid van Moolenbroek 
1014*b89261baSDavid van Moolenbroek   tsparms = (tsparms_t *) pcparms.pc_clparms;
1015*b89261baSDavid van Moolenbroek   scale = ((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri;
1016*b89261baSDavid van Moolenbroek   tsparms->ts_uprilim = tsparms->ts_upri = -(scale * prio) / 20;
1017*b89261baSDavid van Moolenbroek   pcparms.pc_cid = pcinfo.pc_cid;
1018*b89261baSDavid van Moolenbroek 
1019*b89261baSDavid van Moolenbroek   if (priocntl (P_PID, who, PC_SETPARMS, (caddr_t) & pcparms) == -1)
1020*b89261baSDavid van Moolenbroek     return (-1);
1021*b89261baSDavid van Moolenbroek 
1022*b89261baSDavid van Moolenbroek   return (0);
1023*b89261baSDavid van Moolenbroek }
1024*b89261baSDavid van Moolenbroek 
1025*b89261baSDavid van Moolenbroek 
get_swapinfo(long * total,long * fr)1026*b89261baSDavid van Moolenbroek get_swapinfo(long *total, long *fr)
1027*b89261baSDavid van Moolenbroek {
1028*b89261baSDavid van Moolenbroek     register int cnt, i;
1029*b89261baSDavid van Moolenbroek     register long t, f;
1030*b89261baSDavid van Moolenbroek     struct swaptable *swt;
1031*b89261baSDavid van Moolenbroek     struct swapent *ste;
1032*b89261baSDavid van Moolenbroek     static char path[256];
1033*b89261baSDavid van Moolenbroek 
1034*b89261baSDavid van Moolenbroek     /* get total number of swap entries */
1035*b89261baSDavid van Moolenbroek     cnt = swapctl(SC_GETNSWP, 0);
1036*b89261baSDavid van Moolenbroek 
1037*b89261baSDavid van Moolenbroek     /* allocate enough space to hold count + n swapents */
1038*b89261baSDavid van Moolenbroek     swt = (struct swaptable *)malloc(sizeof(int) +
1039*b89261baSDavid van Moolenbroek 				     cnt * sizeof(struct swapent));
1040*b89261baSDavid van Moolenbroek     if (swt == NULL)
1041*b89261baSDavid van Moolenbroek     {
1042*b89261baSDavid van Moolenbroek 	*total = 0;
1043*b89261baSDavid van Moolenbroek 	*fr = 0;
1044*b89261baSDavid van Moolenbroek 	return;
1045*b89261baSDavid van Moolenbroek     }
1046*b89261baSDavid van Moolenbroek     swt->swt_n = cnt;
1047*b89261baSDavid van Moolenbroek 
1048*b89261baSDavid van Moolenbroek     /* fill in ste_path pointers: we don't care about the paths, so we point
1049*b89261baSDavid van Moolenbroek        them all to the same buffer */
1050*b89261baSDavid van Moolenbroek     ste = &(swt->swt_ent[0]);
1051*b89261baSDavid van Moolenbroek     i = cnt;
1052*b89261baSDavid van Moolenbroek     while (--i >= 0)
1053*b89261baSDavid van Moolenbroek     {
1054*b89261baSDavid van Moolenbroek 	ste++->ste_path = path;
1055*b89261baSDavid van Moolenbroek     }
1056*b89261baSDavid van Moolenbroek 
1057*b89261baSDavid van Moolenbroek     /* grab all swap info */
1058*b89261baSDavid van Moolenbroek     swapctl(SC_LIST, swt);
1059*b89261baSDavid van Moolenbroek 
1060*b89261baSDavid van Moolenbroek     /* walk thru the structs and sum up the fields */
1061*b89261baSDavid van Moolenbroek     t = f = 0;
1062*b89261baSDavid van Moolenbroek     ste = &(swt->swt_ent[0]);
1063*b89261baSDavid van Moolenbroek     i = cnt;
1064*b89261baSDavid van Moolenbroek     while (--i >= 0)
1065*b89261baSDavid van Moolenbroek     {
1066*b89261baSDavid van Moolenbroek 	/* dont count slots being deleted */
1067*b89261baSDavid van Moolenbroek 	if (!(ste->ste_flags & ST_INDEL) )
1068*b89261baSDavid van Moolenbroek 	{
1069*b89261baSDavid van Moolenbroek 	    t += ste->ste_pages;
1070*b89261baSDavid van Moolenbroek 	    f += ste->ste_free;
1071*b89261baSDavid van Moolenbroek 	}
1072*b89261baSDavid van Moolenbroek 	ste++;
1073*b89261baSDavid van Moolenbroek     }
1074*b89261baSDavid van Moolenbroek 
1075*b89261baSDavid van Moolenbroek     /* fill in the results */
1076*b89261baSDavid van Moolenbroek     *total = t;
1077*b89261baSDavid van Moolenbroek     *fr = f;
1078*b89261baSDavid van Moolenbroek     free(swt);
1079*b89261baSDavid van Moolenbroek }
1080*b89261baSDavid van Moolenbroek 
1081*b89261baSDavid van Moolenbroek 
1082*b89261baSDavid van Moolenbroek /*
1083*b89261baSDavid van Moolenbroek  * When we reach a proc limit, we need to realloc the stuff.
1084*b89261baSDavid van Moolenbroek  */
reallocproc(int n)1085*b89261baSDavid van Moolenbroek static void reallocproc(int n)
1086*b89261baSDavid van Moolenbroek {
1087*b89261baSDavid van Moolenbroek     int bytes;
1088*b89261baSDavid van Moolenbroek     struct oldproc *op, *endbase;
1089*b89261baSDavid van Moolenbroek 
1090*b89261baSDavid van Moolenbroek     if (n < maxprocs)
1091*b89261baSDavid van Moolenbroek 	return;
1092*b89261baSDavid van Moolenbroek 
1093*b89261baSDavid van Moolenbroek     maxprocs = n;
1094*b89261baSDavid van Moolenbroek 
1095*b89261baSDavid van Moolenbroek     /* allocate space for proc structure array and array of pointers */
1096*b89261baSDavid van Moolenbroek     bytes = maxprocs * sizeof(psinfo_t) ;
1097*b89261baSDavid van Moolenbroek     pbase = (struct prpsinfo *) realloc(pbase, bytes);
1098*b89261baSDavid van Moolenbroek     pref = (struct prpsinfo **) realloc(pref,
1099*b89261baSDavid van Moolenbroek 			maxprocs * sizeof(struct prpsinfo *));
1100*b89261baSDavid van Moolenbroek 
1101*b89261baSDavid van Moolenbroek     /* Just in case ... */
1102*b89261baSDavid van Moolenbroek     if (pbase == (struct prpsinfo *) NULL || pref == (struct prpsinfo **) NULL)
1103*b89261baSDavid van Moolenbroek     {
1104*b89261baSDavid van Moolenbroek 	fprintf (stderr, "%s: can't allocate sufficient memory\n", myname);
1105*b89261baSDavid van Moolenbroek 	quit(1);
1106*b89261baSDavid van Moolenbroek     }
1107*b89261baSDavid van Moolenbroek }
1108*b89261baSDavid van Moolenbroek 
1109*b89261baSDavid van Moolenbroek /* ---------------------------------------------------------------- */
1110*b89261baSDavid van Moolenbroek /* Access kernel Metrics
1111*b89261baSDavid van Moolenbroek  * SVR5 uses metreg inteface to Kernel statistics (metrics)
1112*b89261baSDavid van Moolenbroek  *  see /usr/include/mas.h, /usr/include/metreg.h
1113*b89261baSDavid van Moolenbroek  */
1114*b89261baSDavid van Moolenbroek 
1115*b89261baSDavid van Moolenbroek #include <sys/mman.h>
1116*b89261baSDavid van Moolenbroek #include <sys/dl.h>
1117*b89261baSDavid van Moolenbroek #include <mas.h>
1118*b89261baSDavid van Moolenbroek #include <metreg.h>
1119*b89261baSDavid van Moolenbroek 
1120*b89261baSDavid van Moolenbroek static int md;         /* metric descriptor handle */
1121*b89261baSDavid van Moolenbroek static  uint32 ncpu;   /* number of processors in system */
1122*b89261baSDavid van Moolenbroek 
1123*b89261baSDavid van Moolenbroek /* fwd dcls */
1124*b89261baSDavid van Moolenbroek static uint32 kmet_get_cpu( int type, char *desc);
1125*b89261baSDavid van Moolenbroek static void kmet_verify(
1126*b89261baSDavid van Moolenbroek     uint32 md,    metid_t id,  units_t units, type_t mettype,
1127*b89261baSDavid van Moolenbroek     uint32 metsz, uint32 nobj, uint32 nlocs,  resource_t res_id,
1128*b89261baSDavid van Moolenbroek     uint32 ressz ) ;
1129*b89261baSDavid van Moolenbroek 
1130*b89261baSDavid van Moolenbroek 
get_cpustates(int * new)1131*b89261baSDavid van Moolenbroek static int get_cpustates(int *new)
1132*b89261baSDavid van Moolenbroek {
1133*b89261baSDavid van Moolenbroek     new[0] = (int)kmet_get_cpu( MPC_CPU_IDLE, "idle");
1134*b89261baSDavid van Moolenbroek     new[1] = (int)kmet_get_cpu( MPC_CPU_USR,  "usr");
1135*b89261baSDavid van Moolenbroek     new[2] = (int)kmet_get_cpu( MPC_CPU_SYS,  "sys");
1136*b89261baSDavid van Moolenbroek     new[3] = (int)kmet_get_cpu( MPC_CPU_WIO,  "wio");
1137*b89261baSDavid van Moolenbroek }
1138*b89261baSDavid van Moolenbroek 
1139*b89261baSDavid van Moolenbroek 
1140*b89261baSDavid van Moolenbroek /* initialises kernel metrics access and gets #cpus */
kmet_init()1141*b89261baSDavid van Moolenbroek static int kmet_init()
1142*b89261baSDavid van Moolenbroek {
1143*b89261baSDavid van Moolenbroek     uint32 *ncpu_p;
1144*b89261baSDavid van Moolenbroek 
1145*b89261baSDavid van Moolenbroek     /*  open (and map in) the metric access file and assoc data structures */
1146*b89261baSDavid van Moolenbroek     if( ( md = mas_open( MAS_FILE, MAS_MMAP_ACCESS ) ) < 0 )
1147*b89261baSDavid van Moolenbroek     {
1148*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_open failed\n");
1149*b89261baSDavid van Moolenbroek         mas_perror();
1150*b89261baSDavid van Moolenbroek         quit(10);
1151*b89261baSDavid van Moolenbroek     }
1152*b89261baSDavid van Moolenbroek 
1153*b89261baSDavid van Moolenbroek     /* verify the NCPU metric is everything we expect */
1154*b89261baSDavid van Moolenbroek     kmet_verify(md, NCPU, CPUS, CONFIGURABLE, sizeof(short),
1155*b89261baSDavid van Moolenbroek                    1, 1, MAS_SYSTEM, sizeof(uint32) );
1156*b89261baSDavid van Moolenbroek 
1157*b89261baSDavid van Moolenbroek     /* get the number of cpu's on the system */
1158*b89261baSDavid van Moolenbroek     if( (ncpu_p = (uint32 *)mas_get_met( md, NCPU, 0 )) == NULL )
1159*b89261baSDavid van Moolenbroek     {
1160*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_get_met of ncpu failed\n");
1161*b89261baSDavid van Moolenbroek         mas_perror();
1162*b89261baSDavid van Moolenbroek         quit(12);
1163*b89261baSDavid van Moolenbroek     }
1164*b89261baSDavid van Moolenbroek     ncpu = (uint32)(*(short *)ncpu_p);
1165*b89261baSDavid van Moolenbroek 
1166*b89261baSDavid van Moolenbroek     /* check that MPC_CPU_IDLE is of the form we expect
1167*b89261baSDavid van Moolenbroek      *      ( paranoically we should check the rest as well but ... )
1168*b89261baSDavid van Moolenbroek      */
1169*b89261baSDavid van Moolenbroek     kmet_verify( md, MPC_CPU_IDLE, TIX, PROFILE, sizeof(uint32),
1170*b89261baSDavid van Moolenbroek                     1,  ncpu, NCPU, sizeof(short) );
1171*b89261baSDavid van Moolenbroek 
1172*b89261baSDavid van Moolenbroek     kmet_verify( md, PROCUSE, PROCESSES, COUNT, sizeof(uint32),
1173*b89261baSDavid van Moolenbroek                     1,  1, MAS_SYSTEM, sizeof(uint32) );
1174*b89261baSDavid van Moolenbroek     nproc = kmet_get_nproc();
1175*b89261baSDavid van Moolenbroek 
1176*b89261baSDavid van Moolenbroek     return 0;
1177*b89261baSDavid van Moolenbroek }
1178*b89261baSDavid van Moolenbroek 
1179*b89261baSDavid van Moolenbroek /* done with kernel metrics access */
1180*b89261baSDavid van Moolenbroek static int
kmet_done()1181*b89261baSDavid van Moolenbroek kmet_done()
1182*b89261baSDavid van Moolenbroek {
1183*b89261baSDavid van Moolenbroek     if ( mas_close( md ) < 0 )
1184*b89261baSDavid van Moolenbroek     {
1185*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_close failed\n");
1186*b89261baSDavid van Moolenbroek         mas_perror();
1187*b89261baSDavid van Moolenbroek         quit(14);
1188*b89261baSDavid van Moolenbroek     }
1189*b89261baSDavid van Moolenbroek }
1190*b89261baSDavid van Moolenbroek 
1191*b89261baSDavid van Moolenbroek 
1192*b89261baSDavid van Moolenbroek static uint32
kmet_get_cpu(int type,char * desc)1193*b89261baSDavid van Moolenbroek kmet_get_cpu( int type, char *desc)
1194*b89261baSDavid van Moolenbroek {
1195*b89261baSDavid van Moolenbroek     int i;
1196*b89261baSDavid van Moolenbroek     uint32 r=0, rtot=0 ;
1197*b89261baSDavid van Moolenbroek 
1198*b89261baSDavid van Moolenbroek     for (i=0; i <ncpu; i++)
1199*b89261baSDavid van Moolenbroek     {
1200*b89261baSDavid van Moolenbroek         r=*(uint32 *)mas_get_met( md, (metid_t)type, 0 );
1201*b89261baSDavid van Moolenbroek         if ( !r)
1202*b89261baSDavid van Moolenbroek         {
1203*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met of %s failed\n", desc);
1204*b89261baSDavid van Moolenbroek             mas_perror();
1205*b89261baSDavid van Moolenbroek             quit(12);
1206*b89261baSDavid van Moolenbroek         }
1207*b89261baSDavid van Moolenbroek         rtot += r;      /* sum them for multi cpus */
1208*b89261baSDavid van Moolenbroek     }
1209*b89261baSDavid van Moolenbroek     return rtot /* /ncpu */ ;
1210*b89261baSDavid van Moolenbroek }
1211*b89261baSDavid van Moolenbroek 
1212*b89261baSDavid van Moolenbroek static int
kmet_get_freemem()1213*b89261baSDavid van Moolenbroek kmet_get_freemem()
1214*b89261baSDavid van Moolenbroek {
1215*b89261baSDavid van Moolenbroek     dl_t            *fm_p, fm, fmc, denom;
1216*b89261baSDavid van Moolenbroek     time_t          td1;
1217*b89261baSDavid van Moolenbroek     static time_t   td0;
1218*b89261baSDavid van Moolenbroek     static dl_t     fm_old;
1219*b89261baSDavid van Moolenbroek 
1220*b89261baSDavid van Moolenbroek 
1221*b89261baSDavid van Moolenbroek     td1 = time(NULL);
1222*b89261baSDavid van Moolenbroek     if ((fm_p = (dl_t *)mas_get_met( md, FREEMEM, 0 )) == NULL )
1223*b89261baSDavid van Moolenbroek     {
1224*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_get_met of freemem failed\n");
1225*b89261baSDavid van Moolenbroek         mas_perror();
1226*b89261baSDavid van Moolenbroek         quit(12);
1227*b89261baSDavid van Moolenbroek     }
1228*b89261baSDavid van Moolenbroek     fm = *fm_p;
1229*b89261baSDavid van Moolenbroek 
1230*b89261baSDavid van Moolenbroek     denom.dl_hop = 0;
1231*b89261baSDavid van Moolenbroek     denom.dl_lop = (long) (td1 - td0);
1232*b89261baSDavid van Moolenbroek     td0 = td1;
1233*b89261baSDavid van Moolenbroek 
1234*b89261baSDavid van Moolenbroek     /* calculate the freemem difference divided by the time diff
1235*b89261baSDavid van Moolenbroek      * giving the freemem in that time sample
1236*b89261baSDavid van Moolenbroek      *  (new - old) / (time_between_samples)
1237*b89261baSDavid van Moolenbroek      */
1238*b89261baSDavid van Moolenbroek     fmc = lsub(fm, fm_old);
1239*b89261baSDavid van Moolenbroek     fm_old = fm;
1240*b89261baSDavid van Moolenbroek 
1241*b89261baSDavid van Moolenbroek     fmc = ldivide(fmc, denom);
1242*b89261baSDavid van Moolenbroek     return  fmc.dl_lop;
1243*b89261baSDavid van Moolenbroek }
1244*b89261baSDavid van Moolenbroek 
1245*b89261baSDavid van Moolenbroek /*
1246*b89261baSDavid van Moolenbroek  * return # of processes currently executing on system
1247*b89261baSDavid van Moolenbroek  */
1248*b89261baSDavid van Moolenbroek static int
kmet_get_nproc()1249*b89261baSDavid van Moolenbroek kmet_get_nproc()
1250*b89261baSDavid van Moolenbroek {
1251*b89261baSDavid van Moolenbroek     uint32 *p;
1252*b89261baSDavid van Moolenbroek     if ((p = (uint32 *)mas_get_met( md, PROCUSE, 0 )) == NULL )
1253*b89261baSDavid van Moolenbroek     {
1254*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_get_met of procuse failed\n");
1255*b89261baSDavid van Moolenbroek         mas_perror();
1256*b89261baSDavid van Moolenbroek         quit(11);
1257*b89261baSDavid van Moolenbroek     }
1258*b89261baSDavid van Moolenbroek     nproc = (int)*p;
1259*b89261baSDavid van Moolenbroek }
1260*b89261baSDavid van Moolenbroek 
1261*b89261baSDavid van Moolenbroek 
1262*b89261baSDavid van Moolenbroek /*
1263*b89261baSDavid van Moolenbroek  * Function: 	kmet_verify
1264*b89261baSDavid van Moolenbroek  * renamed from mas_usrtime example verify_met() fm Doug Souders
1265*b89261baSDavid van Moolenbroek  *
1266*b89261baSDavid van Moolenbroek  * Description:	Verify the registration data associated with this metric
1267*b89261baSDavid van Moolenbroek  *		match what are expected.  Cautious consumer applications
1268*b89261baSDavid van Moolenbroek  *		should do this sort of verification before using metrics.
1269*b89261baSDavid van Moolenbroek  */
1270*b89261baSDavid van Moolenbroek static void
kmet_verify(uint32 md,metid_t id,units_t units,type_t mettype,uint32 metsz,uint32 nobj,uint32 nlocs,resource_t res_id,uint32 ressz)1271*b89261baSDavid van Moolenbroek kmet_verify(
1272*b89261baSDavid van Moolenbroek      uint32     md,         /* metric descriptor                */
1273*b89261baSDavid van Moolenbroek      metid_t    id,         /* metric id number                 */
1274*b89261baSDavid van Moolenbroek      units_t    units,      /* expected units of metric         */
1275*b89261baSDavid van Moolenbroek      type_t     mettype,    /* expected type of metric          */
1276*b89261baSDavid van Moolenbroek      uint32     metsz,      /* expected object size of metric   */
1277*b89261baSDavid van Moolenbroek      uint32     nobj,       /* expected number of array elements */
1278*b89261baSDavid van Moolenbroek      uint32     nlocs,      /* expected number of instances     */
1279*b89261baSDavid van Moolenbroek      resource_t res_id,     /* expected resource id number      */
1280*b89261baSDavid van Moolenbroek      uint32     ressz       /* expected resource object size    */
1281*b89261baSDavid van Moolenbroek      )
1282*b89261baSDavid van Moolenbroek {
1283*b89261baSDavid van Moolenbroek 
1284*b89261baSDavid van Moolenbroek     char		*name;		/* the name of the metric 	*/
1285*b89261baSDavid van Moolenbroek     units_t		*units_p;	/* the units of the metric	*/
1286*b89261baSDavid van Moolenbroek     type_t		*mettype_p;	/* type field of the metric	*/
1287*b89261baSDavid van Moolenbroek     uint32 		*objsz_p;	/* size of each element in met 	*/
1288*b89261baSDavid van Moolenbroek     uint32 		*nobj_p;	/* num of elements >1 then array*/
1289*b89261baSDavid van Moolenbroek     uint32 		*nlocs_p;	/* total number of instances	*/
1290*b89261baSDavid van Moolenbroek     uint32 		*status_p;	/* status word (update|avail)	*/
1291*b89261baSDavid van Moolenbroek     resource_t	        *resource_p;	/* the resource list of the met	*/
1292*b89261baSDavid van Moolenbroek     uint32		*resval_p;	/* pointer to resource		*/
1293*b89261baSDavid van Moolenbroek     uint32 		*ressz_p;	/* size of the resource met	*/
1294*b89261baSDavid van Moolenbroek 
1295*b89261baSDavid van Moolenbroek     if (!(name = mas_get_met_name( md, id )))
1296*b89261baSDavid van Moolenbroek     {
1297*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met_name failed\n");
1298*b89261baSDavid van Moolenbroek             mas_perror();
1299*b89261baSDavid van Moolenbroek             quit(11);
1300*b89261baSDavid van Moolenbroek     }
1301*b89261baSDavid van Moolenbroek 
1302*b89261baSDavid van Moolenbroek     if (!(status_p = mas_get_met_status( md, id )))
1303*b89261baSDavid van Moolenbroek     {
1304*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met_status of %s failed\n",
1305*b89261baSDavid van Moolenbroek                 name );
1306*b89261baSDavid van Moolenbroek             mas_perror();
1307*b89261baSDavid van Moolenbroek             quit(11);
1308*b89261baSDavid van Moolenbroek     }
1309*b89261baSDavid van Moolenbroek     if ( *status_p != MAS_AVAILABLE )
1310*b89261baSDavid van Moolenbroek     {
1311*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"unexpected status word for %s\n"
1312*b89261baSDavid van Moolenbroek                                 "- expected %u got %u\n",
1313*b89261baSDavid van Moolenbroek                 name, MAS_AVAILABLE, *status_p );
1314*b89261baSDavid van Moolenbroek         quit(11);
1315*b89261baSDavid van Moolenbroek     }
1316*b89261baSDavid van Moolenbroek     if (!(units_p = mas_get_met_units( md, id )))
1317*b89261baSDavid van Moolenbroek     {
1318*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met_units of %s failed\n",
1319*b89261baSDavid van Moolenbroek                 name );
1320*b89261baSDavid van Moolenbroek             mas_perror();
1321*b89261baSDavid van Moolenbroek             quit(11);
1322*b89261baSDavid van Moolenbroek     }
1323*b89261baSDavid van Moolenbroek     if (units != *units_p )
1324*b89261baSDavid van Moolenbroek     {
1325*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"unexpected units for %s\n"
1326*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1327*b89261baSDavid van Moolenbroek                 name, units, *units_p );
1328*b89261baSDavid van Moolenbroek             quit(11);
1329*b89261baSDavid van Moolenbroek     }
1330*b89261baSDavid van Moolenbroek 
1331*b89261baSDavid van Moolenbroek     if (!(mettype_p = mas_get_met_type( md, id )))
1332*b89261baSDavid van Moolenbroek     {
1333*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met_type of %s failed\n",
1334*b89261baSDavid van Moolenbroek                 name );
1335*b89261baSDavid van Moolenbroek             mas_perror();
1336*b89261baSDavid van Moolenbroek             quit(11);
1337*b89261baSDavid van Moolenbroek     }
1338*b89261baSDavid van Moolenbroek     if (mettype != *mettype_p )
1339*b89261baSDavid van Moolenbroek     {
1340*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"unexpected metric type for %s\n"
1341*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1342*b89261baSDavid van Moolenbroek                 name, mettype , *mettype_p );
1343*b89261baSDavid van Moolenbroek             quit(11);
1344*b89261baSDavid van Moolenbroek     }
1345*b89261baSDavid van Moolenbroek 
1346*b89261baSDavid van Moolenbroek     if (!(objsz_p = mas_get_met_objsz( md, id )))
1347*b89261baSDavid van Moolenbroek     {
1348*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met_objsz of %s failed\n", name );
1349*b89261baSDavid van Moolenbroek             mas_perror();
1350*b89261baSDavid van Moolenbroek             quit(11);
1351*b89261baSDavid van Moolenbroek     }
1352*b89261baSDavid van Moolenbroek     if (*objsz_p != metsz )
1353*b89261baSDavid van Moolenbroek     {
1354*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"unexpected object size for %s\n"
1355*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1356*b89261baSDavid van Moolenbroek                 name, metsz, *objsz_p );
1357*b89261baSDavid van Moolenbroek             quit(11);
1358*b89261baSDavid van Moolenbroek     }
1359*b89261baSDavid van Moolenbroek 
1360*b89261baSDavid van Moolenbroek     if (!(nobj_p = mas_get_met_nobj( md, id )))
1361*b89261baSDavid van Moolenbroek     {
1362*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met_nobj of %s failed\n", name );
1363*b89261baSDavid van Moolenbroek             mas_perror();
1364*b89261baSDavid van Moolenbroek             quit(11);
1365*b89261baSDavid van Moolenbroek     }
1366*b89261baSDavid van Moolenbroek     if (nobj != *nobj_p )
1367*b89261baSDavid van Moolenbroek     {
1368*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"unexpected number of objects for %s\n"
1369*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1370*b89261baSDavid van Moolenbroek                 name, nobj, *nobj_p );
1371*b89261baSDavid van Moolenbroek          quit(11);
1372*b89261baSDavid van Moolenbroek     }
1373*b89261baSDavid van Moolenbroek 
1374*b89261baSDavid van Moolenbroek     /* get the number of instances that libmas thinks it knows about  */
1375*b89261baSDavid van Moolenbroek     if (!(nlocs_p = mas_get_met_nlocs( md, id )))
1376*b89261baSDavid van Moolenbroek     {
1377*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_get_met_nlocs of %s failed\n",  name );
1378*b89261baSDavid van Moolenbroek         mas_perror();
1379*b89261baSDavid van Moolenbroek         quit(11);
1380*b89261baSDavid van Moolenbroek     }
1381*b89261baSDavid van Moolenbroek     if (nlocs != *nlocs_p )
1382*b89261baSDavid van Moolenbroek     {
1383*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"unexpected number of instances for %s"
1384*b89261baSDavid van Moolenbroek                         " - expected %u got %u\n",
1385*b89261baSDavid van Moolenbroek                 name, nlocs, *nlocs_p );
1386*b89261baSDavid van Moolenbroek         quit(11);
1387*b89261baSDavid van Moolenbroek 
1388*b89261baSDavid van Moolenbroek     }
1389*b89261baSDavid van Moolenbroek     /*	get the resource list for the metric */
1390*b89261baSDavid van Moolenbroek     if (!(resource_p = mas_get_met_resources( md, id )))
1391*b89261baSDavid van Moolenbroek     {
1392*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_get_met_resources of %s failed\n", name );
1393*b89261baSDavid van Moolenbroek         mas_perror();
1394*b89261baSDavid van Moolenbroek         quit(11);
1395*b89261baSDavid van Moolenbroek     }
1396*b89261baSDavid van Moolenbroek     if (*resource_p != res_id )
1397*b89261baSDavid van Moolenbroek     {
1398*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"unexpected resource id for %s\n"
1399*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1400*b89261baSDavid van Moolenbroek                 name, res_id, *resource_p);
1401*b89261baSDavid van Moolenbroek         quit(11);
1402*b89261baSDavid van Moolenbroek     }
1403*b89261baSDavid van Moolenbroek     /*	get the size of the resource  */
1404*b89261baSDavid van Moolenbroek     if (!(ressz_p = mas_get_met_objsz( md, (metid_t)(*resource_p) )))
1405*b89261baSDavid van Moolenbroek     {
1406*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"mas_get_met_objsz of resource failed\n");
1407*b89261baSDavid van Moolenbroek         mas_perror();
1408*b89261baSDavid van Moolenbroek         quit(11);
1409*b89261baSDavid van Moolenbroek     }
1410*b89261baSDavid van Moolenbroek     if (*ressz_p != ressz )
1411*b89261baSDavid van Moolenbroek     {
1412*b89261baSDavid van Moolenbroek         (void)fprintf(stderr,"unexpected resource size for %s\n"
1413*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1414*b89261baSDavid van Moolenbroek                 name, ressz, *ressz_p );
1415*b89261baSDavid van Moolenbroek         quit(11);
1416*b89261baSDavid van Moolenbroek     }
1417*b89261baSDavid van Moolenbroek /*
1418*b89261baSDavid van Moolenbroek  *	get the address of the resource
1419*b89261baSDavid van Moolenbroek  */
1420*b89261baSDavid van Moolenbroek     if (!(resval_p = (uint32 *)mas_get_met( md, *resource_p, 0 )))
1421*b89261baSDavid van Moolenbroek     {
1422*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"mas_get_met of resource failed\n");
1423*b89261baSDavid van Moolenbroek             mas_perror();
1424*b89261baSDavid van Moolenbroek             quit(11);
1425*b89261baSDavid van Moolenbroek     }
1426*b89261baSDavid van Moolenbroek     if (ressz == sizeof( short ) )
1427*b89261baSDavid van Moolenbroek     {
1428*b89261baSDavid van Moolenbroek         if( (uint32)(*(short *)resval_p) != nlocs )
1429*b89261baSDavid van Moolenbroek         {
1430*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"unexpected resource value for %s\n"
1431*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1432*b89261baSDavid van Moolenbroek                         name, nlocs, (uint32)(*(short *)resval_p) );
1433*b89261baSDavid van Moolenbroek             quit(11);
1434*b89261baSDavid van Moolenbroek         }
1435*b89261baSDavid van Moolenbroek     }
1436*b89261baSDavid van Moolenbroek     else
1437*b89261baSDavid van Moolenbroek     { /* assume size of uint32 */
1438*b89261baSDavid van Moolenbroek         if (*resval_p != nlocs )
1439*b89261baSDavid van Moolenbroek         {
1440*b89261baSDavid van Moolenbroek             (void)fprintf(stderr,"unexpected resource value for %s\n"
1441*b89261baSDavid van Moolenbroek                                     "- expected %u got %u\n",
1442*b89261baSDavid van Moolenbroek                         name, nlocs, *resval_p );
1443*b89261baSDavid van Moolenbroek             quit(11);
1444*b89261baSDavid van Moolenbroek         }
1445*b89261baSDavid van Moolenbroek     }
1446*b89261baSDavid van Moolenbroek     return;
1447*b89261baSDavid van Moolenbroek }
1448*b89261baSDavid van Moolenbroek 
1449