Home | History | Annotate | Download | only in acct
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     27 /*	  All Rights Reserved  	*/
     28 
     29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     30 
     31 #include <utmpx.h>
     32 
     33 static struct utmpx utdummy;	/* dummy - used to get member sizes */
     34 
     35 #define PACCT		"/var/adm/pacct"
     36 #define HOLFILE		"/etc/acct/holidays"
     37 #define	NHOLIDAYS	200	/* max number of company holidays per year */
     38 #define NSYS		200	/* number of run state changes */
     39 #define NFILE		100	/* max number of files that acctmerg handles */
     40 
     41 #ifdef uts
     42 #define CSIZE 		10001
     43 #define	MAXUSERS	5003
     44 #define A_SSIZE 	60001     /* max num of sessions in 1 acct run */
     45 #define A_TSIZE 	10001     /* max num of line names in 1 acct run */
     46 #define A_USIZE 	20001     /* max num of distinct login names in 1 acct run */
     47 #else
     48 #define CSIZE 		5001
     49 #define	MAXUSERS	3001
     50 #define A_SSIZE 	6001     /* max num of sessions in 1 acct run */
     51 #define A_TSIZE 	1001     /* max num of line names in 1 acct run */
     52 #define A_USIZE 	2001     /* max num of distinct login names in 1 acct run */
     53 #endif
     54 #define TSIZE1		100	/* # distinct names, for speed only */
     55 #define USIZE1		100
     56 
     57 #define	MAXIGN		10
     58 #define	UNUSED		-1
     59 #define	FAIL		-1
     60 #define	SUCCEED		0
     61 #define	TRUE		1
     62 #define	FALSE		0
     63 #define PRIME		0
     64 #define NONPRIME	1
     65 #define MEANSIZE	01
     66 #define KCOREMIN	02
     67 #define HOGFACTOR	04
     68 #define	SEPTIME		010
     69 #define	CPUFACTOR	020
     70 #define IORW		040
     71 #define	ROOT		0
     72 #define	ERR		(-1)
     73 #define	OK		0
     74 #define	NOGOOD		1
     75 #define	VALID		0
     76 #define	INVALID		1
     77 /*
     78  * The size of LSZ is based on MAX_SRCH_DEPTH because of the
     79  * implementation of devtolin()
     80  */
     81 #define MAX_SRCH_DEPTH 4
     82 #define LSZ		(MAX_SRCH_DEPTH * sizeof (utdummy.ut_line))
     83 #define MAX_DEV_PATH	(LSZ + 5)	/* max len of abs line name path */
     84 #define NSZ		(sizeof (utdummy.ut_name)) /* sizeof login name */
     85 #define	LINESZ		(sizeof (utdummy.ut_line)) /* sizeof device name */
     86 /*
     87  * These exist for backward compatibility. Until we can change the
     88  * output formats, we need to keep the field widths the same as
     89  * they always have been.
     90  */
     91 #define OUTPUT_NSZ	8
     92 #define OUTPUT_LSZ	12
     93 
     94 #define MYKIND(flag)	((flag & ACCTF) == 0)
     95 #define SU(flag)	((flag & ASU) == ASU)
     96 #define TOTAL(a)	(a[PRIME] + a[NONPRIME])
     97 #define	okay(time)	((time/100>=0) && (time/100<=24) \
     98 			&& (time%100>=0) && (time%100<60))
     99 #define	pf(dble)	fprintf(stdout, " %7.2lf", dble)
    100 #define	ps(s)		fprintf(stdout, "%8.8s", s)
    101 #define	diag(string)	fprintf(stderr, "\t%s\n", string)
    102 #define DATE_FMT	"%a %b %e %H:%M:%S %Y\n"
    103 #define DATE_FMT1	" %H:%M:%S"
    104 #define CBEMPTY   	(ctab[i].ct_sess == 0)
    105 #define UBEMPTY   	(ub[i].ut_pc == 0 && ub[i].ut_cpu[0] == 0 && \
    106 ub[i].ut_cpu[1] == 0 && ub[i].ut_kcore[0] ==0 && ub[i].ut_kcore[1] == 0)
    107 
    108 
    109 #define EQN(s1, s2)	(strncmp(s1, s2, sizeof(s1)) == 0)
    110 #define CPYN(s1, s2)	(void) strncpy(s1, s2 ? s2 : "", sizeof(s1))
    111 
    112 #define SECSINDAY	86400L
    113 #define SECS(tics)	((double) tics)/HZ
    114 #define MINS(secs)	((double) secs)/60
    115 #define MINT(tics)	((double) tics)/(60*HZ)
    116 
    117 #include <unistd.h>
    118 #if UTS
    119 #define KCORE(clicks)   ((double) BSIZE * (clicks/1024.0))
    120 #else
    121 #define KCORE(clicks)   ((double) (sysconf(_SC_PAGESIZE) >> 10) *clicks)
    122 #endif
    123 
    124 /*
    125  *	total accounting (for acct period), also for day
    126  */
    127 
    128 struct	tacct	{
    129 	uid_t		ta_uid;		/* userid */
    130 	char		ta_name[NSZ];	/* login name */
    131 	float		ta_cpu[2];	/* cum. cpu time, p/np (mins) */
    132 	float		ta_kcore[2];	/* cum kcore-minutes, p/np */
    133 	float		ta_con[2];	/* cum. connect time, p/np, mins */
    134 	float		ta_du;		/* cum. disk usage */
    135 	long		ta_pc;		/* count of processes */
    136 	unsigned short	ta_sc;		/* count of login sessions */
    137 	unsigned short	ta_dc;		/* count of disk samples */
    138 	unsigned short	ta_fee;		/* fee for special services */
    139 };
    140 
    141 
    142 /*
    143  *	connect time record
    144  */
    145 struct ctmp {
    146 	dev_t	ct_tty;			/* major minor */
    147 	uid_t	ct_uid;			/* userid */
    148 	char	ct_name[NSZ];		/* login name */
    149 	long	ct_con[2];		/* connect time (p/np) secs */
    150 	time_t	ct_start;		/* session start time */
    151 };
    152 
    153 /*
    154  *	per process temporary data
    155  */
    156 struct ptmp {
    157 	uid_t	pt_uid;			/* userid */
    158 	char	pt_name[NSZ];		/* login name */
    159 	ulong_t	pt_cpu[2];		/* CPU (sys+usr) P/NP time tics */
    160 	unsigned pt_mem;		/* avg. memory size (64byte clicks) */
    161 };
    162