xref: /titanic_53/usr/src/cmd/acct/acctcms.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28*7c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
29*7c478bd9Sstevel@tonic-gate 
30*7c478bd9Sstevel@tonic-gate 
31*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
32*7c478bd9Sstevel@tonic-gate 
33*7c478bd9Sstevel@tonic-gate /*
34*7c478bd9Sstevel@tonic-gate  *	acctcms [-a] [-c] [-j] [-n] [-s] [-p] [-o] [-t] [file...]
35*7c478bd9Sstevel@tonic-gate  *	summarize per-process accounting
36*7c478bd9Sstevel@tonic-gate  *	-a	output in ascii, rather than [pt]cms.h format
37*7c478bd9Sstevel@tonic-gate  *	-c	sort by total cpu, rather than total kcore-minutes
38*7c478bd9Sstevel@tonic-gate  *	-j	anything used only once -> ***other
39*7c478bd9Sstevel@tonic-gate  *	-n	sort by number of processes
40*7c478bd9Sstevel@tonic-gate  *	-s	any following files already in pcms.h format
41*7c478bd9Sstevel@tonic-gate  *      -p      output prime time command summary (only with -a)
42*7c478bd9Sstevel@tonic-gate  *      -o      output non-prime time (offshift) command summary (only
43*7c478bd9Sstevel@tonic-gate  *		with -a option)
44*7c478bd9Sstevel@tonic-gate  *	-t	process records in total (old) style (tcms.h) format
45*7c478bd9Sstevel@tonic-gate  *	file	file in [pt]cms.h (if -s seen already) or acct.h (if not)
46*7c478bd9Sstevel@tonic-gate  *	expected use:
47*7c478bd9Sstevel@tonic-gate  *	acctcms /var/adm/pacct? > today; acctcms -s old today >new
48*7c478bd9Sstevel@tonic-gate  *	cp new old; rm new
49*7c478bd9Sstevel@tonic-gate  *	acctcms -a today; acctcms -a old
50*7c478bd9Sstevel@tonic-gate  */
51*7c478bd9Sstevel@tonic-gate #include <stdio.h>
52*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
53*7c478bd9Sstevel@tonic-gate #include <sys/param.h>
54*7c478bd9Sstevel@tonic-gate #include "acctdef.h"
55*7c478bd9Sstevel@tonic-gate #include <ctype.h>
56*7c478bd9Sstevel@tonic-gate #include <sys/acct.h>
57*7c478bd9Sstevel@tonic-gate 
58*7c478bd9Sstevel@tonic-gate int	csize = CSIZE;
59*7c478bd9Sstevel@tonic-gate 
60*7c478bd9Sstevel@tonic-gate /*
61*7c478bd9Sstevel@tonic-gate  *  Total cms records format
62*7c478bd9Sstevel@tonic-gate  */
63*7c478bd9Sstevel@tonic-gate struct tcms {
64*7c478bd9Sstevel@tonic-gate 	char	tcm_comm[8];	/* command name */
65*7c478bd9Sstevel@tonic-gate 	long	tcm_pc;		/* number of processes */
66*7c478bd9Sstevel@tonic-gate 	float	tcm_cpu;	/* cpu time(min) */
67*7c478bd9Sstevel@tonic-gate 	float	tcm_real;	/* real time(min) */
68*7c478bd9Sstevel@tonic-gate 	float	tcm_kcore;	/* kcore-minutes */
69*7c478bd9Sstevel@tonic-gate 	ulong_t	tcm_io;		/* chars transferred */
70*7c478bd9Sstevel@tonic-gate 	ulong_t	tcm_rw;		/* blocks read */
71*7c478bd9Sstevel@tonic-gate } ;
72*7c478bd9Sstevel@tonic-gate struct tcms	*tcm;
73*7c478bd9Sstevel@tonic-gate /*
74*7c478bd9Sstevel@tonic-gate  * prime/nonprime CMS record format
75*7c478bd9Sstevel@tonic-gate  */
76*7c478bd9Sstevel@tonic-gate struct pcms {
77*7c478bd9Sstevel@tonic-gate 	char	pcm_comm[8];	/* command name */
78*7c478bd9Sstevel@tonic-gate 	long	pcm_pc[2];	/* number of processes */
79*7c478bd9Sstevel@tonic-gate 	float	pcm_cpu[2];	/* cpu time(min) */
80*7c478bd9Sstevel@tonic-gate 	float	pcm_real[2];	/* real time(min) */
81*7c478bd9Sstevel@tonic-gate 	float	pcm_kcore[2];	/* kcore-minutes */
82*7c478bd9Sstevel@tonic-gate 	float	pcm_io[2];	/* chars transferred */
83*7c478bd9Sstevel@tonic-gate 	float	pcm_rw[2];	/* blocks read */
84*7c478bd9Sstevel@tonic-gate } ;
85*7c478bd9Sstevel@tonic-gate struct pcms	*pcm;
86*7c478bd9Sstevel@tonic-gate struct  tcms    tcmtmp  = {{'*','*','*','o','t','h','e','r'}};
87*7c478bd9Sstevel@tonic-gate struct  pcms    pcmtmp  = {{'*','*','*','o','t','h','e','r'}};
88*7c478bd9Sstevel@tonic-gate int	aflg;
89*7c478bd9Sstevel@tonic-gate int	cflg;
90*7c478bd9Sstevel@tonic-gate int	jflg;
91*7c478bd9Sstevel@tonic-gate int	nflg;
92*7c478bd9Sstevel@tonic-gate int	sflg;
93*7c478bd9Sstevel@tonic-gate int	pflg;
94*7c478bd9Sstevel@tonic-gate int	oflg;
95*7c478bd9Sstevel@tonic-gate int	tflg;
96*7c478bd9Sstevel@tonic-gate int	errflg;
97*7c478bd9Sstevel@tonic-gate 
98*7c478bd9Sstevel@tonic-gate int	ccmp(), kcmp(), ncmp();
99*7c478bd9Sstevel@tonic-gate int	tccmp(), tkcmp(), tncmp();
100*7c478bd9Sstevel@tonic-gate #ifdef uts
101*7c478bd9Sstevel@tonic-gate float   expand();
102*7c478bd9Sstevel@tonic-gate #else
103*7c478bd9Sstevel@tonic-gate ulong_t	expand();
104*7c478bd9Sstevel@tonic-gate #endif
105*7c478bd9Sstevel@tonic-gate 
106*7c478bd9Sstevel@tonic-gate char	*strncpy();
107*7c478bd9Sstevel@tonic-gate 
108*7c478bd9Sstevel@tonic-gate /*  Format specification for ASCII printing */
109*7c478bd9Sstevel@tonic-gate 
110*7c478bd9Sstevel@tonic-gate char	*fmtcmd =	"%-8.8s",
111*7c478bd9Sstevel@tonic-gate 	*fmtcnt =	"%8ld",
112*7c478bd9Sstevel@tonic-gate 	*fmtkcore =	" %11.2f",
113*7c478bd9Sstevel@tonic-gate 	*fmtcpu =	" %9.2f",
114*7c478bd9Sstevel@tonic-gate 	*fmtreal =	" %12.2f",
115*7c478bd9Sstevel@tonic-gate 	*fmtmsz =	" %7.2f",
116*7c478bd9Sstevel@tonic-gate 	*fmtmcpu =	" %6.2f",
117*7c478bd9Sstevel@tonic-gate 	*fmthog =	" %5.2f",
118*7c478bd9Sstevel@tonic-gate 	*fmtcharx =	" %12.0f",
119*7c478bd9Sstevel@tonic-gate 	*fmtblkx =	" %10.0f" ;
120*7c478bd9Sstevel@tonic-gate 
121*7c478bd9Sstevel@tonic-gate main(argc, argv)
122*7c478bd9Sstevel@tonic-gate char **argv;
123*7c478bd9Sstevel@tonic-gate {
124*7c478bd9Sstevel@tonic-gate 	int	c;
125*7c478bd9Sstevel@tonic-gate 	extern	int	optind;
126*7c478bd9Sstevel@tonic-gate 	extern	char	*optarg;
127*7c478bd9Sstevel@tonic-gate 
128*7c478bd9Sstevel@tonic-gate 	while((c = getopt(argc, argv, "acjnspot")) != EOF)
129*7c478bd9Sstevel@tonic-gate 	switch(c) {
130*7c478bd9Sstevel@tonic-gate 		case 'a':
131*7c478bd9Sstevel@tonic-gate 			aflg++;
132*7c478bd9Sstevel@tonic-gate 			continue;
133*7c478bd9Sstevel@tonic-gate 		case 'c':
134*7c478bd9Sstevel@tonic-gate 			cflg++;
135*7c478bd9Sstevel@tonic-gate 			continue;
136*7c478bd9Sstevel@tonic-gate 		case 'j':
137*7c478bd9Sstevel@tonic-gate 			jflg++;
138*7c478bd9Sstevel@tonic-gate 			continue;
139*7c478bd9Sstevel@tonic-gate 		case 'n':
140*7c478bd9Sstevel@tonic-gate 			nflg++;
141*7c478bd9Sstevel@tonic-gate 			continue;
142*7c478bd9Sstevel@tonic-gate 		case 's':
143*7c478bd9Sstevel@tonic-gate 			sflg++;
144*7c478bd9Sstevel@tonic-gate 			continue;
145*7c478bd9Sstevel@tonic-gate 		case 'p':
146*7c478bd9Sstevel@tonic-gate 			pflg++;
147*7c478bd9Sstevel@tonic-gate 			continue;
148*7c478bd9Sstevel@tonic-gate 		case 'o':
149*7c478bd9Sstevel@tonic-gate 			oflg++;
150*7c478bd9Sstevel@tonic-gate 			continue;
151*7c478bd9Sstevel@tonic-gate 		case 't':
152*7c478bd9Sstevel@tonic-gate 			tflg++;
153*7c478bd9Sstevel@tonic-gate 			continue;
154*7c478bd9Sstevel@tonic-gate 		default:
155*7c478bd9Sstevel@tonic-gate 			errflg++;
156*7c478bd9Sstevel@tonic-gate 			continue;
157*7c478bd9Sstevel@tonic-gate 	}
158*7c478bd9Sstevel@tonic-gate 	if(errflg){
159*7c478bd9Sstevel@tonic-gate 		fprintf(stderr, "Usage: %s [-acjnspot] [file ...]\n", argv[0]);
160*7c478bd9Sstevel@tonic-gate 		exit(1);
161*7c478bd9Sstevel@tonic-gate 	}
162*7c478bd9Sstevel@tonic-gate 	if(tflg) {
163*7c478bd9Sstevel@tonic-gate 		if( (tcm = (struct tcms *)calloc(CSIZE, sizeof(struct tcms))) == NULL) {
164*7c478bd9Sstevel@tonic-gate 			fprintf(stderr, "%s: Cannot allocate memory\n", argv[0]);
165*7c478bd9Sstevel@tonic-gate 			exit(5);
166*7c478bd9Sstevel@tonic-gate 		}
167*7c478bd9Sstevel@tonic-gate 		for(; optind < argc; optind++)
168*7c478bd9Sstevel@tonic-gate 			tdofile(argv[optind]);
169*7c478bd9Sstevel@tonic-gate 		if (jflg)
170*7c478bd9Sstevel@tonic-gate 			tfixjunk();
171*7c478bd9Sstevel@tonic-gate 		tsqueeze();
172*7c478bd9Sstevel@tonic-gate 		qsort(tcm, csize, sizeof(tcm[0]), nflg? tncmp: (cflg? tccmp: tkcmp));
173*7c478bd9Sstevel@tonic-gate 		if (aflg)
174*7c478bd9Sstevel@tonic-gate 			toutpta();
175*7c478bd9Sstevel@tonic-gate 		else
176*7c478bd9Sstevel@tonic-gate 			toutptc();
177*7c478bd9Sstevel@tonic-gate 	} else {
178*7c478bd9Sstevel@tonic-gate 		if( (pcm = (struct pcms *)calloc(CSIZE, sizeof(struct pcms))) == NULL) {
179*7c478bd9Sstevel@tonic-gate 			fprintf(stderr, "%s: Cannot allocate memory\n", argv[0]);
180*7c478bd9Sstevel@tonic-gate 			exit(6);
181*7c478bd9Sstevel@tonic-gate 		}
182*7c478bd9Sstevel@tonic-gate 		for(; optind < argc; optind++)
183*7c478bd9Sstevel@tonic-gate 			dofile(argv[optind]);
184*7c478bd9Sstevel@tonic-gate 		if (jflg)
185*7c478bd9Sstevel@tonic-gate 			fixjunk();
186*7c478bd9Sstevel@tonic-gate 		squeeze();
187*7c478bd9Sstevel@tonic-gate 		qsort(pcm, csize, sizeof(pcm[0]), nflg? ncmp: (cflg? ccmp: kcmp));
188*7c478bd9Sstevel@tonic-gate 		if (aflg)
189*7c478bd9Sstevel@tonic-gate 			outputa();
190*7c478bd9Sstevel@tonic-gate 		else
191*7c478bd9Sstevel@tonic-gate 			outputc();
192*7c478bd9Sstevel@tonic-gate 	}
193*7c478bd9Sstevel@tonic-gate 	exit(0);
194*7c478bd9Sstevel@tonic-gate 
195*7c478bd9Sstevel@tonic-gate }
196*7c478bd9Sstevel@tonic-gate 
197*7c478bd9Sstevel@tonic-gate tdofile(fname)
198*7c478bd9Sstevel@tonic-gate char *fname;
199*7c478bd9Sstevel@tonic-gate {
200*7c478bd9Sstevel@tonic-gate 	struct tcms cmt;
201*7c478bd9Sstevel@tonic-gate 	union {
202*7c478bd9Sstevel@tonic-gate 		struct acct ab;		/* SVR4 acct structure */
203*7c478bd9Sstevel@tonic-gate 		struct o_acct oab;	/* SVR3 acct structure */
204*7c478bd9Sstevel@tonic-gate 	} acct;
205*7c478bd9Sstevel@tonic-gate 	int ver = 0;
206*7c478bd9Sstevel@tonic-gate 	ulong_t	mem;
207*7c478bd9Sstevel@tonic-gate 	ulong_t	cpu;
208*7c478bd9Sstevel@tonic-gate 	ulong_t	real;
209*7c478bd9Sstevel@tonic-gate 
210*7c478bd9Sstevel@tonic-gate 	if (freopen(fname, "r", stdin) == NULL) {
211*7c478bd9Sstevel@tonic-gate 		fprintf(stderr,  "acctcms: cannot open %s\n", fname);
212*7c478bd9Sstevel@tonic-gate 		return;
213*7c478bd9Sstevel@tonic-gate 	}
214*7c478bd9Sstevel@tonic-gate 
215*7c478bd9Sstevel@tonic-gate 	if (sflg)
216*7c478bd9Sstevel@tonic-gate 		while (fread(&cmt, sizeof(cmt), 1, stdin) == 1)
217*7c478bd9Sstevel@tonic-gate 			tenter(&cmt);
218*7c478bd9Sstevel@tonic-gate 	else {
219*7c478bd9Sstevel@tonic-gate 		if (fread(&acct.ab, sizeof(acct.ab), 1, stdin) == 1)
220*7c478bd9Sstevel@tonic-gate 			/* check for expanded account structure flag */
221*7c478bd9Sstevel@tonic-gate 			if (acct.ab.ac_flag & AEXPND)
222*7c478bd9Sstevel@tonic-gate 				ver = 2;		/* 4.0 acct file */
223*7c478bd9Sstevel@tonic-gate 			else
224*7c478bd9Sstevel@tonic-gate 				ver = 1;		/* SVR3.x acct file */
225*7c478bd9Sstevel@tonic-gate 
226*7c478bd9Sstevel@tonic-gate 		rewind(stdin);	/* reset file pointer */
227*7c478bd9Sstevel@tonic-gate 
228*7c478bd9Sstevel@tonic-gate  		switch(ver) {
229*7c478bd9Sstevel@tonic-gate 
230*7c478bd9Sstevel@tonic-gate 		default:
231*7c478bd9Sstevel@tonic-gate 				/* this can't happen */
232*7c478bd9Sstevel@tonic-gate 			fprintf(stderr, "acctcms: encountered bad version number\n");
233*7c478bd9Sstevel@tonic-gate 			return;
234*7c478bd9Sstevel@tonic-gate 		case 1 :
235*7c478bd9Sstevel@tonic-gate 			while (fread(&acct.oab, sizeof(acct.oab), 1, stdin) == 1) {
236*7c478bd9Sstevel@tonic-gate 				CPYN(cmt.tcm_comm, acct.oab.ac_comm);
237*7c478bd9Sstevel@tonic-gate 				cmt.tcm_pc = 1;
238*7c478bd9Sstevel@tonic-gate 				cpu = expand(acct.oab.ac_stime)+
239*7c478bd9Sstevel@tonic-gate 					expand(acct.oab.ac_utime);
240*7c478bd9Sstevel@tonic-gate 				cmt.tcm_cpu = MINT(cpu);
241*7c478bd9Sstevel@tonic-gate 				real = expand(acct.oab.ac_etime);
242*7c478bd9Sstevel@tonic-gate 				cmt.tcm_real = MINT(real);
243*7c478bd9Sstevel@tonic-gate 				mem = expand(acct.oab.ac_mem);
244*7c478bd9Sstevel@tonic-gate 				cmt.tcm_kcore = MINT(KCORE(mem));
245*7c478bd9Sstevel@tonic-gate 				cmt.tcm_io = expand(acct.oab.ac_io);
246*7c478bd9Sstevel@tonic-gate 				cmt.tcm_rw = expand(acct.oab.ac_rw);
247*7c478bd9Sstevel@tonic-gate 				tenter(&cmt);
248*7c478bd9Sstevel@tonic-gate 			}
249*7c478bd9Sstevel@tonic-gate 			break;
250*7c478bd9Sstevel@tonic-gate 		case 2 :
251*7c478bd9Sstevel@tonic-gate 
252*7c478bd9Sstevel@tonic-gate 			while (fread(&acct.ab, sizeof(acct.ab), 1, stdin) == 1) {
253*7c478bd9Sstevel@tonic-gate 				CPYN(cmt.tcm_comm, acct.ab.ac_comm);
254*7c478bd9Sstevel@tonic-gate 				cmt.tcm_pc = 1;
255*7c478bd9Sstevel@tonic-gate 				cpu = expand(acct.oab.ac_stime)+
256*7c478bd9Sstevel@tonic-gate 					expand(acct.oab.ac_utime);
257*7c478bd9Sstevel@tonic-gate 				cmt.tcm_cpu = MINT(cpu);
258*7c478bd9Sstevel@tonic-gate 				real = expand(acct.ab.ac_etime);
259*7c478bd9Sstevel@tonic-gate 				cmt.tcm_real = MINT(real);
260*7c478bd9Sstevel@tonic-gate 				mem = expand(acct.ab.ac_mem);
261*7c478bd9Sstevel@tonic-gate 				cmt.tcm_kcore = MINT(KCORE(mem));
262*7c478bd9Sstevel@tonic-gate 				cmt.tcm_io = expand(acct.ab.ac_io);
263*7c478bd9Sstevel@tonic-gate 				cmt.tcm_rw = expand(acct.ab.ac_rw);
264*7c478bd9Sstevel@tonic-gate 				tenter(&cmt);
265*7c478bd9Sstevel@tonic-gate 			}
266*7c478bd9Sstevel@tonic-gate 			break;
267*7c478bd9Sstevel@tonic-gate 		}
268*7c478bd9Sstevel@tonic-gate 	}
269*7c478bd9Sstevel@tonic-gate }
270*7c478bd9Sstevel@tonic-gate 
271*7c478bd9Sstevel@tonic-gate dofile(fname)
272*7c478bd9Sstevel@tonic-gate char *fname;
273*7c478bd9Sstevel@tonic-gate {
274*7c478bd9Sstevel@tonic-gate 	union {
275*7c478bd9Sstevel@tonic-gate 		struct acct ab;
276*7c478bd9Sstevel@tonic-gate 		struct o_acct oab;
277*7c478bd9Sstevel@tonic-gate 	} acct;
278*7c478bd9Sstevel@tonic-gate 	struct pcms 	pcmt;
279*7c478bd9Sstevel@tonic-gate 	double		ratio;
280*7c478bd9Sstevel@tonic-gate 	long		elaps[2];
281*7c478bd9Sstevel@tonic-gate 	ulong_t		etime;
282*7c478bd9Sstevel@tonic-gate 	double	dtmp;
283*7c478bd9Sstevel@tonic-gate 	unsigned long	ltmp;
284*7c478bd9Sstevel@tonic-gate 	ulong_t	mem;
285*7c478bd9Sstevel@tonic-gate 	ulong_t	cpu;
286*7c478bd9Sstevel@tonic-gate 	ulong_t	real;
287*7c478bd9Sstevel@tonic-gate 
288*7c478bd9Sstevel@tonic-gate 	if (freopen(fname, "r", stdin) == NULL) {
289*7c478bd9Sstevel@tonic-gate 		fprintf(stderr,  "acctcms: cannot open %s\n", fname);
290*7c478bd9Sstevel@tonic-gate 		return;
291*7c478bd9Sstevel@tonic-gate 	}
292*7c478bd9Sstevel@tonic-gate 
293*7c478bd9Sstevel@tonic-gate 	if (sflg)
294*7c478bd9Sstevel@tonic-gate 		while (fread(&pcmt, sizeof(pcmt), 1, stdin) == 1)
295*7c478bd9Sstevel@tonic-gate 			enter(&pcmt);
296*7c478bd9Sstevel@tonic-gate 	else {
297*7c478bd9Sstevel@tonic-gate 		int ver = 0;
298*7c478bd9Sstevel@tonic-gate 
299*7c478bd9Sstevel@tonic-gate 		if (fread(&acct.ab, sizeof(acct.ab), 1, stdin) == 1)
300*7c478bd9Sstevel@tonic-gate 			/* check for expanded account structure flag */
301*7c478bd9Sstevel@tonic-gate 			if (acct.ab.ac_flag & AEXPND)
302*7c478bd9Sstevel@tonic-gate 				ver = 2;		/* 4.0 acct file */
303*7c478bd9Sstevel@tonic-gate 			else
304*7c478bd9Sstevel@tonic-gate 				ver = 1;		/* SVR3.x acct file */
305*7c478bd9Sstevel@tonic-gate 
306*7c478bd9Sstevel@tonic-gate 		rewind(stdin);	/* reset file pointer */
307*7c478bd9Sstevel@tonic-gate 
308*7c478bd9Sstevel@tonic-gate 		switch(ver) {
309*7c478bd9Sstevel@tonic-gate 
310*7c478bd9Sstevel@tonic-gate 		default :
311*7c478bd9Sstevel@tonic-gate  				/* this can't happen */
312*7c478bd9Sstevel@tonic-gate 			fprintf(stderr, "acctcms: encountered bad version number\n");
313*7c478bd9Sstevel@tonic-gate 			return;
314*7c478bd9Sstevel@tonic-gate 		case 1 :
315*7c478bd9Sstevel@tonic-gate 
316*7c478bd9Sstevel@tonic-gate 			while (fread(&acct.oab, sizeof(acct.oab), 1, stdin) == 1) {
317*7c478bd9Sstevel@tonic-gate 				CPYN(pcmt.pcm_comm, acct.oab.ac_comm);
318*7c478bd9Sstevel@tonic-gate 			/*
319*7c478bd9Sstevel@tonic-gate 			** Approximate P/NP split as same as elapsed time
320*7c478bd9Sstevel@tonic-gate 		 	*/
321*7c478bd9Sstevel@tonic-gate 				if((etime = SECS(expand(acct.oab.ac_etime))) == 0)
322*7c478bd9Sstevel@tonic-gate 					etime = 1;
323*7c478bd9Sstevel@tonic-gate 				if (pnpsplit(acct.oab.ac_btime, etime, elaps)
324*7c478bd9Sstevel@tonic-gate 				    == 0) {
325*7c478bd9Sstevel@tonic-gate 					(void) fprintf(stderr, "acctcms: could "
326*7c478bd9Sstevel@tonic-gate 					    "not calculate prime/non-prime "
327*7c478bd9Sstevel@tonic-gate 					    "hours\n");
328*7c478bd9Sstevel@tonic-gate 					exit(1);
329*7c478bd9Sstevel@tonic-gate 				}
330*7c478bd9Sstevel@tonic-gate 				ratio = (double)elaps[PRIME]/(double)etime;
331*7c478bd9Sstevel@tonic-gate 				if(elaps[PRIME] > elaps[NONPRIME]) {
332*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[PRIME] = 1;
333*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[NONPRIME] = 0;
334*7c478bd9Sstevel@tonic-gate 				} else {
335*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[PRIME] = 0;
336*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[NONPRIME] = 1;
337*7c478bd9Sstevel@tonic-gate 				}
338*7c478bd9Sstevel@tonic-gate 				cpu = expand(acct.oab.ac_stime)+
339*7c478bd9Sstevel@tonic-gate 					expand(acct.oab.ac_utime);
340*7c478bd9Sstevel@tonic-gate 				dtmp = MINT(cpu);
341*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_cpu[PRIME] = dtmp * ratio;
342*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_cpu[NONPRIME] = (ratio == 1.0) ? 0.0 :
343*7c478bd9Sstevel@tonic-gate 					(dtmp - pcmt.pcm_cpu[PRIME]);
344*7c478bd9Sstevel@tonic-gate 				real = expand(acct.oab.ac_etime);
345*7c478bd9Sstevel@tonic-gate 				dtmp = MINT(real);
346*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_real[PRIME] = dtmp * ratio;
347*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_real[NONPRIME] = (ratio == 1.0) ? 0.0 :
348*7c478bd9Sstevel@tonic-gate 					(dtmp - pcmt.pcm_real[PRIME]);
349*7c478bd9Sstevel@tonic-gate 				mem = expand(acct.oab.ac_mem);
350*7c478bd9Sstevel@tonic-gate 				dtmp = MINT(KCORE(mem));
351*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_kcore[PRIME] = dtmp * ratio;
352*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_kcore[NONPRIME] = (ratio == 1.0) ? 0.0 :
353*7c478bd9Sstevel@tonic-gate 					(dtmp - pcmt.pcm_kcore[PRIME]);
354*7c478bd9Sstevel@tonic-gate 				ltmp = expand(acct.oab.ac_io);
355*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_io[PRIME] = (double)ltmp * ratio;
356*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_io[NONPRIME] = (ratio == 1.0) ? 0.0 :
357*7c478bd9Sstevel@tonic-gate 					((double)ltmp - pcmt.pcm_io[PRIME]);
358*7c478bd9Sstevel@tonic-gate 				ltmp = expand(acct.oab.ac_rw);
359*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_rw[PRIME] = (double)ltmp * ratio;
360*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_rw[NONPRIME] = (ratio == 1.0) ? 0.0 :
361*7c478bd9Sstevel@tonic-gate 					((double)ltmp - pcmt.pcm_rw[PRIME]);
362*7c478bd9Sstevel@tonic-gate 				enter(&pcmt);
363*7c478bd9Sstevel@tonic-gate 			}
364*7c478bd9Sstevel@tonic-gate 
365*7c478bd9Sstevel@tonic-gate 			break;
366*7c478bd9Sstevel@tonic-gate 		case 2 :
367*7c478bd9Sstevel@tonic-gate 			while (fread(&acct.ab, sizeof(acct.ab), 1, stdin) == 1) {
368*7c478bd9Sstevel@tonic-gate 				CPYN(pcmt.pcm_comm, acct.ab.ac_comm);
369*7c478bd9Sstevel@tonic-gate 				/*
370*7c478bd9Sstevel@tonic-gate 				** Approximate P/NP split as same as elapsed time
371*7c478bd9Sstevel@tonic-gate 		 		*/
372*7c478bd9Sstevel@tonic-gate 				if((etime = SECS(expand(acct.ab.ac_etime))) == 0)
373*7c478bd9Sstevel@tonic-gate 					etime = 1;
374*7c478bd9Sstevel@tonic-gate 				if(pnpsplit(acct.ab.ac_btime, etime, elaps) == 0) {
375*7c478bd9Sstevel@tonic-gate 					fprintf(stderr, "acctcms: could not calculate prime/non-prime hours\n");
376*7c478bd9Sstevel@tonic-gate 					exit(1);
377*7c478bd9Sstevel@tonic-gate 				}
378*7c478bd9Sstevel@tonic-gate 				ratio = (double)elaps[PRIME]/(double)etime;
379*7c478bd9Sstevel@tonic-gate 				if(elaps[PRIME] > elaps[NONPRIME]) {
380*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[PRIME] = 1;
381*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[NONPRIME] = 0;
382*7c478bd9Sstevel@tonic-gate 				} else {
383*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[PRIME] = 0;
384*7c478bd9Sstevel@tonic-gate 					pcmt.pcm_pc[NONPRIME] = 1;
385*7c478bd9Sstevel@tonic-gate 				}
386*7c478bd9Sstevel@tonic-gate 				cpu = expand(acct.ab.ac_stime)+
387*7c478bd9Sstevel@tonic-gate 					expand(acct.ab.ac_utime);
388*7c478bd9Sstevel@tonic-gate 				dtmp = MINT(cpu);
389*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_cpu[PRIME] = dtmp * ratio;
390*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_cpu[NONPRIME] = (ratio == 1.0) ? 0.0 :
391*7c478bd9Sstevel@tonic-gate 					(dtmp - pcmt.pcm_cpu[PRIME]);
392*7c478bd9Sstevel@tonic-gate 				real = expand(acct.ab.ac_etime);
393*7c478bd9Sstevel@tonic-gate 				dtmp = MINT(real);
394*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_real[PRIME] = dtmp * ratio;
395*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_real[NONPRIME] = (ratio == 1.0) ? 0.0 :
396*7c478bd9Sstevel@tonic-gate 					(dtmp - pcmt.pcm_real[PRIME]);
397*7c478bd9Sstevel@tonic-gate 				mem = expand(acct.ab.ac_mem);
398*7c478bd9Sstevel@tonic-gate 				dtmp = MINT(KCORE(mem));
399*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_kcore[PRIME] = dtmp * ratio;
400*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_kcore[NONPRIME] = (ratio == 1.0) ? 0.0 :
401*7c478bd9Sstevel@tonic-gate 					(dtmp - pcmt.pcm_kcore[PRIME]);
402*7c478bd9Sstevel@tonic-gate 				ltmp = expand(acct.ab.ac_io);
403*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_io[PRIME] = (double)ltmp * ratio;
404*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_io[NONPRIME] = (ratio == 1.0) ? 0.0 :
405*7c478bd9Sstevel@tonic-gate 					((double)ltmp - pcmt.pcm_io[PRIME]);
406*7c478bd9Sstevel@tonic-gate 				ltmp = expand(acct.ab.ac_rw);
407*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_rw[PRIME] = (double)ltmp * ratio;
408*7c478bd9Sstevel@tonic-gate 				pcmt.pcm_rw[NONPRIME] = (ratio == 1.0) ? 0.0 :
409*7c478bd9Sstevel@tonic-gate 					((double)ltmp - pcmt.pcm_rw[PRIME]);
410*7c478bd9Sstevel@tonic-gate 				enter(&pcmt);
411*7c478bd9Sstevel@tonic-gate 			}
412*7c478bd9Sstevel@tonic-gate 
413*7c478bd9Sstevel@tonic-gate 			break;
414*7c478bd9Sstevel@tonic-gate 		}
415*7c478bd9Sstevel@tonic-gate 	}
416*7c478bd9Sstevel@tonic-gate }
417*7c478bd9Sstevel@tonic-gate 
418*7c478bd9Sstevel@tonic-gate tenter(p)
419*7c478bd9Sstevel@tonic-gate register struct tcms *p;
420*7c478bd9Sstevel@tonic-gate {
421*7c478bd9Sstevel@tonic-gate 	register i;
422*7c478bd9Sstevel@tonic-gate 	register j;
423*7c478bd9Sstevel@tonic-gate 	register struct tcms *ntcm;
424*7c478bd9Sstevel@tonic-gate 	for (i = j = 0; j < sizeof(p->tcm_comm); j++) {
425*7c478bd9Sstevel@tonic-gate 		if (p->tcm_comm[j] && p->tcm_comm[j] <= 037)
426*7c478bd9Sstevel@tonic-gate 			p->tcm_comm[j] = '?';
427*7c478bd9Sstevel@tonic-gate 		i = i*7 + p->tcm_comm[j];	/* hash function */
428*7c478bd9Sstevel@tonic-gate 	}
429*7c478bd9Sstevel@tonic-gate 	if (i < 0)
430*7c478bd9Sstevel@tonic-gate 		i = -i;
431*7c478bd9Sstevel@tonic-gate 	for (i %= csize, j = 0; tcm[i].tcm_comm[0] && j != csize; i = (i+1)%csize, j++)
432*7c478bd9Sstevel@tonic-gate 		if (EQN(p->tcm_comm, tcm[i].tcm_comm))
433*7c478bd9Sstevel@tonic-gate 			break;
434*7c478bd9Sstevel@tonic-gate 	if(j == csize) {
435*7c478bd9Sstevel@tonic-gate 		if ((ntcm = (struct tcms *) realloc(tcm,
436*7c478bd9Sstevel@tonic-gate 			(csize + CSIZE - 1) * sizeof (struct tcms))) == NULL) {
437*7c478bd9Sstevel@tonic-gate 			fprintf(stderr,
438*7c478bd9Sstevel@tonic-gate 				"acctcms: Cannot reallocate memory (tcm)\n");
439*7c478bd9Sstevel@tonic-gate 			return(-1);
440*7c478bd9Sstevel@tonic-gate 		} else {
441*7c478bd9Sstevel@tonic-gate 			memset(&ntcm[csize], 0, CSIZE - 1);
442*7c478bd9Sstevel@tonic-gate 			tcm = ntcm;
443*7c478bd9Sstevel@tonic-gate 			if (!EQN(p->tcm_comm, tcm[i].tcm_comm))
444*7c478bd9Sstevel@tonic-gate 				i = csize;
445*7c478bd9Sstevel@tonic-gate 			csize = csize + CSIZE - 1;
446*7c478bd9Sstevel@tonic-gate 		}
447*7c478bd9Sstevel@tonic-gate 	}
448*7c478bd9Sstevel@tonic-gate 	if (tcm[i].tcm_comm[0] == 0)
449*7c478bd9Sstevel@tonic-gate 		CPYN(tcm[i].tcm_comm, p->tcm_comm);
450*7c478bd9Sstevel@tonic-gate 	tcmadd(&tcm[i], p);
451*7c478bd9Sstevel@tonic-gate 	return(i);
452*7c478bd9Sstevel@tonic-gate }
453*7c478bd9Sstevel@tonic-gate enter(p)
454*7c478bd9Sstevel@tonic-gate register struct pcms *p;
455*7c478bd9Sstevel@tonic-gate {
456*7c478bd9Sstevel@tonic-gate 	register i;
457*7c478bd9Sstevel@tonic-gate 	register j;
458*7c478bd9Sstevel@tonic-gate 	register struct pcms *npcm;
459*7c478bd9Sstevel@tonic-gate 	for (i = j = 0; j < sizeof(p->pcm_comm); j++) {
460*7c478bd9Sstevel@tonic-gate 		if (p->pcm_comm[j] && p->pcm_comm[j] <= 037)
461*7c478bd9Sstevel@tonic-gate 			p->pcm_comm[j] = '?';
462*7c478bd9Sstevel@tonic-gate 		i = i*7 + p->pcm_comm[j];	/* hash function */
463*7c478bd9Sstevel@tonic-gate 	}
464*7c478bd9Sstevel@tonic-gate 	if (i < 0)
465*7c478bd9Sstevel@tonic-gate 		i = -i;
466*7c478bd9Sstevel@tonic-gate 	for (i %= csize, j = 0; pcm[i].pcm_comm[0] && j != csize; i = (i+1)%csize, j++)
467*7c478bd9Sstevel@tonic-gate 		if (EQN(p->pcm_comm, pcm[i].pcm_comm))
468*7c478bd9Sstevel@tonic-gate 			break;
469*7c478bd9Sstevel@tonic-gate 	if(j == csize) {
470*7c478bd9Sstevel@tonic-gate 		if ((npcm = (struct pcms *) realloc(pcm,
471*7c478bd9Sstevel@tonic-gate 			(csize + CSIZE - 1) * sizeof (struct pcms))) == NULL) {
472*7c478bd9Sstevel@tonic-gate 			fprintf(stderr,
473*7c478bd9Sstevel@tonic-gate 				"acctcms: Cannot reallocate memory (pcm)\n");
474*7c478bd9Sstevel@tonic-gate 			return(-1);
475*7c478bd9Sstevel@tonic-gate 		} else {
476*7c478bd9Sstevel@tonic-gate 			memset(&npcm[csize], 0, CSIZE - 1);
477*7c478bd9Sstevel@tonic-gate 			pcm = npcm;
478*7c478bd9Sstevel@tonic-gate 			if (!EQN(p->pcm_comm, pcm[i].pcm_comm))
479*7c478bd9Sstevel@tonic-gate 				i = csize;
480*7c478bd9Sstevel@tonic-gate 			csize = csize + CSIZE - 1;
481*7c478bd9Sstevel@tonic-gate 		}
482*7c478bd9Sstevel@tonic-gate 	}
483*7c478bd9Sstevel@tonic-gate 	if (pcm[i].pcm_comm[0] == 0)
484*7c478bd9Sstevel@tonic-gate 		CPYN(pcm[i].pcm_comm, p->pcm_comm);
485*7c478bd9Sstevel@tonic-gate 	pcmadd(&pcm[i], p);
486*7c478bd9Sstevel@tonic-gate 	return(i);
487*7c478bd9Sstevel@tonic-gate }
488*7c478bd9Sstevel@tonic-gate tfixjunk()	/* combine commands used only once */
489*7c478bd9Sstevel@tonic-gate {
490*7c478bd9Sstevel@tonic-gate 	register i, j;
491*7c478bd9Sstevel@tonic-gate 	j = enter(&tcmtmp);
492*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
493*7c478bd9Sstevel@tonic-gate 		if (i != j && tcm[i].tcm_comm[0] && tcm[i].tcm_pc <= 1) {
494*7c478bd9Sstevel@tonic-gate 			tcmadd(&tcm[j], &tcm[i]);
495*7c478bd9Sstevel@tonic-gate 			tcm[i].tcm_comm[0] = 0;
496*7c478bd9Sstevel@tonic-gate 		}
497*7c478bd9Sstevel@tonic-gate }
498*7c478bd9Sstevel@tonic-gate fixjunk()	/* combine commands used only once */
499*7c478bd9Sstevel@tonic-gate {
500*7c478bd9Sstevel@tonic-gate 	register i, j;
501*7c478bd9Sstevel@tonic-gate 	j = enter(&pcmtmp);
502*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
503*7c478bd9Sstevel@tonic-gate 		if (i != j && pcm[i].pcm_comm[0] && (pcm[i].pcm_pc[PRIME] + pcm[i].pcm_pc[NONPRIME]) <= 1) {
504*7c478bd9Sstevel@tonic-gate 			pcmadd(&pcm[j], &pcm[i]);
505*7c478bd9Sstevel@tonic-gate 			pcm[i].pcm_comm[0] = 0;
506*7c478bd9Sstevel@tonic-gate 		}
507*7c478bd9Sstevel@tonic-gate }
508*7c478bd9Sstevel@tonic-gate 
509*7c478bd9Sstevel@tonic-gate tcmadd(p1, p2)
510*7c478bd9Sstevel@tonic-gate register struct tcms *p1, *p2;
511*7c478bd9Sstevel@tonic-gate {
512*7c478bd9Sstevel@tonic-gate 	p1->tcm_pc += p2->tcm_pc;
513*7c478bd9Sstevel@tonic-gate 	p1->tcm_cpu = p1->tcm_cpu + p2->tcm_cpu;
514*7c478bd9Sstevel@tonic-gate 	p1->tcm_real = p1->tcm_real + p2->tcm_real;
515*7c478bd9Sstevel@tonic-gate 	p1->tcm_kcore = p1->tcm_kcore + p2->tcm_kcore;
516*7c478bd9Sstevel@tonic-gate 	p1->tcm_io += p2->tcm_io;
517*7c478bd9Sstevel@tonic-gate 	p1->tcm_rw += p2->tcm_rw;
518*7c478bd9Sstevel@tonic-gate }
519*7c478bd9Sstevel@tonic-gate pcmadd(p1, p2)
520*7c478bd9Sstevel@tonic-gate register struct pcms *p1, *p2;
521*7c478bd9Sstevel@tonic-gate {
522*7c478bd9Sstevel@tonic-gate 	p1->pcm_pc[PRIME] += p2->pcm_pc[PRIME];
523*7c478bd9Sstevel@tonic-gate 	p1->pcm_pc[NONPRIME] += p2->pcm_pc[NONPRIME];
524*7c478bd9Sstevel@tonic-gate 	p1->pcm_cpu[PRIME] += p2->pcm_cpu[PRIME];
525*7c478bd9Sstevel@tonic-gate 	p1->pcm_cpu[NONPRIME] += p2->pcm_cpu[NONPRIME];
526*7c478bd9Sstevel@tonic-gate 	p1->pcm_real[PRIME] += p2->pcm_real[PRIME];
527*7c478bd9Sstevel@tonic-gate 	p1->pcm_real[NONPRIME] += p2->pcm_real[NONPRIME];
528*7c478bd9Sstevel@tonic-gate 	p1->pcm_kcore[PRIME] += p2->pcm_kcore[PRIME];
529*7c478bd9Sstevel@tonic-gate 	p1->pcm_kcore[NONPRIME] += p2->pcm_kcore[NONPRIME];
530*7c478bd9Sstevel@tonic-gate 	p1->pcm_io[PRIME] += p2->pcm_io[PRIME];
531*7c478bd9Sstevel@tonic-gate 	p1->pcm_io[NONPRIME] += p2->pcm_io[NONPRIME];
532*7c478bd9Sstevel@tonic-gate 	p1->pcm_rw[PRIME] += p2->pcm_rw[PRIME];
533*7c478bd9Sstevel@tonic-gate 	p1->pcm_rw[NONPRIME] += p2->pcm_rw[NONPRIME];
534*7c478bd9Sstevel@tonic-gate }
535*7c478bd9Sstevel@tonic-gate 
536*7c478bd9Sstevel@tonic-gate tsqueeze()	/* get rid of holes in hash table */
537*7c478bd9Sstevel@tonic-gate {
538*7c478bd9Sstevel@tonic-gate 	register i, k;
539*7c478bd9Sstevel@tonic-gate 
540*7c478bd9Sstevel@tonic-gate 	for (i = k = 0; i < csize; i++)
541*7c478bd9Sstevel@tonic-gate 		if (tcm[i].tcm_comm[0]) {
542*7c478bd9Sstevel@tonic-gate 			CPYN(tcm[k].tcm_comm, tcm[i].tcm_comm);
543*7c478bd9Sstevel@tonic-gate 			tcm[k].tcm_pc = tcm[i].tcm_pc;
544*7c478bd9Sstevel@tonic-gate 			tcm[k].tcm_cpu = tcm[i].tcm_cpu;
545*7c478bd9Sstevel@tonic-gate 			tcm[k].tcm_real = tcm[i].tcm_real;
546*7c478bd9Sstevel@tonic-gate 			tcm[k].tcm_kcore = tcm[i].tcm_kcore;
547*7c478bd9Sstevel@tonic-gate 			tcm[k].tcm_io = tcm[i].tcm_io;
548*7c478bd9Sstevel@tonic-gate 			tcm[k].tcm_rw = tcm[i].tcm_rw;
549*7c478bd9Sstevel@tonic-gate 			k++;
550*7c478bd9Sstevel@tonic-gate 		}
551*7c478bd9Sstevel@tonic-gate 	csize = k;
552*7c478bd9Sstevel@tonic-gate }
553*7c478bd9Sstevel@tonic-gate squeeze()	/* get rid of holes in hash table */
554*7c478bd9Sstevel@tonic-gate {
555*7c478bd9Sstevel@tonic-gate 	register i, k;
556*7c478bd9Sstevel@tonic-gate 
557*7c478bd9Sstevel@tonic-gate 	for (i = k = 0; i < csize; i++)
558*7c478bd9Sstevel@tonic-gate 		if (pcm[i].pcm_comm[0]) {
559*7c478bd9Sstevel@tonic-gate 			CPYN(pcm[k].pcm_comm, pcm[i].pcm_comm);
560*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_pc[PRIME] = pcm[i].pcm_pc[PRIME];
561*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_pc[NONPRIME] = pcm[i].pcm_pc[NONPRIME];
562*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_cpu[PRIME] = pcm[i].pcm_cpu[PRIME];
563*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_cpu[NONPRIME] = pcm[i].pcm_cpu[NONPRIME];
564*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_real[PRIME] = pcm[i].pcm_real[PRIME];
565*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_real[NONPRIME] = pcm[i].pcm_real[NONPRIME];
566*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_kcore[PRIME] = pcm[i].pcm_kcore[PRIME];
567*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_kcore[NONPRIME] = pcm[i].pcm_kcore[NONPRIME];
568*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_io[PRIME] = pcm[i].pcm_io[PRIME];
569*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_io[NONPRIME] = pcm[i].pcm_io[NONPRIME];
570*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_rw[PRIME] = pcm[i].pcm_rw[PRIME];
571*7c478bd9Sstevel@tonic-gate 			pcm[k].pcm_rw[NONPRIME] = pcm[i].pcm_rw[NONPRIME];
572*7c478bd9Sstevel@tonic-gate 			k++;
573*7c478bd9Sstevel@tonic-gate 		}
574*7c478bd9Sstevel@tonic-gate 	csize = k;
575*7c478bd9Sstevel@tonic-gate }
576*7c478bd9Sstevel@tonic-gate 
577*7c478bd9Sstevel@tonic-gate tccmp(p1, p2)
578*7c478bd9Sstevel@tonic-gate register struct tcms *p1, *p2;
579*7c478bd9Sstevel@tonic-gate {
580*7c478bd9Sstevel@tonic-gate 	if (p1->tcm_cpu == p2->tcm_cpu)
581*7c478bd9Sstevel@tonic-gate 		return(0);
582*7c478bd9Sstevel@tonic-gate 	return ((p2->tcm_cpu > p1->tcm_cpu)? 1 : -1);
583*7c478bd9Sstevel@tonic-gate }
584*7c478bd9Sstevel@tonic-gate 
585*7c478bd9Sstevel@tonic-gate ccmp(p1, p2)
586*7c478bd9Sstevel@tonic-gate register struct pcms *p1, *p2;
587*7c478bd9Sstevel@tonic-gate {
588*7c478bd9Sstevel@tonic-gate 	register int	index;
589*7c478bd9Sstevel@tonic-gate 
590*7c478bd9Sstevel@tonic-gate 	if( (pflg && oflg) || (!pflg && !oflg) ) {
591*7c478bd9Sstevel@tonic-gate 		if (p1->pcm_cpu[PRIME] + p1->pcm_cpu[NONPRIME] == p2->pcm_cpu[PRIME] + p2->pcm_cpu[NONPRIME])
592*7c478bd9Sstevel@tonic-gate 			return(0);
593*7c478bd9Sstevel@tonic-gate 		return ((p2->pcm_cpu[PRIME] + p2->pcm_cpu[NONPRIME] > p1->pcm_cpu[PRIME] + p1->pcm_cpu[NONPRIME])? 1 : -1);
594*7c478bd9Sstevel@tonic-gate 	}
595*7c478bd9Sstevel@tonic-gate 	index = pflg ? PRIME : NONPRIME;
596*7c478bd9Sstevel@tonic-gate 	if (p1->pcm_cpu[index] == p2->pcm_cpu[index])
597*7c478bd9Sstevel@tonic-gate 		return(0);
598*7c478bd9Sstevel@tonic-gate 	return ((p2->pcm_cpu[index] > p1->pcm_cpu[index])? 1 : -1);
599*7c478bd9Sstevel@tonic-gate }
600*7c478bd9Sstevel@tonic-gate 
601*7c478bd9Sstevel@tonic-gate tkcmp(p1, p2)
602*7c478bd9Sstevel@tonic-gate register struct tcms *p1, *p2;
603*7c478bd9Sstevel@tonic-gate {
604*7c478bd9Sstevel@tonic-gate 	if (p1->tcm_kcore == p2->tcm_kcore)
605*7c478bd9Sstevel@tonic-gate 		return(0);
606*7c478bd9Sstevel@tonic-gate 	return ((p2->tcm_kcore > p1->tcm_kcore)? 1 : -1);
607*7c478bd9Sstevel@tonic-gate }
608*7c478bd9Sstevel@tonic-gate 
609*7c478bd9Sstevel@tonic-gate kcmp(p1, p2)
610*7c478bd9Sstevel@tonic-gate register struct pcms *p1, *p2;
611*7c478bd9Sstevel@tonic-gate {
612*7c478bd9Sstevel@tonic-gate 	register int	index;
613*7c478bd9Sstevel@tonic-gate 
614*7c478bd9Sstevel@tonic-gate 	if( (pflg && oflg) || (!pflg && !pflg) ){
615*7c478bd9Sstevel@tonic-gate 		if (p1->pcm_kcore[PRIME] + p1->pcm_kcore[NONPRIME] == p2->pcm_kcore[PRIME] + p2->pcm_kcore[NONPRIME])
616*7c478bd9Sstevel@tonic-gate 			return(0);
617*7c478bd9Sstevel@tonic-gate 		return ((p2->pcm_kcore[PRIME] + p2->pcm_kcore[NONPRIME] > p1->pcm_kcore[PRIME] + p1->pcm_kcore[NONPRIME])? 1 : -1);
618*7c478bd9Sstevel@tonic-gate 	}
619*7c478bd9Sstevel@tonic-gate 	index = pflg ? PRIME : NONPRIME;
620*7c478bd9Sstevel@tonic-gate 	if (p1->pcm_kcore[index] == p2->pcm_kcore[index])
621*7c478bd9Sstevel@tonic-gate 		return(0);
622*7c478bd9Sstevel@tonic-gate 	return ((p2->pcm_kcore[index] > p1->pcm_kcore[index])? 1 : -1);
623*7c478bd9Sstevel@tonic-gate }
624*7c478bd9Sstevel@tonic-gate 
625*7c478bd9Sstevel@tonic-gate tncmp(p1, p2)
626*7c478bd9Sstevel@tonic-gate register struct tcms *p1, *p2;
627*7c478bd9Sstevel@tonic-gate {
628*7c478bd9Sstevel@tonic-gate 	if (p1->tcm_pc == p2->tcm_pc)
629*7c478bd9Sstevel@tonic-gate 		return(0);
630*7c478bd9Sstevel@tonic-gate 	return ((p2->tcm_pc > p1->tcm_pc)? 1 : -1);
631*7c478bd9Sstevel@tonic-gate }
632*7c478bd9Sstevel@tonic-gate 
633*7c478bd9Sstevel@tonic-gate ncmp(p1, p2)
634*7c478bd9Sstevel@tonic-gate register struct pcms *p1, *p2;
635*7c478bd9Sstevel@tonic-gate {
636*7c478bd9Sstevel@tonic-gate 	register int	index;
637*7c478bd9Sstevel@tonic-gate 
638*7c478bd9Sstevel@tonic-gate 	if( (pflg && oflg) || (!pflg && !oflg) ) {
639*7c478bd9Sstevel@tonic-gate 		if (p1->pcm_pc[PRIME] + p1->pcm_pc[NONPRIME] == p2->pcm_pc[PRIME] + p2->pcm_pc[NONPRIME])
640*7c478bd9Sstevel@tonic-gate 			return(0);
641*7c478bd9Sstevel@tonic-gate 		return ((p2->pcm_pc[PRIME] + p2->pcm_pc[NONPRIME] > p1->pcm_pc[PRIME] + p1->pcm_pc[NONPRIME])? 1 : -1);
642*7c478bd9Sstevel@tonic-gate 	}
643*7c478bd9Sstevel@tonic-gate 	index =  pflg ? PRIME : NONPRIME;
644*7c478bd9Sstevel@tonic-gate 	if (p1->pcm_pc[index] == p2->pcm_pc[index])
645*7c478bd9Sstevel@tonic-gate 		return(0);
646*7c478bd9Sstevel@tonic-gate 	return ((p2->pcm_pc[index] > p1->pcm_pc[index])? 1 : -1);
647*7c478bd9Sstevel@tonic-gate }
648*7c478bd9Sstevel@tonic-gate 
649*7c478bd9Sstevel@tonic-gate char	thd1[] =
650*7c478bd9Sstevel@tonic-gate "COMMAND   NUMBER      TOTAL       TOTAL       TOTAL   MEAN     MEAN     HOG      CHARS        BLOCKS\n";
651*7c478bd9Sstevel@tonic-gate char	thd2[] =
652*7c478bd9Sstevel@tonic-gate "NAME        CMDS    KCOREMIN     CPU-MIN     REAL-MIN SIZE-K  CPU-MIN  FACTOR   TRNSFD         READ\n";
653*7c478bd9Sstevel@tonic-gate toutpta()
654*7c478bd9Sstevel@tonic-gate {
655*7c478bd9Sstevel@tonic-gate 	register i;
656*7c478bd9Sstevel@tonic-gate 
657*7c478bd9Sstevel@tonic-gate 	printf(thd1);
658*7c478bd9Sstevel@tonic-gate 	printf(thd2);
659*7c478bd9Sstevel@tonic-gate 	printf("\n");
660*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
661*7c478bd9Sstevel@tonic-gate 		tcmadd(&tcmtmp, &tcm[i]);
662*7c478bd9Sstevel@tonic-gate 	CPYN(tcmtmp.tcm_comm, "TOTALS");
663*7c478bd9Sstevel@tonic-gate 	tprint(&tcmtmp);
664*7c478bd9Sstevel@tonic-gate 	printf("\n");
665*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
666*7c478bd9Sstevel@tonic-gate 		tprint(&tcm[i]);
667*7c478bd9Sstevel@tonic-gate }
668*7c478bd9Sstevel@tonic-gate 
669*7c478bd9Sstevel@tonic-gate tprint(p)
670*7c478bd9Sstevel@tonic-gate register struct tcms *p;
671*7c478bd9Sstevel@tonic-gate {
672*7c478bd9Sstevel@tonic-gate 	printf("%-8.8s", p->tcm_comm);
673*7c478bd9Sstevel@tonic-gate 	printf(" %7ld", p->tcm_pc);
674*7c478bd9Sstevel@tonic-gate 	printf(" %11.2f", p->tcm_kcore);
675*7c478bd9Sstevel@tonic-gate 	printf(" %10.2f", p->tcm_cpu);
676*7c478bd9Sstevel@tonic-gate 	printf(" %12.2f", p->tcm_real);
677*7c478bd9Sstevel@tonic-gate 	if(p->tcm_cpu == 0)  p->tcm_cpu = 1;
678*7c478bd9Sstevel@tonic-gate 	printf(" %6.2f", p->tcm_kcore/p->tcm_cpu);
679*7c478bd9Sstevel@tonic-gate 	if(p->tcm_pc == 0)  p->tcm_pc = 1;
680*7c478bd9Sstevel@tonic-gate 	printf(" %7.2f", p->tcm_cpu/p->tcm_pc);
681*7c478bd9Sstevel@tonic-gate 	if (p->tcm_real == 0)
682*7c478bd9Sstevel@tonic-gate 		p->tcm_real = 1;
683*7c478bd9Sstevel@tonic-gate 	printf(" %8.2f", p->tcm_cpu/p->tcm_real);
684*7c478bd9Sstevel@tonic-gate 	printf(" %11lu", p->tcm_io);
685*7c478bd9Sstevel@tonic-gate 	printf(" %11lu\n", p->tcm_rw);
686*7c478bd9Sstevel@tonic-gate }
687*7c478bd9Sstevel@tonic-gate 
688*7c478bd9Sstevel@tonic-gate toutptc()
689*7c478bd9Sstevel@tonic-gate {
690*7c478bd9Sstevel@tonic-gate 	register i;
691*7c478bd9Sstevel@tonic-gate 
692*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
693*7c478bd9Sstevel@tonic-gate 		fwrite(&tcm[i], sizeof(tcm[i]), 1, stdout);
694*7c478bd9Sstevel@tonic-gate }
695*7c478bd9Sstevel@tonic-gate 
696*7c478bd9Sstevel@tonic-gate char	hd1[] =
697*7c478bd9Sstevel@tonic-gate "COMMAND   NUMBER      TOTAL       TOTAL       TOTAL   MEAN    MEAN     HOG         CHARS     BLOCKS\n";
698*7c478bd9Sstevel@tonic-gate char	hd2[] =
699*7c478bd9Sstevel@tonic-gate "NAME        CMDS    KCOREMIN     CPU-MIN   REAL-MIN  SIZE-K  CPU-MIN  FACTOR      TRNSFD      READ\n";
700*7c478bd9Sstevel@tonic-gate char	hd3[] =
701*7c478bd9Sstevel@tonic-gate "COMMAND        NUMBER         TOTAL          CPU-MIN                 REAL-MIN        MEAN    MEAN      HOG       CHARS       BLOCKS\n";
702*7c478bd9Sstevel@tonic-gate char	hd4[] =
703*7c478bd9Sstevel@tonic-gate "NAME         (P)    (NP)   KCOREMIN       (P)      (NP)          (P)         (NP)  SIZE-K  CPU-MIN   FACTOR     TRNSFD        READ\n";
704*7c478bd9Sstevel@tonic-gate char	hdprime[] =
705*7c478bd9Sstevel@tonic-gate "                                   PRIME TIME COMMAND SUMMARY\n";
706*7c478bd9Sstevel@tonic-gate char	hdnonprime[] =
707*7c478bd9Sstevel@tonic-gate "                                  NON-PRIME TIME COMMAND SUMMARY\n";
708*7c478bd9Sstevel@tonic-gate char	hdtot[] =
709*7c478bd9Sstevel@tonic-gate "                                     TOTAL COMMAND SUMMARY\n";
710*7c478bd9Sstevel@tonic-gate char	hdp[] =
711*7c478bd9Sstevel@tonic-gate "                                PRIME/NON-PRIME TIME COMMAND SUMMARY\n";
712*7c478bd9Sstevel@tonic-gate 
713*7c478bd9Sstevel@tonic-gate outputa()
714*7c478bd9Sstevel@tonic-gate {
715*7c478bd9Sstevel@tonic-gate 	register i;
716*7c478bd9Sstevel@tonic-gate 
717*7c478bd9Sstevel@tonic-gate 	if( pflg && oflg ) printf(hdp);
718*7c478bd9Sstevel@tonic-gate 	else if(pflg) printf(hdprime);
719*7c478bd9Sstevel@tonic-gate 	else if(oflg) printf(hdnonprime);
720*7c478bd9Sstevel@tonic-gate 	else printf(hdtot);
721*7c478bd9Sstevel@tonic-gate 	if( (!pflg && !oflg) || (pflg ^ oflg)) {
722*7c478bd9Sstevel@tonic-gate 		printf(hd1);
723*7c478bd9Sstevel@tonic-gate 		printf(hd2);
724*7c478bd9Sstevel@tonic-gate 	}
725*7c478bd9Sstevel@tonic-gate 	else {
726*7c478bd9Sstevel@tonic-gate 		printf(hd3);
727*7c478bd9Sstevel@tonic-gate 		printf(hd4);
728*7c478bd9Sstevel@tonic-gate 	}
729*7c478bd9Sstevel@tonic-gate 	printf("\n");
730*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
731*7c478bd9Sstevel@tonic-gate 		pcmadd(&pcmtmp, &pcm[i]);
732*7c478bd9Sstevel@tonic-gate 	CPYN(pcmtmp.pcm_comm, "TOTALS");
733*7c478bd9Sstevel@tonic-gate 	print(&pcmtmp);
734*7c478bd9Sstevel@tonic-gate 	printf("\n");
735*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
736*7c478bd9Sstevel@tonic-gate 		print(&pcm[i]);
737*7c478bd9Sstevel@tonic-gate }
738*7c478bd9Sstevel@tonic-gate 
739*7c478bd9Sstevel@tonic-gate print(p)
740*7c478bd9Sstevel@tonic-gate register struct pcms *p;
741*7c478bd9Sstevel@tonic-gate {
742*7c478bd9Sstevel@tonic-gate 	if(pflg && oflg) pprint(p);
743*7c478bd9Sstevel@tonic-gate 	else if(pflg || oflg) prnt(p, pflg ? PRIME : NONPRIME);
744*7c478bd9Sstevel@tonic-gate 	else totprnt(p);
745*7c478bd9Sstevel@tonic-gate }
746*7c478bd9Sstevel@tonic-gate 
747*7c478bd9Sstevel@tonic-gate prnt(p, hr)
748*7c478bd9Sstevel@tonic-gate register struct pcms *p;
749*7c478bd9Sstevel@tonic-gate register int	hr;
750*7c478bd9Sstevel@tonic-gate {
751*7c478bd9Sstevel@tonic-gate 	if(p->pcm_pc[hr] == 0) return;
752*7c478bd9Sstevel@tonic-gate 	printf(fmtcmd, p->pcm_comm);
753*7c478bd9Sstevel@tonic-gate 	printf(fmtcnt, p->pcm_pc[hr]);
754*7c478bd9Sstevel@tonic-gate 	printf(fmtkcore, p->pcm_kcore[hr]);
755*7c478bd9Sstevel@tonic-gate 	printf(fmtcpu, p->pcm_cpu[hr]);
756*7c478bd9Sstevel@tonic-gate 	printf(fmtreal, p->pcm_real[hr]);
757*7c478bd9Sstevel@tonic-gate 	if(p->pcm_cpu[hr] == 0)  p->pcm_cpu[hr] = 1;
758*7c478bd9Sstevel@tonic-gate 	printf(fmtmsz, p->pcm_kcore[hr]/p->pcm_cpu[hr]);
759*7c478bd9Sstevel@tonic-gate 	if(p->pcm_pc[hr] == 0)  p->pcm_pc[hr] = 1;
760*7c478bd9Sstevel@tonic-gate 	printf(fmtmcpu, p->pcm_cpu[hr]/p->pcm_pc[hr]);
761*7c478bd9Sstevel@tonic-gate 	if (p->pcm_real[hr] == 0)
762*7c478bd9Sstevel@tonic-gate 		p->pcm_real[hr] = 1;
763*7c478bd9Sstevel@tonic-gate 	printf(fmthog, p->pcm_cpu[hr]/p->pcm_real[hr]);
764*7c478bd9Sstevel@tonic-gate 	printf(fmtcharx,p->pcm_io[hr]);
765*7c478bd9Sstevel@tonic-gate 	printf(fmtblkx,p->pcm_rw[hr]);
766*7c478bd9Sstevel@tonic-gate 	printf("\n");
767*7c478bd9Sstevel@tonic-gate }
768*7c478bd9Sstevel@tonic-gate 
769*7c478bd9Sstevel@tonic-gate pprint(p)
770*7c478bd9Sstevel@tonic-gate register struct pcms *p;
771*7c478bd9Sstevel@tonic-gate {
772*7c478bd9Sstevel@tonic-gate 	printf(fmtcmd, p->pcm_comm);
773*7c478bd9Sstevel@tonic-gate 	printf(fmtcnt, p->pcm_pc[PRIME]);
774*7c478bd9Sstevel@tonic-gate 	printf(fmtcnt, p->pcm_pc[NONPRIME]);
775*7c478bd9Sstevel@tonic-gate 	printf(fmtkcore, TOTAL(p->pcm_kcore));
776*7c478bd9Sstevel@tonic-gate 	printf(fmtcpu, p->pcm_cpu[PRIME]);
777*7c478bd9Sstevel@tonic-gate 	printf(fmtcpu, p->pcm_cpu[NONPRIME]);
778*7c478bd9Sstevel@tonic-gate 	printf(fmtreal, p->pcm_real[PRIME]);
779*7c478bd9Sstevel@tonic-gate 	printf(fmtreal, p->pcm_real[NONPRIME]);
780*7c478bd9Sstevel@tonic-gate 	if(TOTAL(p->pcm_cpu) == 0)  p->pcm_cpu[PRIME] = 1;
781*7c478bd9Sstevel@tonic-gate 	printf(fmtmsz, TOTAL(p->pcm_kcore)/TOTAL(p->pcm_cpu));
782*7c478bd9Sstevel@tonic-gate 	if(TOTAL(p->pcm_pc) == 0)  p->pcm_pc[PRIME] = 1;
783*7c478bd9Sstevel@tonic-gate 	printf(fmtmcpu, TOTAL(p->pcm_cpu)/TOTAL(p->pcm_pc));
784*7c478bd9Sstevel@tonic-gate 	if ( TOTAL(p->pcm_real) == 0)
785*7c478bd9Sstevel@tonic-gate 		p->pcm_real[PRIME] = 1;
786*7c478bd9Sstevel@tonic-gate 	printf(fmthog, TOTAL(p->pcm_cpu)/TOTAL(p->pcm_real));
787*7c478bd9Sstevel@tonic-gate 	printf(fmtcharx,TOTAL(p->pcm_io));
788*7c478bd9Sstevel@tonic-gate 	printf(fmtblkx, TOTAL(p->pcm_rw));
789*7c478bd9Sstevel@tonic-gate 	printf("\n");
790*7c478bd9Sstevel@tonic-gate }
791*7c478bd9Sstevel@tonic-gate 
792*7c478bd9Sstevel@tonic-gate totprnt(p)
793*7c478bd9Sstevel@tonic-gate register struct pcms *p;
794*7c478bd9Sstevel@tonic-gate {
795*7c478bd9Sstevel@tonic-gate 	printf(fmtcmd, p->pcm_comm);
796*7c478bd9Sstevel@tonic-gate 	printf(fmtcnt, TOTAL(p->pcm_pc));
797*7c478bd9Sstevel@tonic-gate 	printf(fmtkcore, TOTAL(p->pcm_kcore));
798*7c478bd9Sstevel@tonic-gate 	printf(fmtcpu, TOTAL(p->pcm_cpu));
799*7c478bd9Sstevel@tonic-gate 	printf(fmtreal, TOTAL(p->pcm_real));
800*7c478bd9Sstevel@tonic-gate 	if(TOTAL(p->pcm_cpu) == 0)  p->pcm_cpu[PRIME] = 1;
801*7c478bd9Sstevel@tonic-gate 	printf(fmtmsz, TOTAL(p->pcm_kcore)/TOTAL(p->pcm_cpu));
802*7c478bd9Sstevel@tonic-gate 	if(TOTAL(p->pcm_pc) == 0)  p->pcm_pc[PRIME] = 1;
803*7c478bd9Sstevel@tonic-gate 	printf(fmtmcpu, TOTAL(p->pcm_cpu)/TOTAL(p->pcm_pc));
804*7c478bd9Sstevel@tonic-gate 	if (TOTAL(p->pcm_real) == 0)
805*7c478bd9Sstevel@tonic-gate 		p->pcm_real[PRIME] = 1;
806*7c478bd9Sstevel@tonic-gate 	printf(fmthog, TOTAL(p->pcm_cpu)/TOTAL(p->pcm_real));
807*7c478bd9Sstevel@tonic-gate 	printf(fmtcharx,TOTAL(p->pcm_io));
808*7c478bd9Sstevel@tonic-gate 	printf(fmtblkx,TOTAL(p->pcm_rw));
809*7c478bd9Sstevel@tonic-gate 	printf("\n");
810*7c478bd9Sstevel@tonic-gate }
811*7c478bd9Sstevel@tonic-gate outputc()
812*7c478bd9Sstevel@tonic-gate {
813*7c478bd9Sstevel@tonic-gate 	register i;
814*7c478bd9Sstevel@tonic-gate 
815*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < csize; i++)
816*7c478bd9Sstevel@tonic-gate 		fwrite(&pcm[i], sizeof(pcm[i]), 1, stdout);
817*7c478bd9Sstevel@tonic-gate }
818