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