atsar-1.7/0000755000175000017500000000000010073242162013324 5ustar mstonemstone00000000000000atsar-1.7/Makefile0000644000175000017500000000260010073242162014762 0ustar mstonemstone00000000000000# # Makefile for gathering and handling of kernel statistics under LINUX, # similar to the tool "sar" on other UNIX-implementations. # # Ports of atsar for other UNIX-versions are available on request. # # CFLAGS=-I../include -DWEBSUPPORT -Wall all: cc -c version.c cd atsadc; make "CFLAGS=$(CFLAGS)" cd atsar; make "CFLAGS=$(CFLAGS)" clean: rm *.o cd atsar; make clean cd atsadc; make clean install: if [ ! -d /var/log/atsar ]; then mkdir /var/log/atsar; fi if [ ! -d /usr/local/man/man1 ]; then mkdir -p /usr/local/man/man1; fi cp man/* /usr/local/man/man1 cp atsar/atsar /usr/local/bin chmod 755 /usr/local/bin/atsar cp atsadc/atsadc /usr/local/bin chmod 755 /usr/local/bin/atsadc cp scripts/atsa1 /usr/local/bin chmod 755 /usr/local/bin/atsa1 cp scripts/atsaftp /usr/local/bin chmod 755 /usr/local/bin/atsaftp cp scripts/atsahttp /usr/local/bin chmod 755 /usr/local/bin/atsahttp cp atsar_linux.init /etc/rc.d/init.d/atsar chmod 755 /etc/rc.d/init.d/atsar cp atsar_linux.cron /etc/cron.d/atsar cp atsar_linux.conf /etc/atsar.conf if [ -f /var/log/atsar/ftpstat ]; then rm /var/log/atsar/ftpstat; fi if [ -f /var/log/atsar/httpstat ]; then rm /var/log/atsar/httpstat; fi if [ -f /var/log/atsar/atsa`date +%d` ]; then rm /var/log/atsar/atsa`date +%d`; fi /usr/local/bin/atsa1 atsar-1.7/version.c0000644000175000017500000000017010073242162015153 0ustar mstonemstone00000000000000/* No manual changes in this file */ static char rcsid[] = "$Id: version.c,v 1.7 2002/09/03 12:09:21 root Exp root $"; atsar-1.7/atsar_linux.init0000644000175000017500000000204410073242162016542 0ustar mstonemstone00000000000000#!/bin/sh # # atsar This shell script takes care of initializing # the atsar system activity report subsystem. # # chkconfig: 2345 85 15 # description: Atsar is a system activity report logging system. # # Source function library. if [ -f /etc/rc.d/init.d/functions ] then . /etc/rc.d/init.d/functions else alias daemon=nice fi # Check binaries and configuration files. [ -f /usr/local/bin/atsadc ] || exit 0 RETVAL=0 # See how we were called. case "$1" in start) # Run atsadc. echo -n "Initializing atsar logging: " daemon /usr/local/bin/atsadc /var/log/atsar/atsa`date +%d` RETVAL=$? rm -f /var/log/atsar/ftpstat 2> /dev/null rm -f /var/log/atsar/httpstat 2> /dev/null if [ -f /etc/atsar.conf ] then /usr/local/bin/atsaftp /usr/local/bin/atsahttp fi echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/atsar ;; stop) rm -f /var/lock/subsys/atsar ;; status) ;; reload) $0 stop $0 start ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|status|reload|restart}" exit 1 esac exit $RETVAL atsar-1.7/atsar_linux.cron0000644000175000017500000000023410073242162016537 0ustar mstonemstone000000000000000 * * * 0-6 root [ -f /var/lock/subsys/atsar ] && /usr/local/bin/atsa1 20,40 8-17 * * 1-5 root [ -f /var/lock/subsys/atsar ] && /usr/local/bin/atsa1 atsar-1.7/atsar_linux.conf0000644000175000017500000000155010073242162016525 0ustar mstonemstone00000000000000# Configuration-file for atsar # # This file describes which logfiles have to be processed for FTP (xfer-log) # and HTTP (access-log) on this system. # # In every line you specify three columns: # - type FTP or HTTP # - full path-name of xfer- or access-logfile # - symbolic name for this logfile (appears in atsar-output) # # IMPORTANT: # If you have added or removed lines in this file and you want these # modifications to be effectuated, you have to remove # - file /var/log/atsar/ftpstat (only if you modified FTP-lines), # - file /var/log/atsar/httpstat (only if you modified HTTP-lines), # - current atsar-logfile /var/log/atsar/atsaxx (xx is the current # day-number). # FTP /var/log/xferlog generic_log HTTP /var/log/httpd/access_log generic_access HTTP /usr/local/apache/logs/access_log generic_access atsar-1.7/README0000644000175000017500000001112010073242162014177 0ustar mstonemstone00000000000000Atsar can be used to measure the load on the most relevant system-resources, such as CPU, disk, memory and network. Long-term analysis can be done via cron, by maintaining log-files with statistical information. Short-term analysis can be done by starting the command atsar with an interval and a number of samples. +++++++++++++++++++++++++++++++++++++++++++++++++ Version 1.4 Initial LINUX-port Tested for Intel-based systems only. Version 1.5 Delivered as RPM. Bug fixes. Code cleanup. Performance optimizations. Consistent usage of /proc instead of kernel-structures from /dev/kmem. - less critical in case of different kernel-versions - no root-permission (setuid on atsadc) any more to access /dev/kmem Additional counters printed for TCP and network-interfaces. New counters gathered/printed for NFS/RPC and sockets. Ported & tested on Alpha-based systems. Improved man-pages (description of all output-columns). Features to register number of FTP- and HTTP-transfers (optional). Version 1.6 Kernel 2.4 counters supported. Some minor bug fixes. Easier post-processing of atsar-output by other tools (awk/perl/...) for further processing or for graphical representation - disable buffering on stdout - new flag -S to produce a time-stamp before every output-line Modified parsing for output of /proc/partitions as introduced with kernel 2.4 and with sard-0.5 (patches of Stephen Tweedie - see remark at end of this file). Increased number of FTP- and HTTP-transfers and introduction of configuration-file /etc/atsar.conf for xfer- and access-logfiles. Load-averages and current runq-size added to CPU-statistics: %usr %sys %nice %idle pswch/s runq nrproc lavg1 lavg5 avg15 _cpu_ IPv6 statistics added: inrecv/s outreq/s inmc/s outmc/s indeliv/s reasmok/s fragcre/s _ip6_ in: dsc/s hder/s ader/s unkp/s ratim/s rfail/s ot: dsc/s nort/s _ip6_ socknow sockmax _tcp6_ indgram/s otdgram/s inerr/s noport/s socknow sockmax _udp6_ intot/s outtot/s inerr/s innsol/s innadv/s otnsol/s otnadv/s _icmp6_ iecho/s ierep/s oerep/s idu/s odu/s ird/s ord/s ite/s ote/s _icmp6_ Enhanced NFS server statistics added: rchit/s rcmiss/s %hit fhstal/s iord/s iowr/s racach thr tlast/s TTY (serial line) statistics added: port xmit/s recv/s frer/s parer/s ovrun/s brk/s Note that some existing counters in version 1.5 are represented in a different way in version 1.6, so this may require modifications in programs which do post-processing on the output of atsar. Apart from the additional colums in the output of the CPU-stats (load-averages, etc as mentioned above), the representation of the disk-stats has changed: 1.5: device rdwr/s read/s rsect/s write/s wsect/s 1.6: device read/s rdKb/s write/s wrKb/s rdwr/s The order of the columns has changed and the transfer-rate is in Kbytes i.s.o. sectors. Furthermore the device-name has changed from e.g. "disk00" to "disk000-001" (kernel 2.4: major-minor number). Also the representation of the partition-stats is changed: 1.5: partition busy read/s rdK/s write/s wrK/s avque avserv 1.6: partition busy read/s Kbyt/r write/s Kbyt/w avque avserv The average number of Kbytes (for read and write) is not per second any more, because that would give the same info again as the disk-stats. In version 1.6 the average number of Kbytes per read or write is shown. Furthermore the major-minor number of a partition is added to correlate the partition-stats with the disk-stats (kernel 2.4). Version 1.7 Kernel 2.6 counters supported. Minor bug fixes. +++++++++++++++++++++++++++++++++++++++++++++++++ Quick manual installation (only if the RPM is not used): -------------------------------------------------------- - Run the following commands: make make install - Optional: FTP- and/or HTTP-accounting edit the file /etc/atsar.conf If this type of accounting is not required, empty this configuration-file. The figures shown by atsar for FTP- and HTTP-accounting (flags -F and -H) are only relevant when obtained from the history-files; not for "real-time" figures (atsar started with interval). +++++++++++++++++++++++++++++++++++++++++++++++++ Original versions of atsar can be retrieved from ftp://ftp.ATComputing.nl/pub/tools/linux Gerlof Langeveld (gerlof@ATComputing.nl) AT Computing Nijmegen The Netherlands atsar-1.7/include/0000755000175000017500000000000010073242162014747 5ustar mstonemstone00000000000000atsar-1.7/include/atsar.h0000644000175000017500000000467110073242162016242 0ustar mstonemstone00000000000000/* ** General include-file for atsar ** ** Author: Gerlof Langeveld - AT Computing, Nijmegen, Holland ** E-mail: gerlof@ATComputing.nl ** Date: Januar 1995 ** LINUX-port: Februar 1999 ** ** This program is free software; you can redistribute it and/or modify it ** under the terms of the GNU General Public License as published by the ** Free Software Foundation; either version 2, or (at your option) any ** later version. ** ** This program is distributed in the hope that it will be useful, but ** WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details. */ #define ATMAGIC 0xfeedbabe #define ATOUTF "/var/log/atsar/atsa%02d" #define ATEXEC "/usr/local/bin/atsadc" #define MAXNET 32 /* must be power of 2 !! */ /* ** statistics definition structures */ struct countdef { /* defines the kernel counters needed */ char *kname; /* name of counterset */ unsigned short ksize; /* size of counterset */ unsigned short kinst; /* number of instances */ }; struct fetchdef { struct countdef cdef; void (*initcnt)(); /* optional countdef initialisation */ void (*getcnt)(); /* mandatory counter fetch-function */ }; struct funcdef { /* defines the counter sets being printed */ char active; /* activation of this option */ char flag; /* flag on command line */ void (*prihead)(); /* print header of list */ int (*priline)(); /* print counters per line (excl. time) */ char *about; /* statistics about what */ }; /* ** header of statistics file */ struct filehdr { long magic; /* magic number to verify */ int hdrsize; /* size of filehdr itself */ int oncecnt; /* number of vars only read once */ int oncenames; /* size of varnames read once */ int oncevars; /* size of varcounters read once */ int sampcnt; /* number of vars read each sample */ int sampnames; /* size of varnames for sample */ int sampvars; /* size of first stats counters */ int hertz; /* # clock ticks per second */ int numcpu; /* # processors on measured system */ struct utsname utsinfo; /* general info of measured system */ }; /* ** header for a set of counters per sample */ struct samphdr { time_t curtim; /* current date/time */ clock_t curlbolt; /* current ticks since boot */ int cntsize; /* size of counters which follow */ }; atsar-1.7/include/includes.h0000644000175000017500000000076610073242162016737 0ustar mstonemstone00000000000000/* ** This file describes all required include-files for both ** the atsadc- and the atsar-program. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "linuxstat.h" #include "atsar.h" atsar-1.7/include/linuxstat.h0000644000175000017500000001775610073242162017173 0ustar mstonemstone00000000000000/* ** In this include-file specific structs are defined which are filled ** by sscanf-ing the ascii-values produced by reading several /proc-files. */ typedef long long count_t; /* ** Obtained from /usr/src/linux/include/net/snmp.h */ struct ip_mib { count_t IpForwarding; count_t IpDefaultTTL; count_t IpInReceives; count_t IpInHdrErrors; count_t IpInAddrErrors; count_t IpForwDatagrams; count_t IpInUnknownProtos; count_t IpInDiscards; count_t IpInDelivers; count_t IpOutRequests; count_t IpOutDiscards; count_t IpOutNoRoutes; count_t IpReasmTimeout; count_t IpReasmReqds; count_t IpReasmOKs; count_t IpReasmFails; count_t IpFragOKs; count_t IpFragFails; count_t IpFragCreates; }; struct ipv6_mib { count_t Ip6InReceives; count_t Ip6InHdrErrors; count_t Ip6InTooBigErrors; count_t Ip6InNoRoutes; count_t Ip6InAddrErrors; count_t Ip6InUnknownProtos; count_t Ip6InTruncatedPkts; count_t Ip6InDiscards; count_t Ip6InDelivers; count_t Ip6OutForwDatagrams; count_t Ip6OutRequests; count_t Ip6OutDiscards; count_t Ip6OutNoRoutes; count_t Ip6ReasmTimeout; count_t Ip6ReasmReqds; count_t Ip6ReasmOKs; count_t Ip6ReasmFails; count_t Ip6FragOKs; count_t Ip6FragFails; count_t Ip6FragCreates; count_t Ip6InMcastPkts; count_t Ip6OutMcastPkts; }; struct icmp_mib { count_t IcmpInMsgs; count_t IcmpInErrors; count_t IcmpInDestUnreachs; count_t IcmpInTimeExcds; count_t IcmpInParmProbs; count_t IcmpInSrcQuenchs; count_t IcmpInRedirects; count_t IcmpInEchos; count_t IcmpInEchoReps; count_t IcmpInTimestamps; count_t IcmpInTimestampReps; count_t IcmpInAddrMasks; count_t IcmpInAddrMaskReps; count_t IcmpOutMsgs; count_t IcmpOutErrors; count_t IcmpOutDestUnreachs; count_t IcmpOutTimeExcds; count_t IcmpOutParmProbs; count_t IcmpOutSrcQuenchs; count_t IcmpOutRedirects; count_t IcmpOutEchos; count_t IcmpOutEchoReps; count_t IcmpOutTimestamps; count_t IcmpOutTimestampReps; count_t IcmpOutAddrMasks; count_t IcmpOutAddrMaskReps; }; struct icmpv6_mib { count_t Icmp6InMsgs; count_t Icmp6InErrors; count_t Icmp6InDestUnreachs; count_t Icmp6InPktTooBigs; count_t Icmp6InTimeExcds; count_t Icmp6InParmProblems; count_t Icmp6InEchos; count_t Icmp6InEchoReplies; count_t Icmp6InGroupMembQueries; count_t Icmp6InGroupMembResponses; count_t Icmp6InGroupMembReductions; count_t Icmp6InRouterSolicits; count_t Icmp6InRouterAdvertisements; count_t Icmp6InNeighborSolicits; count_t Icmp6InNeighborAdvertisements; count_t Icmp6InRedirects; count_t Icmp6OutMsgs; count_t Icmp6OutDestUnreachs; count_t Icmp6OutPktTooBigs; count_t Icmp6OutTimeExcds; count_t Icmp6OutParmProblems; count_t Icmp6OutEchoReplies; count_t Icmp6OutRouterSolicits; count_t Icmp6OutNeighborSolicits; count_t Icmp6OutNeighborAdvertisements; count_t Icmp6OutRedirects; count_t Icmp6OutGroupMembResponses; count_t Icmp6OutGroupMembReductions; }; struct tcp_mib { count_t TcpRtoAlgorithm; count_t TcpRtoMin; count_t TcpRtoMax; count_t TcpMaxConn; count_t TcpActiveOpens; count_t TcpPassiveOpens; count_t TcpAttemptFails; count_t TcpEstabResets; count_t TcpCurrEstab; count_t TcpInSegs; count_t TcpOutSegs; count_t TcpRetransSegs; count_t TcpInErrs; count_t TcpOutRsts; }; struct udp_mib { count_t UdpInDatagrams; count_t UdpNoPorts; count_t UdpInErrors; count_t UdpOutDatagrams; }; struct linux_mib { count_t SyncookiesSent; count_t SyncookiesRecv; count_t SyncookiesFailed; count_t EmbryonicRsts; count_t PruneCalled; count_t RcvPruned; count_t OfoPruned; count_t OutOfWindowIcmps; count_t LockDroppedIcmps; }; /* ** Kernel-version info */ struct osrel { int rel; int vers; int sub; }; /* ** integer values taken from the output of the file ** /proc/net/snmp and /proc/net/snmp6 */ struct netstat { struct ip_mib ip; struct icmp_mib icmp; struct tcp_mib tcp; struct udp_mib udp; struct ipv6_mib ip6; struct icmpv6_mib icmp6; struct udp_mib udp6; }; /* ** proprietary struct for NFS-counters */ struct nfsstat { count_t cl_netcnt; count_t cl_netudpcnt; count_t cl_nettcpcnt; count_t cl_nettcpconn; count_t cl_rpccnt; count_t cl_rpcretrans; count_t cl_rpcauthrefresh; count_t cl_proc2[20]; count_t cl_proc3[20]; count_t sv_netcnt; count_t sv_netudpcnt; count_t sv_nettcpcnt; count_t sv_nettcpconn; count_t sv_rpccnt; count_t sv_rpcbadtot; count_t sv_rpcbadfmt; count_t sv_rpcbadauth; count_t sv_rpcbadclnt; count_t sv_proc2[20]; count_t sv_proc3[20]; count_t sv_rchits; count_t sv_rcmisses; count_t sv_rcnocache; count_t sv_fhstale; count_t sv_fhlookup; count_t sv_fhanon; count_t sv_fhnocachedir; count_t sv_fhnocachenondir; count_t sv_ioread; count_t sv_iowrite; count_t sv_thcount; count_t sv_thlastcnt; count_t sv_rasize; }; /* ** proprietary struct for ftp- and http-counters */ #define MAXLOGNAME 32 struct ftpstat { double ocumxfer; double ocumseconds; double ocumkbytes; double icumxfer; double icumseconds; double icumkbytes; char logname[MAXLOGNAME]; }; struct httpstat { double cumhead; double cumgets; double cumputs; double cumpost; double cumdels; char logname[MAXLOGNAME]; }; /* ** integer values taken from the output of the /proc/net/dev file */ #define MAXIFNAME 16 struct ifstat { char name[MAXIFNAME]; count_t rbyte; count_t rpack; count_t rerrs; count_t rdrop; count_t rfifo; count_t rframe; count_t rcompr; count_t rmultic; count_t sbyte; count_t spack; count_t serrs; count_t sdrop; count_t sfifo; count_t scollis; count_t scarrier; count_t scompr; }; /* ** kernel-table occupation */ struct tabstat { count_t totforks; count_t curlocks; count_t maxlocks; count_t maxdquot; count_t curdquot; count_t maxfiles; count_t curfiles; count_t maxinode; count_t curinode; count_t maxsuper; count_t cursuper; }; /* ** integer values taken from the output of the /proc/meminfo file */ struct memstat { count_t memtot; count_t memfree; count_t membuf; count_t memcache; count_t memslab; count_t swptot; count_t swpfree; }; /* ** Per-partition statistics */ #define MAXDKNAME 16 struct dkstat { unsigned short major; unsigned short minor; char name[MAXDKNAME]; count_t totsize; count_t readblocks; count_t readmerges; count_t readsectors; count_t read_msecs; count_t writblocks; count_t writmerges; count_t writsectors; count_t writ_msecs; count_t reqpending; count_t rdwr_msecs; count_t avq; }; /* ** Serial interface statistics */ struct serialstat { count_t port; count_t tx; /* transmits */ count_t rx; /* receives */ count_t fe; /* frame errors */ count_t pe; /* parity errors */ count_t br; /* breaks */ count_t oe; /* overrun errors */ }; /* ** Private structure to store all general system-related counters ** in a uniform version-independent way */ #define MAXCPU 32 #define MAXIRQ 64 #define MAXDISK 64 struct genstat { /* CPU-related stuff */ count_t cpu_user; count_t cpu_nice; count_t cpu_system; count_t cpu_idle; count_t cpu_wait; count_t cpu_irq; count_t cpu_sirq; count_t per_cpu_user[MAXCPU]; count_t per_cpu_nice[MAXCPU]; count_t per_cpu_system[MAXCPU]; count_t per_cpu_idle[MAXCPU]; count_t per_cpu_wait[MAXCPU]; count_t per_cpu_irq[MAXCPU]; count_t per_cpu_sirq[MAXCPU]; count_t irqs[MAXIRQ]; count_t per_irqs[MAXCPU][MAXIRQ]; count_t context_swtch; float loadavg1; float loadavg5; float loadavg15; count_t nrrun; count_t nrproc; /* disk-related stuff */ count_t dk_drive_maj[MAXDISK+1]; count_t dk_drive_min[MAXDISK+1]; count_t dk_drive_tot[MAXDISK+1]; count_t dk_drive_rio[MAXDISK+1]; count_t dk_drive_wio[MAXDISK+1]; count_t dk_drive_rblk[MAXDISK+1]; count_t dk_drive_wblk[MAXDISK+1]; /* memory-related stuff */ count_t pgpgin; count_t pgpgout; count_t pswpin; count_t pswpout; }; /* ** Structure to store socket-usage figures */ struct sockstat { count_t tcpnow; count_t tcpmax; count_t udpnow; count_t udpmax; count_t tcp6now; count_t tcp6max; count_t udp6now; count_t udp6max; }; atsar-1.7/man/0000755000175000017500000000000010073242162014077 5ustar mstonemstone00000000000000atsar-1.7/man/atsadc.10000644000175000017500000000577110073242162015432 0ustar mstonemstone00000000000000.TH ATSADC 1 "July 2004" "AT Computing" "\f(HBlocal\fP" .SH NAME .B atsadc, atsa1, atsaftp, atsahttp \(em counter-collection .SH SYNOPSIS .B atsadc [ .I t .I n ] [ .I ofile ] .PP .B atsa1 [ .I t .I n ] .PP .B atsaftp .PP .B atsahttp .SH DESCRIPTION System activity-data can be gathered on special request of a user [see .B atsar(1) ] or automatically, on a routine basis, as described here. Usually the kernel maintains statistical counters that are incremented as various system actions occur. These include counters for CPU utilization, disk utilization, memory utilization and various network statistics. .PP The program .B atsadc and the shell-script .B atsa1 are used to collect, save, and process these counters. .PP The program .B atsadc (the data collector) samples system data .I n times with an interval of .I t seconds between samples, and writes in binary format to .I ofile or (default) to standard output. The sampling interval .I t should be greater than 1 second. If .I t and .I n are omitted, a special reset-record is written. This facility is used when booting to a multi-user state, to mark the time at which the counters restart from zero. For example, the reset-mark can be added to the daily data by the command: .PP .B /usr/local/bin/atsadc /var/log/atsar/atsa`date +%d` .PP Note that this entry is written to the .B /etc/rc.d/init.d/atsar file. .PP The shell-script .B atsa1 is used to collect and store data in the binary file .BI /var/log/atsar/atsa dd where .I dd is the current day of the month. The arguments .I t and .I n cause records to be written .I n times at an interval of .I t seconds, or once if omitted. Furthermore this script takes care that log-files older than a week are removed once a day. .PP A file containing following entries should be added to the .B /etc/cron.d directory to produce records every 20 minutes during working hours and hourly otherwise: .PP .B 0 \ \ \ \ * \ \ \ * * 0-6 root /usr/local/bin/atsa1 .B 20,40 8-17 * * 1-5 root /usr/local/bin/atsa1 .PP See .B crontab(1) for details. .PP The shell-script .B atsaftp counts the new transfers registered in the FTP-logfile(s) since the previous time this script was activated; the new counters are stored in the .B /var/log/atsar/ftpstat file in ASCII-format. The names of the FTP-logfiles to be watched are specified in the .B /etc/atsar.conf configuration-file. .PP The shell-script .B atsahttp counts the new transfers registered in the HTTP-logfile(s) since the previous time this script was activated; the new counters are stored in the .B /var/log/atsar/httpstat file in ASCII-format. The names of the HTTP-logfiles to be watched are specified in the .B /etc/atsar.conf configuration-file. .PP Both scripts must be activated just before the program .B atsadc is started, which also collects these counters. .SH FILES .BI /var/log/atsar/atsa dd .PP Daily data file, where .I dd are digits representing the day of the month. .SH SEE ALSO .B atsar(1), crontab(1) .SH AUTHOR Gerlof Langeveld, AT Computing (gerlof@ATComputing.nl) atsar-1.7/man/atsar.10000644000175000017500000007670710073242162015314 0ustar mstonemstone00000000000000.TH ATSAR 1 "July 2004" "AT Computing" "\f(HBlocal\fP" .SH NAME .B atsar \(em system activity report .SH SYNOPSIS .B atsar [ .B -flags ] .I t [ .I n ] .PP .B atsar [ .B -flags ] [ .BI -s \ time ] [ .BI -e \ time ] [ .BI -i \ sec ] [ .BI -f \ file | .BI -n \ day# ] .SH DESCRIPTION The program .B atsar(1) can be used to deliver statistics. The design of this program can be compared with the standard .B sadc(1) and .B sar(1) programs being delivered for other UNIX-implementations, i.e. a data-collector which reads the statistical counters (from the files under the directory .B /proc ) and a presentation-program which formats the counters and presents them on stdout. .PP In the first synopsis line, .B atsar samples cumulative activity counters in the kernel at .I n intervals of .I t seconds, where .I t should be 1 or greater. The default value of .I n is 1. .PP The type of command shown in the first synopsis line immediately sends the output for every option specified to standard output. If only one type of statistical counter is requested, the header is printed once and after every .I t seconds the statistical counters are shown for that period. If several options are requested, a header is printed per sample followed by the statistical counters for that period. .PP In the second synopsis line (no sampling interval specified), .B atsar extracts data from a previously recorded file, either the one specified by the .B -f option or, by default, the daily activity data file .BI /var/log/atsar/atsa dd for the current day .I dd (day of month). Alternatively the .B -n option can be used to specify the day of the month from which counters should be shown. .PP The starting and ending times of the report can be defined using the .B -s and .B -e time arguments of the form hh:mm. The .B -i option selects records at .I sec second intervals. Otherwise, all intervals found in the data file are reported. .PP The .B -flags option is used to define which statistical counters are presented: .PP .TP 5 .B -S By default the time-stamp at the beginning of a line is suppressed if more lines are shown for one time-interval. With this flag a time-stamp is given for every output-line (easier for post-processing). .PP .TP 5 .B -A Statistics of all possible options. .PP .TP 5 .B -u Statistics about CPU utilization (average and per cpu). .PP .TP 5 .B -P Statistics about processes and load-averages. .PP .TP 5 .B -d Limited statistics about utilization of disks (2.4 kernel only). .PP .TP 5 .B -D Statistics about utilization of disks and disk-partitions. .PP .TP 5 .B -r Current memory- and swap-occupation. .PP .TP 5 .B -p Statistics about paging- and swapping-activity. .PP .TP 5 .B -I Statistics about the number interrupts per second. .PP .TP 5 .B -v Statistics about utilization of kernel-tables. .PP .TP 5 .B -y Statistics about utilization of tty's (serial interfaces). .PP .TP 5 .B -l Statistics about the network interfaces. .PP .TP 5 .B -L Statistics about errors for network-interfaces. .PP .TP 5 .B -w Statistics about IP (version 4) network traffic). .PP .TP 5 .B -W Statistics about errors for IP (version 4) traffic. .PP .TP 5 .B -m General statistics about ICMP (version 4) layer activity. .PP .TP 5 .B -M Per-type statistics about ICMP (version 4) layer activity. .PP .TP 5 .B -t Statistics about TCP network traffic. .PP .TP 5 .B -T Statistics about errors for TCP-traffic. .PP .TP 5 .B -U Statistics about UDP (version 4) network traffic. .PP .TP 5 .B -g Statistics about IP (version 6) network traffic). .PP .TP 5 .B -G Statistics about errors for IP (version 6) traffic. .PP .TP 5 .B -k General statistics about ICMP (version 6) layer activity. .PP .TP 5 .B -K Per-type statistics about ICMP (version 6) layer activity. .PP .TP 5 .B -j Statistics about TCP (version 6) socket-utilization. .PP .TP 5 .B -h Statistics about UDP (version 6) network traffic. .PP .TP 5 .B -N Statistics about NFS server- and client-requests. .PP .TP 5 .B -E Statistics about errors for NFS server- and client-requests. .PP .TP 5 .B -V Statistics about behaviour of NFS-server. .PP .TP 5 .B -R Statistics about the RPC-calls for NFS-requests. A transfer-rate is given per type of RPC-request (percentage of total number of RPC-requests). .PP .TP 5 .B -F Optional statistics about the ftp-traffic. This flag only produces relevant output if the script .B atsaftp is activated with regular intervals (by the script .B atsa1 ). Note that the names of the FTP-logfiles have to be specified in the .B /etc/atsar.conf configuration-file. .PP .TP 5 .B -H Optional statistics about the http-traffic. This flag only produces relevant output if the script .B atsahttp is activated with regular intervals (by the script .B atsa1 ). Note that the names of the HTTP-logfiles have to be specified in the .B /etc/atsar.conf configuration-file. .SH OUTPUT DESCRIPTION Depending on the flag, a number of columns with output-values are produced. The values are mostly presented as a number of events per second. .PP The output for the flag .B -u contains the following columns per cpu: .TP 10 .B usr% Percentage of cpu-time consumed in user-mode (program-text) for all active processes running with a nice-value of zero (default) or a negative nice-value (which means a higher priority than usual). The cpu-consumption in user-mode of processes with a nice-value larger than zero (lower priority) is indicated in the nice%-column. .TP 10 .B nice% Percentage of cpu-time consumed in user-mode (i.e. program-text) for all processes running witn a nice-value larger than zero (which means with a lower priority than average). .TP 10 .B sys% Percentage of cpu-time consumed in system-mode (kernel-text) for all active processes. A high percentage usually indicates a lot of system calls being issued. Kernel-version 2.4: .br Interrupt-handling is also part of this percentage. .TP 10 .B irq% Percentage of cpu-time consumed for interrupt-handling (not for kernel-version 2.4). .TP 10 .B softirq% Percentage of cpu-time consumed for soft interrupt-handling (not for kernel-version 2.4). .TP 10 .B idle% Percentage of unused cpu-time because all processes are in a wait-state (>= kernel-version 2.6: but not waiting for disk-I/O). .TP 10 .B wait% Percentage of unused cpu-time. At least one of the processes in wait-state awaits completion of disk-I/O (not for kernel-version 2.4). .PP The output for the flag .B -P contains the following values: .TP 10 .B pswtch/s Number of process-switches (also called context-switches) per second on all cpu's. A process-switch occurs at the moment that the active process (i.e. the process using a cpu) enters a wait-state or has used its time-slice completely; another process will then be chosen to use the cpu. .TP 10 .B runq Number of processes which are currently waiting for CPU-scheduling (including the processes which are currently active on a CPU). .TP 10 .B nrproc Total number of processes which are currently present in the system. .TP 10 .B lavg1 Load-average reflecting the average number of processes in the run-queue during the last minute. .TP 10 .B lavg5 Load-average reflecting the average number of processes in the run-queue during the last 5 minutes. .TP 10 .B lavg15 Load-average reflecting the average number of processes in the run-queue during the last 15 minutes. .PP The output for the flag .B -d contains the following columns per active physical disk: .TP 10 .B device Disk-drive number (major-minor). .TP 10 .B read/s Number of read-requests issued per second on this disk. .TP 10 .B rdKb/s Number of Kbytes tranferred per second by read-requests. .TP 10 .B write/s Number of write-requests issued per second on this disk. .TP 10 .B wrKb/s Number of Kbytes tranferred per second by write-requests. .TP 10 .B rdwr/s Number of read/write requests issued per second on this disk (total of read/s + write/s) .PP The output for the flag .B -D contains the following columns per used partition of a physical disk: .TP 10 .B partition Disk (-partition) name. For the entire disk, the major-minor number is shown between brackets. .TP 10 .B busy Busy-percentage of the physical disk (i.e. the portion of time that the device was busy handling requests). This figure is only shown for partitions which represent the entire physical disk. .TP 10 .B read/s Number of read-requests issued per second on this partition. For partitions which represent the entire physical disk, the total number of read-requests per second for all partitions on that disk is shown. .TP 10 .B Kbyt/r Average number of Kbytes transferred per read-request for this partition. For partitions which represent the entire physical disk, the average number of Kbytes per read-request for all partitions on that disk is shown. .TP 10 .B write/s Number of write-requests issued per second on this partition. For partitions which represent the entire physical disk, the total number of write-requests per second for all partitions on that disk is shown. .TP 10 .B Kbyt/w Average number of Kbytes transferred per write-request for this partition. For partitions which represent the entire physical disk, the average number of Kbytes per write-request for all partitions on that disk is shown. .TP 10 .B avque Average number of disk-requests outstanding in the queue during the time that the disk is busy. This figure is only shown for partitions which represent the entire physical disk. .TP 10 .B avserv Average number of milliseconds needed by a request on this physical disk (seek, latency and data-transfer). This figure is only shown for partitions which represent the entire physical disk. .PP The output for the flag .B -r contains information about the memory- and swap-utilization: .TP 10 .B memtot Total usable main memory size (snapshot). .TP 10 .B memfree Available main memory size (snapshot). .TP 10 .B buffers Main memory used for cached metadata-blocks (snapshot). .TP 10 .B cached Main memory used for cache data-blocks (snapshot). .TP 10 .B slabmem Main memory used for dynamically allocated memory by the kernel (snapshot). .TP 10 .B swptot Total swap space size (snapshot). .TP 10 .B swpfree Available swap space size (snapshot). .PP The output for the flag .B -p contains information about the frequency of paging and swapping: .TP 10 .B pagein/s The number of memory-pages the system paged in from disk per second. This implies normal data-access (so not necessarily indicating lack of memory). .TP 10 .B pageout/s The number of memory-pages the system paged out to disk per second. This implies normal data-access (so not necessarily indicating lack of memory). .TP 10 .B swapin/s The number of memory-pages the system read from the swap-device per second. .TP 10 .B swapout/s The number of memory-pages the system wrote to the swap-device per second. .TP 10 .B fork/s The number of new processes started per second. .PP The output for the flag .B -I provides information about interrupt-frequency, reported per irq per cpu. Notice that for the active irq-levels the number of interrupts per second is shown. .TP 10 .B iq.. Number of interrupts per second for this interrupt-type. The file .B /proc/interrupts on the measured system shows which device uses this irq. .PP The output for the flag .B -v provides information about utilization of particular limited kernel-resources: .TP 10 .B superb-sz The current and maximum occupation of the collection of super-blocks which is maintained by the kernel for mounted filesystems. .TP 10 .B inode-sz The current and maximum occupation of the collection of incore-inodes maintained by the kernel. One entry is needed for every disk-file which is currently open (at least once). .TP 10 .B file-sz The current and maximum occupation of the collection of open-file entries maintained by the kernel. One entry is needed for every open-request for a disk-file. So if one file is currently opened by five processes, one incore-inode entry is needed and five open-file entries. .TP 10 .B dquota-sz The current and maximum occupation of the collection of disk-quota entries. .TP 10 .B flock-sz The current and maximum number of file-locks. .PP The output for the flag .B -y provides information about utilization of tty's: .TP 10 .B port The port-number of the concerning serial interface. .TP 10 .B xmit/s The number of transmit-interrupts per second for this tty. .TP 10 .B recv/s The number of receive-interrupts per second for this tty. .TP 10 .B frer/s The number of framing-errors discovered by the uart per second. .TP 10 .B parer/s The number of parity-errors discovered by the uart per second. .TP 10 .B ovrun/s The number of overrun-errors discovered by the uart per second. .TP 10 .B brk/s The number of breaks discovered by the uart per second. .PP The output for the flag .B -l provides information about utilization of network-interfaces: .TP 10 .B inpck/s Number of packets received from this interface per second. .TP 10 .B otpck/s Number of packets transmitted via this interface per second. .TP 10 .B inbyt/s Number of bytes received from this interface per second. .TP 10 .B otbyt/s Number of bytes transmitted via this interface per second. .TP 10 .B incmpr/s Number of compressed packets received per second (slip). .TP 10 .B otcmpr/s Number of compressed packets transmitted per second (slip). .TP 10 .B inmcst/s Number of multicast-packets received from this interface per second. .TP 10 .B iface Name of the interface. .PP The output for the flag .B -L provides information about the failures which were detected for network-interfaces: .TP 10 .B inerr/s Number of bad packets received from this interface per second. .TP 10 .B oterr/s Number of packet-transmit problems encountered via this interface per second. .TP 10 .B coll/s Number of collisions encountered per second while transmitting packets. .TP 10 .B indrop/s Number of received packets dropped per second due to lack of buffer-space in the local system. .TP 10 .B otdrop/s Number of transmitted packets dropped per second due to lack of buffer-space in the local system. .TP 10 .B infram/s Number of frame alignment-errors encountered per second on received packets. .TP 10 .B otcarr/s Number of carrier-errors encountered per second on transmitted packets. .TP 10 .B iface Name of the interface. .PP The output for the flag .B -w provides information about the utilization of the IPv4-layer (formal snmp-names between brackets): .TP 10 .B inrecv/s Number of input datagrams received from interfaces per second, including those received in error (ipInReceives). .TP 10 .B outreq/s Number of IP datagrams per second that local higher-layer protocols supplied to IP in requests for transmission (ipOutRequests). .TP 10 .B indeliver/s Number of input datagrams per second that have been succesfully delivered to higher protocol-layers (ipInDelivers). .TP 10 .B forward/s Number of input datagrams per second for which this entity was not their final IP destination, as a result of which an attempt was made to forward (ipForwDatagrams). .TP 10 .B reasmok/s Number of IP datagrams succesfully reassembled per second (ipReasmOKs). .TP 10 .B fragcreat/s Number of IP datagram fragments generated per second at this entity (ipFragCreates). .PP The output for the flag .B -W provides information about the failures which were detected in the IPv4-layer (formal snmp-names between brackets): .TP 10 .B indsc/s Number of input IP datagrams per second for which no problems were encountered to prevent their continued processing but that were discarded, e.g. for lack of buffer space (ipInDiscards). .TP 10 .B hder/s Number of input datagrams per second discarded due to errors in the IP header (ipInHdrErrors). .TP 10 .B ader/s Number of input datagrams per second discarded because the IP address in the destination field was not valid to be received by this entity (ipInAddrErrors). .TP 10 .B unkp/s Number of inbound packets per second that were discarded because of an unknown or unsupported protocol (ipInUnknownProtos). .TP 10 .B ratim/s Number of timeout-situations per second while other fragments were expected for successful reassembly (ipReasmTimeout). .TP 10 .B rfail/s Number of failures detected per second by the IP reassembly algorithm (ipReasmFails). .TP 10 .B otdsc/s Number of output IP datagrams per second for which no problems were encountered to prevent their continued processing but that were discarded, e.g. for lack of buffer space (ipOutDiscards). .TP 10 .B nort/s Number of IP datagrams per second discarded because no route could be found (ipOutNoRoutes). .PP The output for the flag .B -t provides information about the utilization of the TCP-layer (formal snmp-names between brackets): .TP 10 .B insegs/s Number of received segments per second, including those received in error (tcpInSegs). .TP 10 .B otsegs/s Number of transmitted segments per second, excluding those containing only retransmitted octets (tcpOutSegs). .TP 10 .B actopen/s Number of active opens per second that have been supported by this entity (tcpActiveOpens). .TP 10 .B pasopen/s Number of passive opens per second that have been supported by this entity (tcpPassiveOpens). .TP 10 .B nowopen Number of connections currently open (snapshot), for which the state is either ESTABLISHED or CLOSE-WAIT (tcpCurrEstab). .TP 10 .B socknow Number of TCPv4-sockets currently open (snapshot). .TP 10 .B sockmax Maximum number of parallel TCPv4-sockets ever open. This value is not always supported by the kernel. .PP The output for the flag .B -T provides information about the failures which were detected in the TCP-layer (formal snmp-names between brackets): .TP 10 .B inerr/s Number of received segments per second received in error (tcpInErrs). .TP 10 .B retrans/s Number of retransmitted segments per second (tcpRetransSegs). .TP 10 .B attfail/s Number of failed connection attempts per second that have occurred at this entity (tcpAttemptFails). .TP 10 .B estabreset/s Number of resets per second that have occurred at this entity (tcpEstabResets). .TP 10 .B outreset/s Number of transmitted segments per second containing the RST flag (tcpOutRsts). .PP The output for the flag .B -U provides information about the utilization of the UDPv4-layer (formal snmp-names between brackets): .TP 10 .B indgram/s Number of UDP datagrams per second delivered to UDP users (udpInDatagrams), .TP 10 .B otdgram/s Number of UDP datagrams transmitted per second from this entity (udpOutDatagrams), .TP 10 .B inerr/s Number of received UDP datagrams per second that could not be delivered for reasons other than the lack of an application at the destination port (udpInErrors). .TP 10 .B noport/s Number of received UDP datagrams per second for which there was no application at the destination port (udpNoPorts). .TP 10 .B socknow Number of UDP-sockets currently open (snapshot). .TP 10 .B sockmax Maximum number of parallel UDP-sockets ever open. This value is not always supported by the kernel. .PP The output for the flag .B -m provides information about the general utilization of the ICMPv4-layer and some information per type of ICMP-message (formal snmp-names between brackets): .TP 10 .B intot/s Number of ICMP messages (any type) received per second at this entity (icmpInMsgs). .TP 10 .B outtot/s Number of ICMP messages (any type) transmitted per second from this entity (icmpOutMsgs). .TP 10 .B inecho/s Number of ICMP Echo (request) messages received per second (icmpInEchos). .TP 10 .B inerep/s Number of ICMP Echo-Reply messages received per second (icmpInEchoReps). .TP 10 .B otecho/s Number of ICMP Echo (request) messages transmitted per second (icmpOutEchos). .TP 10 .B oterep/s Number of ICMP Echo-Reply messages transmitted per second (icmpOutEchoReps). .PP The output for the flag .B -M provides information about other types of ICMPv4-messages (formal snmp-names between brackets): .TP 10 .B ierr/s Number of ICMP messages received per second but determined to have ICMP-specific errors (icmpInErrors). .TP 10 .B isq/s Number of ICMP Source Quench messages received per second (icmpInSrcQuenchs). .TP 10 .B ird/s Number of ICMP Redirect messages received per second (icmpInRedirects). .TP 10 .B idu/s Number of ICMP Destination Unreachable messages received per second (icmpInDestUnreachs). .TP 10 .B ite/s Number of ICMP Time Exceeded messages received per second (icmpOutTimeExcds). .TP 10 .B oerr/s Number of ICMP messages transmitted per second but determined to have ICMP-specific errors (icmpOutErrors). .TP 10 .B osq/s Number of ICMP Source Quench messages transmitted per second (icmpOutSrcQuenchs). .TP 10 .B ord/s Number of ICMP Redirect messages transmitted per second (icmpOutRedirects). .TP 10 .B odu/s Number of ICMP Destination Unreachable messages transmitted per second (icmpOutDestUnreachs). .TP 10 .B ote/s Number of ICMP Time Exceeded messages transmitted per second (icmpOutTimeExcds). .PP The output for the flag .B -g provides information about the utilization of the IPv6-layer (formal snmp-names between brackets): .TP 10 .B inrecv/s Number of input IPv6-datagrams received from interfaces per second, including those received in error (ipv6IfStatsInReceives). .TP 10 .B outreq/s Number of IPv6-datagrams per second that local higher-layer protocols supplied to IP in requests for transmission (ipv6IfStatsOutRequests). This counter does not include any forwarded datagrams. .TP 10 .B inmc/s Number of multicast packets per second that have been received by the interface (ipv6IfStatsInMcastPkts). .TP 10 .B outmc/s Number of multicast packets per second that have been transmitted to the interface (ipv6IfStatsOutMcastPkts). .TP 10 .B indeliv/s Number of IP datagrams succesfully delivered per second to IPv6 user-protocols, including ICMP (ipv6IfStatsInDelivers). .TP 10 .B reasmok/s Number of IPv6 datagrams succesfully reassembled per second (ipv6IfStatsReasmOKs). .TP 10 .B fragcre/s Number of IPv6 datagram fragments generated per second at this entity (ipv6IfStatsOutFragCreates). .PP The output for the flag .B -G provides information about the failures which were detected in the IPv4-layer (formal snmp-names between brackets): .TP 10 .B indsc/s Number of input IPv6 datagrams per second for which no problems were encountered to prevent their continued processing but that were discarded, e.g. for lack of buffer space (ipv6IfStatsInDiscards). .TP 10 .B hder/s Number of input datagrams per second discarded due to errors in the IPv6 header (ipv6IfStatsInHdrErrors). .TP 10 .B ader/s Number of input datagrams per second discarded because the IPv6 address in the destination field was not valid to be received by this entity (ipv6IfStatsInAddrErrors). .TP 10 .B unkp/s Number of locally-addressed datagrams per second that were discarded because of an unknown or unsupported protocol (ipv6IfStatsInUnknownProtos). .TP 10 .B ratim/s Number of timeout-situations per second while other IPv6 fragments were expected for successful reassembly. .TP 10 .B rfail/s Number of failures detected per second by the IPv6 reassembly-algorithm (ipv6IfStatsReasmFails). .TP 10 .B otdsc/s Number of output IPv6 datagrams per second for which no problems were encountered to prevent their continued processing but that were discarded, e.g. for lack of buffer space (ipv6IfStatsOutDiscards). .TP 10 .B nort/s Number of IPv6 datagrams per second discarded because no route could be found (ipv6IfStatsInNoRoutes). .PP The output for the flag .B -j provides information about the utilization of the TCPv6-sockets: .TP 10 .B socknow Number of TCPv6-sockets currently open (snapshot). .TP 10 .B sockmax Maximum number of parallel TCPv6-sockets ever open. This value is not always supported by the kernel. .PP The output for the flag .B -h provides information about the utilization of the UDPv6-layer (formal snmp-names between brackets): .TP 10 .B indgram/s Number of UDPv6 datagrams per second delivered to UDP users (udpInDatagrams), .TP 10 .B otdgram/s Number of UDPv6 datagrams transmitted per second from this entity (udpOutDatagrams), .TP 10 .B inerr/s Number of received UDPv6 datagrams per second that could not be delivered for reasons other than the lack of an application at the destination port (udpInErrors). .TP 10 .B noport/s Number of received UDPv6 datagrams per second for which there was no application at the destination port (udpNoPorts). .TP 10 .B socknow Number of UDPv6 sockets currently open (snapshot). .TP 10 .B sockmax Maximum number of parallel UDPv6 sockets ever open. This value is not always supported by the kernel. .PP The output for the flag .B -k provides information about the general utilization of the ICMPv6-layer and some information per type of ICMP-message (formal snmp-names between brackets): .TP 10 .B intot/s Number of ICMPv6 messages (any type) received per second at the interface (ipv6IfIcmpInMsgs). .TP 10 .B outtot/s Number of ICMPv6 messages (any type) transmitted per second from this entity (ipv6IfIcmpOutMsgs). .TP 10 .B inerr/s Number of ICMPv6 messages received per second which had ICMP-specific errors, such as bad ICMP checksums, bad length, etc (ipv6IfIcmpInErrors). .TP 10 .B innsol/s Number of ICMP Neighbor Solicit messages received per second (ipv6IfIcmpInNeighborSolicits). .TP 10 .B innadv/s Number of ICMP Neighbor Advertisement messages received per second (ipv6IfIcmpInNeighborAdvertisements). .TP 10 .B otnsol/s Number of ICMP Neighbor Solicit messages transmitted per second (ipv6IfIcmpOutNeighborSolicits). .TP 10 .B otnadv/s Number of ICMP Neighbor Advertisement messages transmitted per second (ipv6IfIcmpOutNeighborAdvertisements). .PP The output for the flag .B -K provides information about other types of ICMPv6-messages (formal snmp-names between brackets): .TP 10 .B iecho/s Number of ICMP Echo (request) messages received per second (ipv6IfIcmpInEchos). .TP 10 .B ierep/s Number of ICMP Echo-Reply messages received per second (ipv6IfIcmpInEchoReplies). .TP 10 .B oerep/s Number of ICMP Echo-Reply messages transmitted per second (ipv6IfIcmpOutEchoReplies). .TP 10 .B idu/s Number of ICMP Destination Unreachable messages received per second (ipv6IfIcmpInDestUnreachs). .TP 10 .B odu/s Number of ICMP Destination Unreachable messages transmitted per second (ipv6IfIcmpOutDestUnreachs). .TP 10 .B ird/s Number of ICMP Redirect messages received per second (ipv6IfIcmpInRedirects). .TP 10 .B ord/s Number of ICMP Redirect messages transmitted per second (ipv6IfIcmpOutRedirect). .TP 10 .B ite/s Number of ICMP Time Exceeded messages received per second (ipv6IfIcmpInTimeExcds). .TP 10 .B ote/s Number of ICMP Time Exceeded messages transmitted per second (ipv6IfIcmpOutTimeExcds). .PP The output for the flag .B -N provides information about the utilization of the NFS-layer, acting as NFS-client as well as NFS-server: .TP 10 .B svrpc/s Number of RPC-requests handled by this NFS-server system per second. .TP 10 .B clrpc/s Number of RPC-requests issued by this NFS-client system per second. .TP 10 .B sudp/s Number of requests handled via UDP by this NFS-server system per second. .TP 10 .B stcp/s Number of requests handled via TCP by this NFS-server system per second. .TP 10 .B stcon/s Number of TCP-connections established by this NFS-server system per second. .TP 10 .B cudp/s Number of requests issued via UDP by this NFS-client system per second. .TP 10 .B ctcp/s Number of requests issued via TCP by this NFS-client system per second. .TP 10 .B ctcon/s Number of TCP-connections established by this NFS-client system per second. .PP The output for the flag .B -E provides information about the failures which were detected in the NFS-layer: .TP 10 .B svbadfmt/s Number of RPC-requests received per second by the NFS-server system with a bad format (version-number if RPC-packet not recognized). .TP 10 .B svbadauth/s Number of RPC-requests received per second by the NFS-server system with a bad authorization. .TP 10 .B svbadclnt/s Meaning unknown. .TP 10 .B clretrans/s Number of RPC-request which have been retransmitted by the NFS-client per second due to a timeout. .TP 10 .B clauthrefresh/s Number of times that the credentials have been refreshed per second by the NFS-client due to rejection by the NFS-server. .PP The output for the flag .B -V provides information about the behaviour of the NFS-server: .TP 10 .B rchit/s Number of succesful accesses on the reply-cache per second. .TP 10 .B rcmiss/s Number of unsuccesful accesses on the reply-cache per second. .TP 10 .B %hit Hit-ratio for the reply-cache. .TP 10 .B fhstale/s Number of stale-errors per second for file-handles. .TP 10 .B iord/s Number of bytes returned to read-requests per second. This counter is not supported by all NFS-versions (contains zero). .TP 10 .B iowr/s Number of bytes passed in write-requests per second. This counter is not supported by all NFS-versions (contains zero). .TP 10 .B thrnow Number of avaliable threads (nfsd-servers). This counter is not supported by all NFS-versions (contains zero). .TP 10 .B tlast/s Number of times that the last available thread is activated per second. This counter is not supported by all NFS-versions (contains zero). .PP The output for the flag .B -R provides information about the types of RPC-calls used by the NFS-layer (NFS-client as well as NFS-server). Note that per RPC-type the usage-percentage is shown. .TP 10 .B gat Percentage of RPC-call type Get Attribute. .TP 10 .B sat Percentage of RPC-call type Set Attribute. .TP 10 .B lku Percentage of RPC-call type Lookup. .TP 10 .B rln Percentage of RPC-call type Read Link. .TP 10 .B rd Percentage of RPC-call type Read. .TP 10 .B wrc Percentage of RPC-call type Write Cache. .TP 10 .B wr Percentage of RPC-call type Write. .TP 10 .B cre Percentage of RPC-call type Create. .TP 10 .B rm Percentage of RPC-call type Remove. .TP 10 .B rnm Percentage of RPC-call type Rename. .TP 10 .B lnk Percentage of RPC-call type Link. .TP 10 .B sln Percentage of RPC-call type Symbolic Link. .TP 10 .B mkd Percentage of RPC-call type Mkdir. .TP 10 .B rmd Percentage of RPC-call type Rmdir. .TP 10 .B rdd Percentage of RPC-call type Read Directory. .TP 10 .B fst Percentage of RPC-call type Statfs. .PP The output for the flag .B -F provides information about the FTP-traffic. Note that the script .B atsaftp should be installed and called by the script .B atsa1 with regular intervals. The counters are .I not relevant if .B atsar is started with an interval; only when viewing long-term counters from a history-file. .TP 10 .B xfers/s Number of FTP-transfers per second. .TP 10 .B kbytes/s Number of Kbytes transferred per second during the interval. .TP 10 .B avg_time Average number of seconds per ftp-transfer. .TP 10 .B avg_kbytes Average number of Kbytes per ftp-transfer. .TP 10 .B direct Direction indicates whether these files have been transmitted (output) or received (input) via FTP. .TP 10 .B name Symbolic name (as specified in the .B /etc/atsar.conf file) of the xfer-log file from which the usage-info is retrieved. .PP The output for the flag .B -H provides information about Apache HTTP-traffic. Note that the script .B atsahttp should be installed and called by the script .B atsa1 with regular intervals. The counters are .I not relevant if .B atsar is started with an interval; only when viewing long-term counters from a history-file. .TP 10 .B head/s Number of http-requests handled per second (type HEAD). .TP 10 .B get/s Number of http-requests handled per second (type GET). .TP 10 .B put/s Number of http-requests handled per second (type PUT). .TP 10 .B post/s Number of http-requests handled per second (type POST). .TP 10 .B delete/s Number of http-requests handled per second (type DELETE). .TP 10 .B name Symbolic name (as specified in the .B /etc/atsar.conf file) of the access-log file from which the usage-info is retrieved. .SH EXAMPLES To see today's processor-activity so far: .PP .B atsar .PP To watch TCP activity evolve for ten minutes (10 samples with sixty seconds interval): .PP .B atsar -t 60 10 .SH FILES .BI /var/log/atsar/atsa dd .PP Daily data file, where .I dd are digits representing the day of the month. .SH SEE ALSO .B atsadc(1) .SH AUTHOR Gerlof Langeveld, AT Computing (gerlof@ATComputing.nl) atsar-1.7/scripts/0000755000175000017500000000000010073242162015013 5ustar mstonemstone00000000000000atsar-1.7/scripts/atsa10000755000175000017500000000113210073242162015747 0ustar mstonemstone00000000000000#!/bin/sh COMDIR=/usr/local/bin LOGDIR=/var/log/atsar CURDAY=`date +%d` if [ ! -d $LOGDIR ] then echo $0: directory $LOGDIR not present >&2 exit 1 fi if [ -f /etc/atsar.conf ] then $COMDIR/atsaftp # count ftp-requests added since previous call $COMDIR/atsahttp # count http-requests added since previous call fi if [ $# = 0 ] then $COMDIR/atsadc 1 1 $LOGDIR/atsa$CURDAY 2> /dev/null else $COMDIR/atsadc $* $LOGDIR/atsa$CURDAY 2> /dev/null fi # delete files older than one week at midnight if [ `date +%H` -eq 0 ] then find $LOGDIR -name 'atsa*' -mtime +7 -exec rm {} \; fi exit 0 atsar-1.7/scripts/atsaftp0000755000175000017500000002037010073242162016405 0ustar mstonemstone00000000000000#!/bin/bash ############################################################################## # This script can be used to process the xferlog-files which are generated # by the ftpd. In the xferlog, one line is stored per file-transfer. # This script counts the number of transfers, the number of seconds which # are used for that and the number of kilobytes transferred. This information # is stored in the ftpstat-file called /var/log/atsar/ftpstat, # containing one line per xferlog with the following format: # # field 1: output: cumulative_transfers # field 2: output: cumulative_seconds # field 3: output: cumulative_kbytes # field 4: input: cumulative_transfers # field 5: input: cumulative_seconds # field 6: input: cumulative_kbytes # field 7: date of last processed logfile-message # field 8: time of last processed logfile-message # field 9: last processed offset in the xferlog-file # field 10: name of the xferlog-file # field 11: symbolic name (shown in atsar output) # # Every time this script is started, it reads the information from the # ftpstat-file. For every xferlog-file it continues scanning at the point # that it stopped the previous time. At the end of a run, the information # in de ftpstat-file will be updated with the new figures. # # Note that this script should be activated with regular intervals. # Obviously the information in the ftpstat-file is not accurate any more # if between two runs of this script *all* generations of the # xferlog-files have been cyclicly refilled. # # This script must be started without command-line parameters. # ============================================================================ # Author: Gerlof Langeveld - AT Computing Nijmegen, Holland # Date: August 1999 - Initial # October 1999 - Separate counters for output and input # March 2001 - Configurable name for xferlog-file # March 2001 - More than one FTP-log file supported ############################################################################## CONFIGF=/etc/atsar.conf FTPSTAT=/var/log/atsar/ftpstat ############################################################################## # if no statistics-file exists yet, one will be created ############################################################################## if [ ! -f $FTPSTAT ] then > $FTPSTAT # file exists anyhow even if no logfile present if [ ! -f $CONFIGF ] then exit 0 fi CURDATE=`date +%Y%m%d` CURTIME=`date +%H%M%S` # generate one line for every logfile # while read CURTYPE CURLOGF CURNAME REST do if [ "$CURTYPE" != "FTP" -o "$CURLOGF" = "" -o "$CURNAME" = "" ] then continue fi if [ -f $CURLOGF ] then CUROFFSET=`ls -l $CURLOGF | awk '{print $5}'` echo "0 0 0 0 0 0 $CURDATE $CURTIME $CUROFFSET $CURLOGF $CURNAME" >> $FTPSTAT fi done < $CONFIGF exit 0 else if [ ! -s $FTPSTAT ] # file exists and is empty ? then exit 0 fi fi ############################################################################## # function: awk-session counts the number of FTP-requests per type ############################################################################## function ftp_process { $NEXTCMD 2> /dev/null | awk ' BEGIN { months["Jan"] = 1 months["Feb"] = 2 months["Mar"] = 3 months["Apr"] = 4 months["May"] = 5 months["Jun"] = 6 months["Jul"] = 7 months["Aug"] = 8 months["Sep"] = 9 months["Oct"] = 10 months["Nov"] = 11 months["Dec"] = 12 needcheck="y" cnt=0 # gather shell-parameters prevdate="'"$CURDATE"'" prevtime="'"$CURTIME"'" prevstamp=prevdate prevtime # YYYYMMDDHHMMSS newoffset="'"$NEWOFFSET"'" ocumxfer="'"$OCUMXFER"'" ocumsecs="'"$OCUMSECS"'" ocumsize="'"$OCUMSIZE"'" icumxfer="'"$ICUMXFER"'" icumsecs="'"$ICUMSECS"'" icumsize="'"$ICUMSIZE"'" ftplogf= "'"$CURLOGF"'" ftpname= "'"$CURNAME"'" } needcheck=="y" { linetime=$4 gsub(/:/, "", linetime) # get format HHMMSS linestamp = sprintf("%04d%02d%02d%s", $5, months[$2], $3, linetime) # get YYYYMMDDHHMMSS if (linestamp < prevstamp) # check for proper date next needcheck="n" # from now on no checks any more because log-lines # are delivered in chronological order! } { # for every new log-line .... cnt++ if ($12 == "i") { icumxfer++ icumsecs+=$6 icumsize+=$8/1024 } else { ocumxfer++ ocumsecs+=$6 ocumsize+=$8/1024 } lastday=$3 # remember info of last processed line lastmon=$2 lastyear=$5 lasttime=$4 } END { if (cnt > 0) { lastdate = sprintf("%04d%02d%02d", lastyear, months[lastmon], lastday) gsub(/:/, "", lasttime) } else { lastdate=prevdate lasttime=prevtime } printf("%lf %lf %lf %lf %lf %lf %08ld %06ld %ld %s %s\n", ocumxfer, ocumsecs, ocumsize, icumxfer, icumsecs, icumsize, lastdate, lasttime, newoffset, ftplogf, ftpname) }' >> $FTPSTAT.new } ############################################################################# # statistics-file is found; read every line and cut into pieces ############################################################################# # > $FTPSTAT.new while read OCUMXFER OCUMSECS OCUMSIZE ICUMXFER ICUMSECS ICUMSIZE \ CURDATE CURTIME CUROFFSET CURLOGF CURNAME REST do # # check which log-files are modified since the previous scan; # there may have been zero or more logfile-rotations # XFERNEW= XFERNEWGZ= XFERCNT=0 for XFERFILE in ${CURLOGF}* do if [ $XFERFILE -ot $FTPSTAT ] # this xfer-file not modified since then # last write of statistics-file? break # then subsequent names also older fi # remember file to be processed case $XFERFILE in *.gz) XFERNEWGZ="$XFERFILE $XFERNEWGZ" ;; *) XFERNEW="$XFERFILE $XFERNEW" ;; esac let XFERCNT+=1 # count files to be processed done # # check which xferlog-files contain new information # case $XFERCNT in #################################################################### # no ftp-transfers since previous check? 0) echo $OCUMXFER $OCUMSECS $OCUMSIZE $ICUMXFER $ICUMSECS $ICUMSIZE \ $CURDATE $CURTIME $CUROFFSET $CURLOGF $CURNAME >> $FTPSTAT.new continue ;; #################################################################### # only xferlog itself is modified (no logfile-rotation); # an efficient scan can be done by skipping the part which has # been processed before 1) if [ "$CUROFFSET" -eq 0 ] then NEXTCMD="cat $CURLOGF" else NEXTCMD="dd skip=1 ibs=$CUROFFSET if=$CURLOGF" fi ;; #################################################################### # apparantly xferlogs have been rotated since the previous run; # the log-lines from all modified xferlog-files are concatenated # in chronological order (so filenames are in reversed order) which # allows the awk-selection to skip lines which have been processed # before; note that the remembered offset does not necessarily # belong to the oldest file, because a complete cycle might # have been occurred since the previous run *) if [ "$XFERNEWGZ" != "" ] then NEXTCMD="zcat $XFERNEWGZ | cat - $XFERNEW" else NEXTCMD="cat $XFERNEW" fi ;; esac # # Process new ftp-transfers # NEWOFFSET=`ls -l $CURLOGF | awk '{print $5}'` # to be stored by awk ftp_process # activate awk-session done < $FTPSTAT mv $FTPSTAT.new $FTPSTAT exit 0 atsar-1.7/scripts/atsahttp0000755000175000017500000002132210073242162016571 0ustar mstonemstone00000000000000#!/bin/bash ############################################################################## # This script can be used to process the access-logfiles which are generated # by the Apache httpd-daemon for every virtual host. In an access-logfile, # one line is stored per http-request. # This script counts the number of http-requests per virtual host. This # information is stored in the httpstat-file /var/log/atsar/httpstat, # which contains one line per virtual host with the following format: # # field 1: cumulative_requests HEAD # field 2: cumulative_requests GET # field 3: cumulative_requests PUT # field 4: cumulative_requests POST # field 5: cumulative_requests DELETE # field 6: date of last processed http-request # field 7: time of last processed http-request # field 8: last processed offset in the access-logfile (see field 9) # field 9: path-name of access-logfile # field 10: symbolic name (shown in output of atsar) # # Every time this script is started, it reads the lines from the # httpstat-file. After that it continues reading the access-logfile # at the point that it stopped the previous time. At the end of a run, # the information in de httpstat-file will be updated with the new # cumulative figures. # # Note that this script should be activated with regular intervals. # Obviously the information in the httpstat-file is not accurate any more # if between two runs *all* generations of a access-logfile have been rotated. # # This script must be started without command-line parameters. # ============================================================================ # Author: Gerlof Langeveld - AT Computing Nijmegen, Holland # Date: August 1999 - Initial # March 2001 - Configurable names for access-logfiles ############################################################################## CONFIGF="/etc/atsar.conf" ############################################################################## # if no statistics-file exists yet, one will be created ############################################################################## HTTPSTAT=/var/log/atsar/httpstat if [ ! -f $HTTPSTAT ] then > $HTTPSTAT # file exists anyhow even if no logfile present if [ ! -f $CONFIGF ] then exit 0 fi CURDATE=`date +%Y%m%d` CURTIME=`date +%H%M%S` # generate a line for every logfile # while read CURTYPE CURLOGF CURNAME REST do if [ "$CURTYPE" != "HTTP" -o "$CURLOGF" = "" -o "$CURNAME" = "" ] then continue fi if [ -f $CURLOGF ] then CUROFFSET=`ls -l $CURLOGF | awk '{print $5}'` echo "0 0 0 0 0 $CURDATE $CURTIME $CUROFFSET $CURLOGF $CURNAME" >> $HTTPSTAT fi done < $CONFIGF exit 0 else if [ ! -s $HTTPSTAT ] # file exists and is empty ? then exit 0 fi fi ############################################################################## # function: awk-session counts the number of HTTP-requests per type ############################################################################## function http_process { $NEXTCMD 2> /dev/null | awk ' BEGIN { months["Jan"] = 1 months["Feb"] = 2 months["Mar"] = 3 months["Apr"] = 4 months["May"] = 5 months["Jun"] = 6 months["Jul"] = 7 months["Aug"] = 8 months["Sep"] = 9 months["Oct"] = 10 months["Nov"] = 11 months["Dec"] = 12 needcheck="y" cnt=0 # gather shell-parameters prevdate="'"$CURDATE"'" prevtime="'"$CURTIME"'" prevstamp=prevdate prevtime newoffset="'"$NEWOFFSET"'" httplogf="'"$CURLOGF"'" httpname="'"$CURNAME"'" cumhead="'"$CUMHEAD"'" cumgets="'"$CUMGETS"'" cumputs="'"$CUMPUTS"'" cumpost="'"$CUMPOST"'" cumdels="'"$CUMDELS"'" } needcheck=="y" { gsub(/[\[/]/, ":", $4) split($4, dt, ":") # get format YYYYMMDDHHMMSS linestamp = sprintf("%04d%02d%02d%02d%02d%02d", dt[4], months[dt[3]], dt[2], dt[5], dt[6], dt[7]) if (linestamp < prevstamp) # check for proper date next needcheck="n" # from now on no checks any more because log-lines # are delivered in chronological order! } { lastdt=$4 # remember info of last processed line } $6 == "\"HEAD" { # for every HEAD-request ... cnt++ cumhead++ next } $6 == "\"GET" { # for every GET-request ... cnt++ cumgets++ next } $6 == "\"PUT" { # for every PUT-request ... cnt++ cumputs++ next } $6 == "\"POST" { # for every POST-request ... cnt++ cumpost++ next } $6 == "\"DELETE" { # for every DELETE-request ... cnt++ cumdels++ next } END { if (cnt > 0) { gsub(/[\[/]/, ":", lastdt) split(lastdt, dt, ":") # get format YYYYMMDD lastdate = sprintf("%04d%02d%02d", dt[4], months[dt[3]], dt[2]) lasttime = sprintf("%02d%02d%02d", dt[5], dt[6], dt[7]) } else { lastdate=prevdate lasttime=prevtime } printf("%lf %lf %lf %lf %lf %08ld %06ld %ld %s %s\n", cumhead, cumgets, cumputs, cumpost, cumdels, lastdate, lasttime, newoffset, httplogf, httpname) }' >> $HTTPSTAT.new } ############################################################################## # statistics-file is found; read every line and cut into pieces ############################################################################## # > $HTTPSTAT.new while read CUMHEAD CUMGETS CUMPUTS CUMPOST CUMDELS \ CURDATE CURTIME CUROFFSET CURLOGF CURNAME REST do # # check which access-logfiles for this virtual host are modified # since the previous scan; there may have been zero or more # logfile-rotations # ACCNEW= ACCNEWGZ= ACCCNT=0 for ACCFILE in ${CURLOGF}* do # if this access-file is not modified since # last write of statistics-file, then this file AND # all subsequent files are older and therefor not modified if [ $ACCFILE -ot $HTTPSTAT ] then break fi # remember file to be processed case $ACCFILE in *.gz) ACCNEWGZ="$ACCFILE $ACCNEWGZ" ;; *) ACCNEW="$ACCFILE $ACCNEW" ;; esac let ACCCNT+=1 # count files to be processed done # # check which access-files contain new information # case $ACCCNT in ############################################################ # no http-transfers since previous check? 0) echo $CUMHEAD $CUMGETS $CUMPUTS $CUMPOST $CUMDELS \ $CURDATE $CURTIME $CUROFFSET $CURLOGF $CURNAME >> $HTTPSTAT.new continue ;; ############################################################ # only access_log itself is modified (no logfile-rotation); # an efficient scan can be done by skipping the part which has # been processed before 1) if [ "$CUROFFSET" -eq 0 ] then NEXTCMD="cat $CURLOGF" else NEXTCMD="dd skip=1 ibs=$CUROFFSET if=$CURLOGF" fi ;; ############################################################ # apparantly access_logs have been rotated since the previous # run; the log-lines from all modified access_log-files are # concatenated in chronological order (so filenames are in # reversed order) which allows the awk-selection to skip # lines which have been processed before; note that the # remembered offset does not necessarily belong to the # oldest file, because a complete cycle might have been # occurred since the previous run *) if [ "$ACCNEWGZ" != "" ] then NEXTCMD="zcat $ACCNEWGZ | cat - $ACCNEW" else NEXTCMD="cat $ACCNEW" fi ;; esac # # Process new http-transfers for this virtual host # NEWOFFSET=`ls -l $CURLOGF | awk '{print $5}'` # to be stored by awk http_process # activate awk-session done < $HTTPSTAT mv $HTTPSTAT.new $HTTPSTAT exit 0 atsar-1.7/atsar/0000755000175000017500000000000010073242162014436 5ustar mstonemstone00000000000000atsar-1.7/atsar/atsar0000755000175000017500000015055210073242162015506 0ustar mstonemstone00000000000000ELFàˆ4 ¸4 (44€4€ÀÀôô€ô€€€ŒŒ¼Àd’ddÈÈ /lib/ld-linux.so.2GNU$ " !#   ù‡•"$‡.¡4‡%D‡:#T‡ùCd‡-vt‡2*„‡p>”‡:R¤‡%" À´ÄÀ´‡.•ćD‰Ô‡3‚ä‡íô‡¯ÛˆÓKˆªD$ˆ284ˆ@Dˆ'ôTˆ@»dˆåÇtˆ+{„ˆ-š”ˆCȨ¤ˆ:1ÌÌä𬴈-jÐqĈ@ libc.so.6stdout__ctype_bmemcpyperrormallocoptarglseekpipefprintfstrcat__deregister_frame_infooptindreadforksscanfexeclpgetoptlocaltimememsetstrcmpdupsprintfstderrexitsetbufatoi_IO_stdin_used__libc_start_mainstrlenopen__register_frame_infoclose__gmon_start__GLIBC_2.0ii $¸#À Ä ÈÌÐ!HLPTX\`dh l p tx|€„ˆŒ”˜œ ¤¨¬° ´"U‰åƒìè è£è~iÉÃÿ5@ÿ%Dÿ%Hhéàÿÿÿÿ%LhéÐÿÿÿÿ%PhéÀÿÿÿÿ%Thé°ÿÿÿÿ%Xh é ÿÿÿÿ%\h(éÿÿÿÿ%`h0é€ÿÿÿÿ%dh8épÿÿÿÿ%hh@é`ÿÿÿÿ%lhHéPÿÿÿÿ%phPé@ÿÿÿÿ%thXé0ÿÿÿÿ%xh`é ÿÿÿÿ%|hhéÿÿÿÿ%€hpéÿÿÿÿ%„hxéðþÿÿÿ%ˆh€éàþÿÿÿ%ŒhˆéÐþÿÿÿ%héÀþÿÿÿ%”h˜é°þÿÿÿ%˜h é þÿÿÿ%œh¨éþÿÿÿ% h°é€þÿÿÿ%¤h¸épþÿÿÿ%¨hÀé`þÿÿÿ%¬hÈéPþÿÿÿ%°hÐé@þÿÿÿ%´hØé0þÿÿ1í^‰áƒäðPTRhÀðhì†QVhà‰èÿÿÿô‰öU‰åSPè[Ã.Š‹ƒ|…ÀtÿЋ]üÉÉöU‰åƒì‹ …ÒuI‹‹…Àtt&B£ÿ‹‹ …Éu긤‡…Àtƒì h`è(þÿÿƒÄ¸£ ‰ì]ÃvU‰åƒì‰ì]öU¸‡‰åƒì…ÀtƒìhÔh`èSýÿÿƒÄ‰ì]ô&U‰åƒì‰ì]öU‰åVSìÇ…pÿÿÿÇ…lÿÿÿQƒì ¡ƒÀ PètýÿÿƒÄ‰À‰…tÿÿÿ‹…tÿÿÿ…Àuƒì h4ñè"ýÿÿƒÄƒì jè%þÿÿÇ…ÿÿÿ‹…ÿÿÿ;|ë,‹tÿÿÿ‹…ÿÿÿ‰ÂÁâ¸(ŠD‹•ÿÿÿˆ ÿ…ÿÿÿëÅ‹…tÿÿÿ‹ÿÿÿƃìh;ñÿµtÿÿÿèiýÿÿƒÄƒì ÿµtÿÿÿè8ýÿÿƒÄ‰À‰ÀH‰Eôƒ}ôué•‹Eô…tÿÿÿ€8:uëxÇ…ÿÿÿ‹…ÿÿÿ;Eô|ë_v‹Eô…tÿÿÿ‹•tÿÿÿŠ‹ÿÿÿ:të5‰öƒì‹Eô…tÿÿÿ¾Ph`ñÿ5Äè$üÿÿƒÄƒì ‹E ÿ0è̃Äÿ…ÿÿÿë•Eôÿébÿÿÿ‰övƒìÿµtÿÿÿÿu ÿuèTüÿÿƒÄ‰À‰Eôƒ}ôÿué ‹EôƒèA‰…ÿÿÿƒ½ÿÿÿ2‡s‹•ÿÿÿ‹• òÿàÇ…ÿÿÿ‹ÿÿÿ; |딋…ÿÿÿ‰ÂÁâ¸(Æÿ…ÿÿÿëÔ¡Ì£Œéiÿÿÿƒì…pÿÿÿPÿ5Ìè÷ƒÄ‰À…À…Fÿÿÿƒì ‹E ÿ0èéƒÄé1ÿÿÿƒì…lÿÿÿPÿ5Ì迃ĉÀ…À…ÿÿÿƒì ‹E ÿ0豃Äéùþÿÿ¡Ì¾kСÈf‹%f…Àuƒì ‹E ÿ0è}ƒÄƒì ÿ5ÌèÄûÿÿƒÄ‰À‰À£pé«þÿÿv¡Ì¾kСÈf‹%f…Àuƒì ‹E ÿ0è-ƒÄƒì ÿ5ÌètûÿÿƒÄ‰À‰À£`é[þÿÿvÆdéLþÿÿÇ…ÿÿÿ‹…ÿÿÿ;|ë8‹…ÿÿÿ‰ÂÁâ¸(¾D9Eôu‹…ÿÿÿ‰ÂÁâ¸(Æëÿ…ÿÿÿ븋•ÿÿÿ;…æýÿÿƒì ‹E ÿ0艃ÄéÑýÿÿÇ…ÿÿÿÇlv‹ÿÿÿ; |ë$‹…ÿÿÿ‰ÂÁâ¸(€<tÿlÿ…ÿÿÿë̃=luÆ(Çl¡Ð‹U)‰ЅÀŽ$¡ÐkЋE ‹¾kСÈf‹%f…Àuƒì ‹E ÿ0è҃ġÐkЋE ‹£€ÿЃì ÿ5€èúÿÿƒÄ‰À‰À…Àƒì ‹E ÿ0èƒÄ¡Ð‹U)‰ЅÀ~M¡ÐkЋE ‹¾kСÈf‹%f…Àuƒì ‹E ÿ0èIƒÄ¡ÐkЋE ‹£|ë Ç|‹ñƒì ÿ5|èpùÿÿƒÄ‰À‰…ÿÿÿÿ…ÿÿÿƒìÿµÿÿÿhñh è‡ùÿÿƒÄÇ| ƒìjÿ5ÀèjøÿÿƒÄƒ=Œ…ƒ=€…åƒ=|…؃=`tƒìÿ5`hñ…xÿÿÿPèùÿÿƒÄëOƒì jèøÿÿƒÄ‰À‰…Tÿÿÿƒì …TÿÿÿPèd÷ÿÿƒÄ‰À‰…Xÿÿÿƒì‹…Xÿÿÿÿp hñ…xÿÿÿPèÌøÿÿƒÄƒìj…xÿÿÿPèXøÿÿƒÄ‰À£ƒ=ÿ…ƒì…xÿÿÿPh¨ñÿ5Äè7÷ÿÿƒÄƒì h²ñè÷ÿÿƒÄƒì jèøÿÿ‰öƒì …HÿÿÿPè9÷ÿÿƒÄ‰Àƒøÿuƒì h³ñèâöÿÿƒÄƒì jèå÷ÿÿèïöÿÿ‰…üþÿÿƒ½üþÿÿÿ„¬ƒ½üþÿÿt#‹…Hÿÿÿ£ƒì ÿµLÿÿÿèŠöÿÿƒÄéÞ‰öƒì jèvöÿÿƒÄƒì ÿµLÿÿÿèÅ÷ÿÿƒÄƒì ÿµHÿÿÿèTöÿÿƒÄƒì ÿµLÿÿÿèCöÿÿƒÄƒì jÿ5|ÿ5€h½ñhÄñèÀöÿÿƒÄ ƒì hÚñè öÿÿƒÄƒì jè#÷ÿÿvƒì hæñèöÿÿƒÄƒì jè÷ÿÿ‰öƒìjÿ5ŒèäöÿÿƒÄ‰À£ƒ=ÿuƒì hëñèÄõÿÿƒÄƒì jèÇöÿÿvƒìh°h ÿ5èì ƒÄ‰À…Àu ƒì jè™öÿÿ= ¾ºíþt ƒìhûñÿ5ÄèyõÿÿƒÄƒì jèlöÿÿ=¤°t ƒìh òÿ5ÄèMõÿÿƒÄƒì jè@öÿÿƒì hXhThPhJòhJè?öÿÿƒÄ ƒì ¡¨‰ÀÁàPè)õÿÿƒÄ‰À£t¡t…Àuƒì h4ñèÙôÿÿƒÄƒì jèÜõÿÿƒì¡¨‰ÀÁàPÿ5tÿ5èý ƒÄ‰À…Àu ƒì jèªõÿÿ‰öƒì ÿ5¬èºôÿÿƒÄ‰À‰…`ÿÿÿ‹…`ÿÿÿ…Àuƒì h4ñèhôÿÿƒÄƒì jèkõÿÿvƒìÿ5¬ÿµ`ÿÿÿÿ5èŽ ƒÄ‰À…Àu ƒì jè;õÿÿvÇ…ÿÿÿÇEì‰ö‹…ÿÿÿ;¨|é‹E쉅Tÿÿÿk•ÿÿÿ¡t·Lk•ÿÿÿ¡t·D‰Ê¯ÐEìkµÿÿÿ‹tkÿÿÿ‹t‹…`ÿÿÿ ‰3kÿÿÿ‹t‹…Tÿÿÿf‰D ÿ…ÿÿÿénÿÿÿ‰öƒì ¡´‰ÀÁàPèóÿÿƒÄ‰À£„¡„…Àuƒì h4ñèMóÿÿƒÄƒì jèPôÿÿƒì¡´‰ÀÁàPÿ5„ÿ5èq ƒÄ‰À…Àu ƒì jèôÿÿ‰öƒì ÿ5¸è.óÿÿƒÄ‰À‰…\ÿÿÿ‹…\ÿÿÿ…Àuƒì h4ñèÜòÿÿƒÄƒì jèßóÿÿvƒìÿ5¸ÿµ\ÿÿÿÿ5è ƒÄ‰À…Àu ƒì jè¯óÿÿvÇ…ÿÿÿÇEì‰ö‹•ÿÿÿ;´|é‹E쉅Tÿÿÿk•ÿÿÿ¡„·Lk•ÿÿÿ¡„·D‰Ê¯ÐEìkµÿÿÿ‹„kÿÿÿ‹„‹…\ÿÿÿ ‰3kÿÿÿ‹„‹…Tÿÿÿf‰D ÿ…ÿÿÿénÿÿÿ‰öƒì ÿ5°èòÿÿƒÄ‰À£\¡\…Àuƒì h4ñèÆñÿÿƒÄƒì jèÉòÿÿƒìÿ5°jÿ5\èâòÿÿƒÄƒì ÿ5°èÁñÿÿƒÄ‰À£x¡x…Àuƒì h4ñèqñÿÿƒÄƒì jètòÿÿƒìÿ5°ÿ5xÿ5蚃ĉÀ…Àu ƒì jèGòÿÿvƒì j èZñÿÿƒÄ‰À‰…hÿÿÿ‹…hÿÿÿ…Àuƒì h4ñèñÿÿƒÄƒì jè òÿÿvƒì j èñÿÿƒÄ‰À‰…dÿÿÿ‹…dÿÿÿ…Àuƒì h4ñèÌðÿÿƒÄƒì jèÏñÿÿvƒì ÿ5¼èÞðÿÿƒÄ‰À£ˆ¡ˆ…Àuƒì h4ñèŽðÿÿƒÄƒì jè‘ñÿÿƒì ÿ5¼è¢ðÿÿƒÄ‰À£h¡h…Àuƒì h4ñèRðÿÿƒÄƒì jèUñÿÿƒ=Œ…?ƒ=€„2ƒìÿ5ˆÿµhÿÿÿèúƒÄ‰À…Àu ƒì jèñÿÿvƒì‹…hÿÿÿÿ0hÈèÃă=l…ƒì…(ÿÿÿP‹…hÿÿÿÿ0èðƒÄÇ…ÿÿÿv‹ÿÿÿ; |ëX‹…ÿÿÿ‰ÂÁâ¸(€<t:ƒì…(ÿÿÿPhSòèJðÿÿƒÄƒì ‹…ÿÿÿ‰ÂÁâ¸,hP‹ÿЃÄë ÿ…ÿÿÿë˜vƒìÿ5hÿµdÿÿÿèƒÄ‰À…Àuƒì ÿ5è ïÿÿƒÄƒì jè ðÿÿ‹dÿÿÿ‹…hÿÿÿ‹‹)Љ…Tÿÿÿ‹dÿÿÿ‹…hÿÿÿ‹P‹A)Љ…Xÿÿÿƒ½Tÿÿÿu Ç…Tÿÿÿƒì…8ÿÿÿP‹…dÿÿÿÿ0èàƒÄƒì…(ÿÿÿP‹…hÿÿÿÿ0èÆƒÄÇ…ÿÿÿ‹…ÿÿÿ;|é‹…ÿÿÿ‰ÂÁâ¸(€<uéôƒ=l~7ƒì…(ÿÿÿPhXòèïÿÿƒÄƒì ‹…ÿÿÿ‰ÂÁâ¸,hP‹ÿЃÄƒì…8ÿÿÿPhSòèØîÿÿƒÄƒì‹…ÿÿÿÁà‰…øþÿÿ€=dt•8ÿÿÿ‰•ôþÿÿë Ç…ôþÿÿ^òÿµôþÿÿhPÿ5Äÿ5ÀÿµXÿÿÿÿµTÿÿÿ‹øþÿÿ‹0ÿÐƒÄ ‰Àˆ…'ÿÿÿ€½'ÿÿÿu$ƒì hgòèPîÿÿƒÄ‹…ÿÿÿ‰ÂÁâ¸(Æÿ…ÿÿÿéÒþÿÿ‰öƒ=l~ƒì h{òèîÿÿƒÄ‹…dÿÿÿ‰…ÿÿÿ‹…hÿÿÿ‰…dÿÿÿ‹…ÿÿÿ‰…hÿÿÿ¡h‰… ÿÿÿ¡ˆ£h‹… ÿÿÿ£ˆé²ýÿÿ‰övƒìjjÿ5èÂíÿÿƒÄ‰Eðƒìÿ5ˆÿµhÿÿÿ謃ĉÀ…Àu ƒì jèÅíÿÿƒì ‹…hÿÿÿÿ0èLƒÄ‰À9…pÿÿÿw£ƒì‹…hÿÿÿÿ0hÈèZƒÄÇ…ÿÿÿ‹…ÿÿÿ;|ƒì ÿ5èHìÿÿƒÄƒì jè[íÿÿv‹…ÿÿÿ‰ÂÁâ¸(€<„ƒìjÿuðÿ5èûìÿÿƒÄƒìÿ5ˆÿµhÿÿÿèèƒÄ‰À…Àu ƒì jèíÿÿ‹…hÿÿÿƒxuƒìÿ5¼jÿ5ˆèíÿÿƒÄƒì…ÿÿÿP‹…hÿÿÿÿ0èàƒÄƒì…ÿÿÿPhSòèmìÿÿƒÄƒì ‹…ÿÿÿ‰ÂÁâ¸,hP‹ÿЃÄ‰öƒìÿ5hÿµdÿÿÿèHƒÄ‰À…Àué‰öƒì ‹…dÿÿÿÿ0èìƒÄ‰À9…lÿÿÿséú‰öƒì…ÿÿÿP‹…dÿÿÿÿ0èEƒÄ‹…dÿÿÿƒxuZƒì…ÿÿÿPh}òèÆëÿÿƒÄ‹…dÿÿÿ‰… ÿÿÿ‹…hÿÿÿ‰…dÿÿÿ‹… ÿÿÿ‰…hÿÿÿƒìÿ5¼jÿ5ˆèùëÿÿƒÄé9ÿÿÿƒ=pt#‹…dÿÿÿ‹ƒÁ‹•hÿÿÿ¡p9Á}éÿÿÿ‰ö‹dÿÿÿ‹…hÿÿÿ‹‹)Љ…ÿÿÿ‹dÿÿÿ‹…hÿÿÿ‹P‹A)Љ…Tÿÿÿƒ½ÿÿÿu Ç…ÿÿÿƒì…ÿÿÿPhSòèûêÿÿƒÄƒì‹…ÿÿÿÁà‰…ðþÿÿ€=dt•ÿÿÿ‰•ìþÿÿë vÇ…ìþÿÿ^òÿµìþÿÿhPÿ5Äÿ5ÀÿµTÿÿÿÿµÿÿÿ‹ðþÿÿ‹0ÿÐƒÄ ‰Àˆ…'ÿÿÿ€½'ÿÿÿu)ƒì hgòèpêÿÿƒÄ‹…ÿÿÿ‰ÂÁâ¸(ÆëOv‹…dÿÿÿ‰… ÿÿÿ‹…hÿÿÿ‰…dÿÿÿ‹… ÿÿÿ‰…hÿÿÿ¡h‰…Xÿÿÿ¡ˆ£h‹…Xÿÿÿ£ˆéÃýÿÿvƒì h{òèûéÿÿƒÄÿ…ÿÿÿé©üÿÿU‰åƒìƒìj ÿuÿ5èSƒÄ‰À…Àu ¸ë@v‹Eƒxu¸ë-ƒì‹Eÿpÿu ÿ5èƒÄ‰À…Àu¸ë¸ÉÃU‰åƒìƒ}uë`ƒìÿuÿu ÿuèÿéÿÿƒÄ‰Eü‹Eüƒøÿuƒì hlóètèÿÿƒÄƒì jèwéÿÿvƒ}üu ¸ëvE‹Uü)E ‹Uü뚉ö¸ÉÃU‰åƒìƒìÿuh€óÿ5Äè,èÿÿƒÄƒìÿuhÀóÿ5ÄèèÿÿƒÄƒìhôÿ5ÄèýçÿÿƒÄƒìhôÿ5ÄèççÿÿƒÄƒìh ôÿ5ÄèÑçÿÿƒÄÇEüv‹Eü;| ƒì jè¯èÿÿv‹Eü‰ÂÁâ¸4ÿ4‹Eü‰ÂÁâ¸(¾DPhFôÿ5ÄèyçÿÿƒÄƒ}üuƒìhNôÿ5Äè]çÿÿƒÄëƒìh{òÿ5ÄèEçÿÿƒÄÿEüévÿÿÿ‰öU‰åƒìƒìEèPÿu 胃ăìEèP‹EP‹EÃP‹E‚P‹EƒÀAPÿuh_ôèªçÿÿƒÄ ÉÃU‰åƒìƒì U‰ÐPèæÿÿƒÄ‰À‰Eüƒì ‹Eüÿ0‹Eüÿp‹Eüÿphyôÿu è÷çÿÿƒÄ ÉÉöU‰åƒìƒì U‰ÐPèLæÿÿƒÄ‰À‰Eüƒì ‹Eü‹@lP‹Eüÿp ‹Eü‹@@Phˆôÿu èªçÿÿƒÄ ÉÃU‰åSƒìÇEð‹E‹Uð€<uëB‰ö‹E‹Uð¾kСÈf‹%f…Àu‹E‹Uð€<:t ¸é‰öÿEðë³vEôPEøPh—ôÿuèÿæÿÿƒÄƒ}øxƒ}øƒ}ôx ƒ}ô<ë ‰ö¸ëK‹] ‹Uø‰ÐÁà)ÐÁàЉÁÁá‹Uô‰ÐÑàÐ…ÐÁà‰‹E 8Qv ‹E ÇQ¸‹]üÉÃU‰åƒìƒì U‰ÐPèåÿÿƒÄ‰À‰Eü‹Eü‹P‰ÐÁà)ÐÁàЉÁÁá‹Eü‹P‰ÐÑàÐ…ÐÁà‰ÀÉÉöU‰åƒì¡ìkС„ƒìÿ4ÿuèÃäÿÿƒÄ‰À‰À…ÀuT‹M ¡ìkС„·Dh‰‹M¡ìkС„·Dˆ‰¡ìkС„·D‰ÀéÇEü‹Eü;´|ëvkUü¡„ƒìÿ4ÿuè5äÿÿƒÄ‰À‰À…ÀuR‹M kUü¡„·Dh‰‹MkUü¡„·Dˆ‰‹Eü£ìkUü¡„·D‰ÀéˆvÿEüétÿÿÿÇEü‹Eü;¨|ëcvkUü¡tƒìÿ4ÿuè¡ãÿÿƒÄ‰À‰À…Àu6‹M kUü¡t·Dx‰‹U¡\‰kUü¡t·D‰ÀëÿEüë“v¸ÉÃU‰åƒì‹Eƒ8~‹Eƒx~ëvƒì hàôèäÿÿƒÄë‰öƒì h@õèäÿÿƒÄÉÉöU‰åSƒìTƒìE¸PE¼Phõè þÿÿƒÄ…Àu ¸é°v‹E¸ÿpÿ0‹E¼ÿpÿ0è¯KƒÄÝ]¨‹M¨‹]¬‰È‰ÚÛE‰E¨‰U¬ÝE¨ÞñÝ]ð‹E¸ÿpÿp‹E¼ÿpÿpèwKƒÄÝ]¨‹M¨‹]¬‰È‰ÚÛE‰E¨‰U¬ÝE¨ÞñÝ]è‹E¸ÿp ÿp‹E¼ÿp ÿpè?KƒÄÝ]¨‹M¨‹]¬‰È‰ÚÛE‰E¨‰U¬ÝE¨ÞñÝ]à‹E¸ÿp$ÿp ‹E¼ÿp$ÿp èKƒÄÝ]¨‹M¨‹]¬‰È‰ÚÛE‰E¨‰U¬ÝE¨ÞñÝ]ЋE¸ÿp,ÿp(‹E¼ÿp,ÿp(èÏJƒÄÝ]¨‹M¨‹]¬‰È‰ÚÛE‰E¨‰U¬ÝE¨ÞñÝ]È‹E¸ÿp4ÿp0‹E¼ÿp4ÿp0è—JƒÄÝ]¨‹M¨‹]¬‰È‰ÚÛE‰E¨‰U¬ÝE¨ÞñÝ]ÀÛE ÝEðÜEèÜEàÜEÐÜEÈÜEÀÞéÝ]ØÝEØÙîÙÉÚéßà€äE€ütëvÇEØÇEÜ‹Eƒ8~‹Eƒx~ëwvƒì ÝEØÝ öÞÉÛE Þùd$øÝ$ÝEàÝ öÞÉÛE Þùd$øÝ$ÝEèÝ öÞÉÛE Þùd$øÝ$ÝEðÝ öÞÉÛE Þùd$øÝ$h õè¿áÿÿƒÄ0é´vƒìÝEØÝ öÞÉÛE Þùd$øÝ$ÝEÐÝ öÞÉÛE Þùd$øÝ$ÝEÀÝ öÞÉÛE Þùd$øÝ$ÝEÈÝ öÞÉÛE Þùd$øÝ$ÝEèÝ öÞÉÛE Þùd$øÝ$ÝEàÝ öÞÉÛE Þùd$øÝ$ÝEðÝ öÞÉÛE Þùd$øÝ$hàõèáÿÿƒÄ@ƒ}ŽÕÇE´‰ö‹M´;M|é¿v‹U¸kE´ƒÀ0ÿt ÿt‹U¼kE´ƒÀ0ÿt ÿtè¯HƒÄÝ]ð‹U¸kE´0ÿt ÿt‹U¼kE´0ÿt ÿtè|HƒÄÝ]è‹U¸kE´0ÿt ÿt‹U¼kE´0ÿt ÿtèIHƒÄÝ]à‹U¸kE´0ÿt ÿt‹U¼kE´0ÿt ÿtèHƒÄÝ]ЋU¸kE´0ÿt ÿt‹U¼kE´0ÿt ÿtèãGƒÄÝ]È‹U¸kE´0ÿt ÿt‹U¼kE´0ÿt ÿtè°GƒÄÝ]ÀÛE ÝEðÜEèÜEàÜEÐÜEÈÜEÀÞéÝ]ØÝEØÙîÙÉÚéßà€äE€ütëvÇEØÇEÜ‹Eƒ8~‹Eƒx~ë{vƒìÝEØÝ öÞÉÛE Þùd$øÝ$ÝEàÝ öÞÉÛE Þùd$øÝ$ÝEèÝ öÞÉÛE Þùd$øÝ$ÝEðÝ öÞÉÛE Þùd$øÝ$ÿu´ÿuh öèíÞÿÿƒÄ0鸃ì ÝEØÝ öÞÉÛE Þùd$øÝ$ÝEÐÝ öÞÉÛE Þùd$øÝ$ÝEÀÝ öÞÉÛE Þùd$øÝ$ÝEÈÝ öÞÉÛE Þùd$øÝ$ÝEèÝ öÞÉÛE Þùd$øÝ$ÝEàÝ öÞÉÛE Þùd$øÝ$ÝEðÝ öÞÉÛE Þùd$øÝ$ÿu´ÿuh`öè0ÞÿÿƒÄPÿE´é5ýÿÿ¸‹]üÉÉöU‰åƒìƒì hÀöèÞÿÿƒÄÉÃU‰åSƒìƒìEðPEôPhõèøÿÿƒÄ…Àu ¸é±vƒì ‹EôÙ€HId$øÝ$‹EôÙ€DId$øÝ$‹EôÙ€@Id$øÝ$‹Eôÿ°XIÿ°TI‹Eôÿ°PIÿ°LIƒì ‹Eðÿ°ƒÄÝ]à‹Mà‹]ä‰È‰ÚÛE‰Eà‰UäÝEàÞñd$øÝ$h­øè^ÖÿÿƒÄÿEèéGÿÿÿv¸‹]üÉÉöU‰åƒìƒì hÀøè1ÖÿÿƒÄÉÃU‰åƒìƒìEøPEüPhGøè=ðÿÿƒÄ‰À…Àu¸ëpƒì ‹Eüÿpÿp‹Eüÿp ÿp‹Eüÿpÿp‹Eüÿp$ÿp ‹Eüÿp,ÿp(‹Eüÿp4ÿp0‹Eüÿp<ÿp8‹EüÿpDÿp@‹EüÿpLÿpH‹EüÿpTÿpPh ùè™ÕÿÿƒÄ`¸ÉÃvU‰åƒìƒì h€ùèyÕÿÿƒÄÉÃU‰åVSƒìPƒìEðPEôPhÇùèƒïÿÿƒÄ‰E¼‹E¼…Àu ¸éƒÿÇE°ÇE´ÇE¸‹E¼9E¸@‹E¼9E´4‹E¸Áà+E¸ Å‹Uô‹ D …Àué‹E¸Áà+E¸Å‹Uô‹E´Áà+E´4Å‹Mð‹‹T‰Ó3\131 Ø…ÀtxÇE´‹E¼9E´}h‹E´Áà+E´ Å‹Uð‹ D …ÀuëH‹E¸Áà+E¸Å‹Uô‹E´Áà+E´4Å‹Mð‹‹T‰Ó3\131 Ø…Àuë ‰öÿE´ë“v‹E´Áà+E´Å‹Eðÿt ÿt‹E¸Áà+E¸Å‹Eôÿt ÿtèñ;ƒÄÝ]è‹E´Áà+E´Å‹Eðÿtÿt‹E¸Áà+E¸Å‹Eôÿtÿtè°;ƒÄÝ]à‹E´Áà+E´Å‹Eðÿtÿt‹E¸Áà+E¸Å‹Eôÿtÿtèo;ƒÄÝ]Ø‹E´Áà+E´Å‹Eðÿt$ÿt ‹E¸Áà+E¸Å‹Eôÿt$ÿt è.;ƒÄÝ]ЋE´Áà+E´Å‹Eðÿt4ÿt0‹E¸Áà+E¸Å‹Eôÿt4ÿt0èí:ƒÄÝ]À‹E´Áà+E´Å‹Eðÿt,ÿt(‹E¸Áà+E¸Å‹Eôÿt,ÿt(è¬:ƒÄÝ]ȃ=~&ÝEèÜEàÜEØÜEÐÜEÀÜEÈÙîÙÉÚéßà€äE€ü@„œÿE°ƒ}°~ƒìÿuhÏùèfÒÿÿƒÄƒìÛEÝEÈÞñd$øÝ$ÛEÝEÀÞñd$øÝ$ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$‹E¸Áà+E¸Å‹Eôÿ4hàùèæÑÿÿƒÄ@ÿE¸ÿE´é´üÿÿƒ}°uƒì hŽøèÅÑÿÿƒÄ¸eø[^]ÉöU‰åƒìƒì h úè¡ÑÿÿƒÄÉÃU‰åƒìXƒìEÀPEÄPhgúè­ëÿÿƒÄ‰E°‹E°…Àu ¸é±‰öÿÇE¼ÇE¸ÇE´‹E°9E¼|ékv‹E¼ÁàE¼‰ÂÁâ‹EÄ€<uéL‹E¸ÁàE¸Áà‰ÂUÀ‹E¼ÁàE¼ÁàEăìRPèÐÿÿƒÄ‰À…Àt{ÇE¸‰ö‹E°9E¸|ë^‰ö‹E¸ÁàE¸‰ÂÁâ‹EÀ€<uëCv‹E¸ÁàE¸Áà‰ÂUÀ‹E¼ÁàE¼ÁàEăìRPè¢ÏÿÿƒÄ‰À…Àuë vÿE¸ë›vÇ‹E¸ÁàE¸‰ÂÁâ‹EÀÿtÿt‹E¼ÁàE¼‰ÂÁâ‹EÄÿtÿtè38ƒÄÝ]ø‹E¸ÁàE¸‰ÂÁâ‹EÀÿt\ÿtX‹E¼ÁàE¼‰ÂÁâ‹EÄÿt\ÿtXèö7ƒÄÝ]ð‹E¸ÁàE¸‰ÂÁâ‹EÀÿtÿt‹E¼ÁàE¼‰ÂÁâ‹EÄÿtÿtè¹7ƒÄÝ]è‹E¸ÁàE¸‰ÂÁâ‹EÀÿtTÿtP‹E¼ÁàE¼‰ÂÁâ‹EÄÿtTÿtPè|7ƒÄÝ]à‹E¸ÁàE¸‰ÂÁâ‹EÀÿtDÿt@‹E¼ÁàE¼‰ÂÁâ‹EÄÿtDÿt@è?7ƒÄÝ]Ø‹E¸ÁàE¸‰ÂÁâ‹EÀÿ´Œÿ´ˆ‹E¼ÁàE¼‰ÂÁâ‹EÄÿ´Œÿ´ˆèö6ƒÄÝ]ЋE¸ÁàE¸‰ÂÁâ‹EÀÿtLÿtH‹E¼ÁàE¼‰ÂÁâ‹EÄÿtLÿtHè¹6ƒÄÝ]ȃ=~-ÝEøÙîÙÉÚéßà€äE€ü@tëÝEðÙîÙÉÚéßà€äE€ü@„¢ƒ}´tƒìÿuhÏùèoÎÿÿƒÄÿE´‹E¼ÁàE¼ÁàEÄPÛEÝEÈÞñd$øÝ$ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$h€úèæÍÿÿƒÄ@ÿE¼‹E¼‰E¸é‰üÿÿƒ}´uƒì hŽøèÁÍÿÿƒÄ¸ÉÃvU‰åƒìƒì hÀúè¡ÍÿÿƒÄÉÃU‰åƒìxƒìE PE¤Phgúè­çÿÿƒÄ‰E‹E…Àu ¸é¥‰öÿÇEœÇE˜ÇE”‹E9Eœ|é_v‹EœÁàEœ‰ÂÁâ‹E¤€<ué@‹E˜ÁàE˜Áà‰ÂU ‹EœÁàEœÁàE¤ƒìRPèÌÿÿƒÄ‰À…Àt{ÇE˜‰ö‹E9E˜|ë^‰ö‹E˜ÁàE˜‰ÂÁâ‹E €<uëCv‹E˜ÁàE˜Áà‰ÂU ‹EœÁàEœÁàE¤ƒìRPè¢ËÿÿƒÄ‰À…Àuë vÿE˜ë›vÇ‹E˜ÁàE˜‰ÂÁâ‹E ÿtÿt‹EœÁàEœ‰ÂÁâ‹E¤ÿtÿtè34ƒÄÝ]ø‹E˜ÁàE˜‰ÂÁâ‹E ÿt\ÿtX‹EœÁàEœ‰ÂÁâ‹E¤ÿt\ÿtXèö3ƒÄÝ]ð‹E˜ÁàE˜‰ÂÁâ‹E ÿt$ÿt ‹EœÁàEœ‰ÂÁâ‹E¤ÿt$ÿt è¹3ƒÄÝ]è‹E˜ÁàE˜‰ÂÁâ‹E ÿtdÿt`‹EœÁàEœ‰ÂÁâ‹E¤ÿtdÿt`è|3ƒÄÝ]à‹E˜ÁàE˜‰ÂÁâ‹E ÿt|ÿtx‹EœÁàEœ‰ÂÁâ‹E¤ÿt|ÿtxè?3ƒÄÝ]Ø‹E˜ÁàE˜‰ÂÁâ‹E ÿt,ÿt(‹EœÁàEœ‰ÂÁâ‹E¤ÿt,ÿt(è3ƒÄÝ]ЋE˜ÁàE˜‰ÂÁâ‹E ÿtlÿth‹EœÁàEœ‰ÂÁâ‹E¤ÿtlÿthèÅ2ƒÄÝ]È‹E˜ÁàE˜‰ÂÁâ‹E ÿt4ÿt0‹EœÁàEœ‰ÂÁâ‹E¤ÿt4ÿt0èˆ2ƒÄÝ]À‹E˜ÁàE˜‰ÂÁâ‹E ÿttÿtp‹EœÁàEœ‰ÂÁâ‹E¤ÿttÿtpèK2ƒÄÝ]¸‹E˜ÁàE˜‰ÂÁâ‹E ÿt<ÿt8‹EœÁàEœ‰ÂÁâ‹E¤ÿt<ÿt8è2ƒÄÝ]°‹E˜ÁàE˜‰ÂÁâ‹E ÿ´„ÿ´€‹EœÁàEœ‰ÂÁâ‹E¤ÿ´„ÿ´€èÅ1ƒÄÝ]¨ƒ=~-ÝEøÙîÙÉÚéßà€äE€ü@tëÝEðÙîÙÉÚéßà€äE€ü@„¢ƒ}”tƒìÿuhÏùè{ÉÿÿƒÄÿE”‹EœÁàEœÁàE¤PÛEÝE¨Þñd$øÝ$ÛEÝE°Þñd$øÝ$ÛEÝEÈÞñd$øÝ$ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$h ûèòÈÿÿƒÄ@ÿEœ‹Eœ‰E˜é•ûÿÿƒ}”uƒì hŽøèÍÈÿÿƒÄ¸ÉÃvU‰åƒìƒì h`ûè­ÈÿÿƒÄÉÃU‰åƒì8ƒìEÈPEÌPh§ûè¹âÿÿƒÄ…Àu ¸é'‹EÈÿpÿp‹EÌÿpÿpè]0ƒÄÝ]ø‹EÈÿpLÿpH‹EÌÿpLÿpHè@0ƒÄÝ]ð‹EÈÿpDÿp@‹EÌÿpDÿp@è#0ƒÄÝ]è‹EÈÿpÿ0‹EÌÿpÿ0è0ƒÄÝ]à‹EÈÿptÿpp‹EÌÿptÿppèë/ƒÄÝ]Ø‹EÈÿ°”ÿ°‹EÌÿ°”ÿ°èÂ/ƒÄÝ]Ѓì ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$hÀûè]ÇÿÿƒÄ@¸ÉÃvU‰åƒìƒì hüè=ÇÿÿƒÄÉÃU‰åƒìHƒìE¸PE¼Ph§ûèIáÿÿƒÄ…Àu ¸éu‹E¸ÿp<ÿp8‹E¼ÿp<ÿp8èí.ƒÄÝ]à‹E¸ÿpÿp‹E¼ÿpÿpèÐ.ƒÄÝ]ø‹E¸ÿp$ÿp ‹E¼ÿp$ÿp è³.ƒÄÝ]ð‹E¸ÿp4ÿp0‹E¼ÿp4ÿp0è–.ƒÄÝ]è‹E¸ÿpdÿp`‹E¼ÿpdÿp`èy.ƒÄÝ]È‹E¸ÿp|ÿpx‹E¼ÿp|ÿpxè\.ƒÄÝ]À‹E¸ÿpTÿpP‹E¼ÿpTÿpPè?.ƒÄÝ]Ø‹E¸ÿp\ÿpX‹E¼ÿp\ÿpXè".ƒÄÝ]Ѓì ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEÀÞñd$øÝ$ÛEÝEÈÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$ÛEÝEàÞñd$øÝ$h`üèŸÅÿÿƒÄP¸ÉÃU‰åƒìƒì hÀüèÅÿÿƒÄÉÃU‰åƒì8ÇEÜÇE؃ìEÐPEÔPh§ûèßÿÿƒÄ…Àu ¸é9‰öƒìEÈPEÌPhýèWßÿÿƒÄ…Àt‹EÌ‹‰EÜ‹EÌ‹@‰EØ‹EÐÿ°´ÿ°°‹EÔÿ°´ÿ°°èè,ƒÄÝ]ø‹EÐÿ°¼ÿ°¸‹EÔÿ°¼ÿ°¸è¿,ƒÄÝ]ð‹EÐÿ°Œÿ°ˆ‹EÔÿ°Œÿ°ˆè–,ƒÄÝ]è‹EÐÿ°”ÿ°‹EÔÿ°”ÿ°èm,ƒÄÝ]àƒì ÿuØÿuÜ‹EÔÿ°¬ÿ°¨ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$h ýèÄÿÿƒÄ@¸ÉÃvU‰åƒìƒì h`ýèñÃÿÿƒÄÉÃU‰åƒì8ƒìEÐPEÔPh§ûèýÝÿÿƒÄ…Àu ¸é-‹EÐÿ°Ìÿ°È‹EÔÿ°Ìÿ°Èè•+ƒÄÝ]ø‹EÐÿ°Äÿ°À‹EÔÿ°Äÿ°Àèl+ƒÄÝ]ð‹EÐÿ°œÿ°˜‹EÔÿ°œÿ°˜èC+ƒÄÝ]è‹EÐÿ°¤ÿ° ‹EÔÿ°¤ÿ° è+ƒÄÝ]à‹EÐÿ°Ôÿ°Ð‹EÔÿ°Ôÿ°Ðèñ*ƒÄÝ]؃ìÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$hÀýè›ÂÿÿƒÄ0¸ÉÃU‰åƒìƒì hþè}ÂÿÿƒÄÉÃU‰åƒì8ÇEÜÇE؃ìEÐPEÔPh§ûè{ÜÿÿƒÄ…Àu ¸é+‰öƒìEÈPEÌPhýèSÜÿÿƒÄ…Àt‹EÌ‹@‰EÜ‹EÌ‹@‰EØ‹EÐÿ°Üÿ°Ø‹EÔÿ°Üÿ°Øèã)ƒÄÝ]ø‹EÐÿ°ôÿ°ð‹EÔÿ°ôÿ°ðèº)ƒÄÝ]ð‹EÐÿ°ìÿ°è‹EÔÿ°ìÿ°èè‘)ƒÄÝ]è‹EÐÿ°äÿ°à‹EÔÿ°äÿ°àèh)ƒÄÝ]àƒìÿuØÿuÜÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$h`þèÁÿÿƒÄ0¸ÉÃU‰åƒìƒì h þèýÀÿÿƒÄÉÃU‰åƒì8ƒìEÈPEÌPh§ûè ÛÿÿƒÄ…Àu ¸ée‹EÈÿ°œÿ°˜‹EÌÿ°œÿ°˜è¡(ƒÄÝ]ø‹EÈÿ°ÿ°‹EÌÿ°ÿ°èx(ƒÄÝ]ð‹EÈÿ°Ôÿ°Ð‹EÌÿ°Ôÿ°ÐèO(ƒÄÝ]è‹EÈÿ°<ÿ°8‹EÌÿ°<ÿ°8è&(ƒÄÝ]à‹EÈÿ°Üÿ°Ø‹EÌÿ°Üÿ°Øèý'ƒÄÝ]Ø‹EÈÿ°Dÿ°@‹EÌÿ°Dÿ°@èÔ'ƒÄÝ]Ѓì ÛEÝEÐÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$hÿèo¿ÿÿƒÄ@¸ÉÃU‰åƒìƒì h@ÿèQ¿ÿÿƒÄÉÃU‰åƒìXƒìE¨PE¬Ph§ûè]ÙÿÿƒÄ…Àu ¸éE‹E¨ÿ°¤ÿ° ‹E¬ÿ°¤ÿ° èõ&ƒÄÝ]ø‹E¨ÿ°¬ÿ°¨‹E¬ÿ°¬ÿ°¨èÌ&ƒÄÝ]è‹E¨ÿ°´ÿ°°‹E¬ÿ°´ÿ°°è£&ƒÄÝ]Ø‹E¨ÿ°Äÿ°À‹E¬ÿ°Äÿ°Àèz&ƒÄÝ]È‹E¨ÿ°Ìÿ°È‹E¬ÿ°Ìÿ°ÈèQ&ƒÄÝ]¸‹E¨ÿ° ÿ°‹E¬ÿ° ÿ°è(&ƒÄÝ]ð‹E¨ÿ°ÿ°‹E¬ÿ°ÿ°èÿ%ƒÄÝ]à‹E¨ÿ°ÿ°‹E¬ÿ°ÿ°èÖ%ƒÄÝ]ЋE¨ÿ°,ÿ°(‹E¬ÿ°,ÿ°(è­%ƒÄÝ]À‹E¨ÿ°4ÿ°0‹E¬ÿ°4ÿ°0è„%ƒÄÝ]°ƒì ÛEÝEÐÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝE°Þñd$øÝ$ÛEÝEÀÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝE¸Þñd$øÝ$ÛEÝEÈÞñd$øÝ$ÛEÝEøÞñd$øÝ$h ÿèã¼ÿÿƒÄ`¸ÉÃU‰åƒìƒì hèżÿÿƒÄÉÃU‰åƒìHƒìEÀPEÄPh§ûèÑÖÿÿƒÄ…Àu ¸é‹EÀÿ°üÿ°ø‹EÄÿ°üÿ°øèi$ƒÄÝ]ø‹EÀÿ°Lÿ°H‹EÄÿ°Lÿ°Hè@$ƒÄÝ]ð‹EÀÿ°œÿ°˜‹EÄÿ°œÿ°˜è$ƒÄÝ]è‹EÀÿ°¤ÿ° ‹EÄÿ°¤ÿ° èî#ƒÄÝ]à‹EÀÿ°<ÿ°8‹EÄÿ°<ÿ°8èÅ#ƒÄÝ]Ø‹EÀÿ°tÿ°p‹EÄÿ°tÿ°pèœ#ƒÄÝ]ЋEÀÿ°”ÿ°‹EÄÿ°”ÿ°ès#ƒÄÝ]ȃìÛEÝEÈÞñd$øÝ$ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$h`èÿºÿÿƒÄ@¸ÉÃU‰åƒìƒì h èáºÿÿƒÄÉÃU‰åƒìHƒìE¸PE¼Ph§ûèíÔÿÿƒÄ…Àu ¸éÕ‹E¸ÿ°4ÿ°0‹E¼ÿ°4ÿ°0è…"ƒÄÝ]à‹E¸ÿ°ÿ°‹E¼ÿ°ÿ°è\"ƒÄÝ]ø‹E¸ÿ°ÿ°‹E¼ÿ°ÿ°è3"ƒÄÝ]ð‹E¸ÿ°$ÿ° ‹E¼ÿ°$ÿ° è "ƒÄÝ]è‹E¸ÿ°dÿ°`‹E¼ÿ°dÿ°`èá!ƒÄÝ]È‹E¸ÿ°|ÿ°x‹E¼ÿ°|ÿ°xè¸!ƒÄÝ]À‹E¸ÿ°Tÿ°P‹E¼ÿ°Tÿ°Pè!ƒÄÝ]Ø‹E¸ÿ°\ÿ°X‹E¼ÿ°\ÿ°Xèf!ƒÄÝ]Ѓì ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEÀÞñd$øÝ$ÛEÝEÈÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$ÛEÝEàÞñd$øÝ$h`üèã¸ÿÿƒÄP¸ÉÃU‰åƒìƒì hèŸÿÿƒÄÉÃU‰åƒìÇEüÇEøƒìEðPEôPhýèÃÒÿÿƒÄ‰À…Àt‹Eô‹@ ‰Eü‹Eô‹@(‰Eøƒìÿuøÿuüh`èi¸ÿÿƒÄ¸ÉÃvU‰åƒìƒì h èI¸ÿÿƒÄÉÃU‰åƒì8ÇEÜÇE؃ìEÐPEÔPh§ûèGÒÿÿƒÄ…Àu ¸é+‰öƒìEÈPEÌPhýèÒÿÿƒÄ…Àt‹EÌ‹@0‰EÜ‹EÌ‹@8‰EØ‹EÐÿ°Œÿ°ˆ‹EÔÿ°Œÿ°ˆè¯ƒÄÝ]ø‹EÐÿ°¤ÿ° ‹EÔÿ°¤ÿ° è†ƒÄÝ]ð‹EÐÿ°œÿ°˜‹EÔÿ°œÿ°˜è]ƒÄÝ]è‹EÐÿ°”ÿ°‹EÔÿ°”ÿ°è4ƒÄÝ]àƒìÿuØÿuÜÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$hèç¶ÿÿƒÄ0¸ÉÃU‰åƒìƒì h@èɶÿÿƒÄÉÃU‰åƒìHƒìEÀPEÄPh§ûèÕÐÿÿƒÄ…Àu ¸é‹EÀÿ°¬ÿ°¨‹EÄÿ°¬ÿ°¨èmƒÄÝ]ø‹EÀÿ°,ÿ°(‹EÄÿ°,ÿ°(èDƒÄÝ]ð‹EÀÿ°´ÿ°°‹EÄÿ°´ÿ°°èƒÄÝ]è‹EÀÿ°ÿ°‹EÄÿ°ÿ°èòƒÄÝ]à‹EÀÿ°ÿ°‹EÄÿ°ÿ°èɃÄÝ]Ø‹EÀÿ°dÿ°`‹EÄÿ°dÿ°`è ƒÄÝ]ЋEÀÿ°lÿ°h‹EÄÿ°lÿ°hèwƒÄÝ]ȃìÛEÝEÈÞñd$øÝ$ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$h èµÿÿƒÄ@¸ÉÃU‰åƒìƒì hàèå´ÿÿƒÄÉÃU‰åƒìXƒìE°PE´Ph§ûèñÎÿÿƒÄ…Àu ¸é ‹E°ÿ°Üÿ°Ø‹E´ÿ°Üÿ°Øè‰ƒÄÝ]ø‹E°ÿ°äÿ°à‹E´ÿ°äÿ°àè`ƒÄÝ]ð‹E°ÿ°Tÿ°P‹E´ÿ°Tÿ°Pè7ƒÄÝ]è‹E°ÿ°¼ÿ°¸‹E´ÿ°¼ÿ°¸èƒÄÝ]à‹E°ÿ°4ÿ°0‹E´ÿ°4ÿ°0èåƒÄÝ]Ø‹E°ÿ°$ÿ° ‹E´ÿ°$ÿ° 較ÄÝ]ЋE°ÿ°tÿ°p‹E´ÿ°tÿ°p蓃ÄÝ]È‹E°ÿ°Ìÿ°È‹E´ÿ°Ìÿ°ÈèjƒÄÝ]À‹E°ÿ°Dÿ°@‹E´ÿ°Dÿ°@èAƒÄÝ]¸ƒìÛEÝE¸Þñd$øÝ$ÛEÝEÀÞñd$øÝ$ÛEÝEÈÞñd$øÝ$ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$ÛEÝEøÞñd$øÝ$h@诲ÿÿƒÄP¸ÉÃU‰åƒìƒì h€葲ÿÿƒÄÉÃU‰åVSƒì@‹Eƒ8~0‹Eƒx~'ƒì‹Eÿp‹Eÿ0hàè[²ÿÿƒÄ¸é}‰öƒìEÈPEÌPhõècÌÿÿƒÄ…Àu ¸éU‰öÇE¼ÇEÀÇEĉöƒ}Ä?‹MÌkEÄPI‹D D …Àu!‹MÌkEÄ`K‹D  D …Àuéßv‹MÌkEÄ`M‹D D …Àu鳉ö‹]ÌkEÄPI‹uÈkEÀˆPI‹D ‹T‰Ó3\13D1 Ø…Àu:‹]ÌkEÄ`K‹uÈkEÀˆ`K‹D‹T‰Ó3\13D1 Ø…ÀuéƒvÇEÀƒ}À?~ëp‹]ÌkEÄPI‹uÈkEÀˆPI‹D ‹T‰Ó3\13D1 Ø…Àu6‹]ÌkEÄ`K‹uÈkEÀˆ`K‹D‹T‰Ó3\13D1 Ø…Àuë ‰öÿEÀë‹v‹UÈkEÀ`Mÿtÿt ‹UÌkEÄ`Mÿtÿt 臃ÄÝ]ðÝEðÙîÙÉÚéßà€äE€ü@„{‹UÈkEÀpOÿtÿt‹UÌkEÄpOÿtÿtè=ƒÄÝ]è‹UÈkEÀpQÿtÿt ‹UÌkEÄpQÿtÿt è ƒÄÝ]Ø‹UÈkEÀ€Sÿtÿt‹UÌkEÄ€Sÿtÿtè׃ÄÝ]à‹UÈkEÀ€Uÿtÿt ‹UÌkEÄ€Uÿtÿt 褃ÄÝ]Ѓ}¼~ƒìÿuhÏùè¯ÿÿƒÄƒìÛEÝEðÞñd$øÝ$ÛEÝEÐÞñÝ`Þùd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñÝ`Þùd$øÝ$ÛEÝEèÞñd$øÝ$‹UÌkEÄ`Kÿtÿt‹UÌkEÄPIÿtÿt h èý®ÿÿƒÄ@ÿE¼ÿEÄÿEÀéàüÿÿƒ}¼uƒì hŽøèÙ®ÿÿƒÄ¸eø[^]ÉöU‰åƒìƒì h€èµ®ÿÿƒÄÉÃU‰åSì´‹U ‰ÐÁàÐ…Ð…ÐÅE‰…Tÿÿÿ‰Ð‹Tÿÿÿ™÷9‰…tÿÿÿƒì…lÿÿÿP…pÿÿÿPhÇèzÈÿÿƒÄ‰…dÿÿÿ‹…dÿÿÿ…Àu ¸éGÇ…hÿÿÿÇ…`ÿÿÿv‹…dÿÿÿ9…hÿÿÿ|éý‹…pÿÿÿ‹lÿÿÿ‹P ‹@‰Ó3Y 3A Ø…Àu(‹…pÿÿÿ‹lÿÿÿ‹P@‹@<‰Ó3Y@3A< Ø…Àué—v‹…pÿÿÿ‹•lÿÿÿf‹f;u‹…pÿÿÿ‹•lÿÿÿf‹@f;Buë!‹…lÿÿÿfƒ8…X‹…lÿÿÿfƒx…Gƒ½`ÿÿÿ~ƒìÿuhÏùèV­ÿÿƒÄ‹…lÿÿÿÿp ÿp‹…pÿÿÿÿp ÿpè.ƒÄÝ]È‹…lÿÿÿÿp@ÿp<‹…pÿÿÿÿp@ÿp<è ƒÄÝ]À‹…lÿÿÿÿp0ÿp,‹…pÿÿÿÿp0ÿp,èèƒÄÝ]¸‹…lÿÿÿÿpPÿpL‹…pÿÿÿÿpPÿpLèŃÄÝ]°ÝEÈÙîÙÉÚéßàöÄEtëÝE¸ÜuÈÝHÞùÝ]ØëÇEØÇEÜÝEÀÙîÙÉÚéßàöÄEtëÝE°ÜuÀÝHÞùÝ]ÐëÇEÐÇEÔ‹pÿÿÿ‹…pÿÿÿƒÀƒì Pè¬ÿÿƒÄ‰ÀPÿCŠˆE§¾E§kСÈf‹%f…À…w‹…lÿÿÿÿphÿpd‹…pÿÿÿÿphÿpdèòƒÄÝ]¨ÝE¨ÝPÞÉ‹…tÿÿÿºRPß,$XZÞùÝUðÝPÙÉÚéßàöÄEtëvÇEðÇEôY@ÝEÈÜEÀÝE¨ÞñÝ]àÝE¨ÙîÙÉÚéßàöÄEtë*‰ö‹…lÿÿÿÿppÿpl‹…pÿÿÿÿppÿplègƒÄÜu¨Ý]èëÇEèÇEìƒì ‹…pÿÿÿ·@P‹…pÿÿÿ·P‹…pÿÿÿƒÀPhÐ…xÿÿÿP賫ÿÿƒÄ ÿuäÿuàÿuìÿuèÿuÔÿuÐÝEÀÝXÞÉ‹…tÿÿÿºRPß,$XZÞùd$øÝ$ÿuÜÿuØÝEÈÝXÞÉ‹…tÿÿÿºRPß,$XZÞùd$øÝ$ÿuôÿuð…xÿÿÿPhà襪ÿÿƒÄ@ërƒìÿuÔÿuÐÝEÀÝXÞÉ‹…tÿÿÿºRPß,$XZÞùd$øÝ$ÿuÜÿuØÝEÈÝXÞÉ‹…tÿÿÿºRPß,$XZÞùd$øÝ$‹…pÿÿÿƒÀPh è1ªÿÿƒÄ0ÿ…`ÿÿÿÿ…hÿÿÿ…pÿÿÿƒt…lÿÿÿƒtéóûÿÿvƒ½`ÿÿÿuƒì hŽøèò©ÿÿƒÄ¸‹]üÉÃU‰åƒìƒì h`èÑ©ÿÿƒÄÉÃU‰åƒìXƒìEøPEüPh§èÝÃÿÿƒÄ…Àu ¸éé‹Eøÿ°œÿ°˜‹Eüÿ°œÿ°˜èuƒÄÝ]ð‹Eøÿ°|ÿ°x‹Eüÿ°|ÿ°xèLƒÄÝ]è‹Eøÿ°„ÿ°€‹Eüÿ°„ÿ°€è#ƒÄÝ]à‹Eøÿ°Œÿ°ˆ‹Eüÿ°Œÿ°ˆèúƒÄÝ]Ø‹Eøÿ°”ÿ°‹Eüÿ°”ÿ°èуÄÝ]ЋEøÿp$ÿp ‹Eüÿp$ÿp è´ƒÄÝ]È‹Eøÿpÿ0‹Eüÿpÿ0虃ÄÝ]À‹Eøÿp ÿp‹Eüÿp ÿpè|ƒÄÝ]¸‹Eøÿpÿp‹Eüÿpÿpè_ƒÄÝ]°‹Eøÿpÿp‹EüÿpÿpèBƒÄÝ]¨ƒì ÛEÝE¨Þñd$øÝ$ÛEÝE°Þñd$øÝ$ÛEÝE¸Þñd$øÝ$ÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEÈÞñd$øÝ$ÛEÝEðÞñd$øÝ$hÀè¿§ÿÿƒÄP¸ÉÃU‰åƒìƒì hè¡§ÿÿƒÄÉÃU‰åƒì8ƒìEøPEüPh§è­ÁÿÿƒÄ…Àu ¸é‹Eøÿ°¬ÿ°¨‹Eüÿ°¬ÿ°¨èEƒÄÝ]ð‹Eøÿ°´ÿ°°‹Eüÿ°´ÿ°°èƒÄÝ]è‹Eøÿ°¼ÿ°¸‹Eüÿ°¼ÿ°¸èóƒÄÝ]à‹Eøÿp,ÿp(‹Eüÿp,ÿp(èÖƒÄÝ]Ø‹Eøÿp4ÿp0‹Eüÿp4ÿp0蹃ÄÝ]ЃìÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$h`èc¦ÿÿƒÄ0¸ÉÃU‰åƒìƒì h èE¦ÿÿƒÄÉÃU‰åƒìxƒìEøPEüPh§èQÀÿÿƒÄ…Àu ¸éÇ‹Eøÿ°ÿ°‹Eüÿ°ÿ°èé ƒÄÝ]ð‹Eøÿ° ÿ°‹Eüÿ° ÿ°èÀ ƒÄÝ]è‹Eøÿ°ÿ°‹Eüÿ°ÿ°è— ƒÄÝ]à‹Eøÿ°ÿ°‹Eüÿ°ÿ°èn ƒÄÝ]Ø‹Eøÿ°$ÿ° ‹Eüÿ°$ÿ° èE ƒÄÝ]ЋEøÿ°,ÿ°(‹Eüÿ°,ÿ°(è ƒÄÝ]È‹Eøÿ°4ÿ°0‹Eüÿ°4ÿ°0èó ƒÄÝ]À‹Eøÿ°<ÿ°8‹Eüÿ°<ÿ°8èÊ ƒÄÝ]¸‹Eøÿ°Dÿ°@‹Eüÿ°Dÿ°@è¡ ƒÄÝ]°‹Eøÿ°Lÿ°H‹Eüÿ°Lÿ°Hèx ƒÄÝ]¨‹Eøÿ°\ÿ°X‹Eüÿ°\ÿ°XèO ƒÄÝ] ÝEðÜEèÙîÙÉÚéßàöÄEtëÝEðÝHÞÉÝEðÜEèÞùÝ]˜ëÇE˜ÇEœƒìÛEÝE Þñd$øÝ$‹Eüÿ°Tÿ°P‹Eü‹d‹€`‰E‰U”ƒ}”y EÿƒU”‹E‹U”¬Ð Áú RPÛEÝE¨ÞñÝPÞùd$øÝ$ÛEÝE°ÞñÝPÞùd$øÝ$ÛEÝEØÞñd$øÝ$ÿuœÿu˜ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$hèU£ÿÿƒÄP¸ÉÃvU‰åƒìƒì h`è5£ÿÿƒÄÉÃU‰åƒì(ÇEäƒìEøPEüPh§è:½ÿÿƒÄ…Àu ¸éF‹Eøÿ°œÿ°˜‹Eüÿ°œÿ°˜èÑ ƒÄÝ]ð‹Eøÿp$ÿp ‹Eüÿp$ÿp è´ ƒÄÝ]èÝEðÙîÙÉÚéßàöÄEtëbƒìÿuÿuäh§ÿuôÿuð‹EøÀP‹EüÀPèÅƒÄ Eäƒìÿuÿuäh­ÿuôÿuð‹Eø`P‹Eü`Pè”ƒÄ EäÝEèÙîÙÉÚéßàöÄEtë^ƒìÿuÿuäh³ÿuìÿuè‹EøƒÀ8P‹EüƒÀ8PèUƒÄ Eäƒìÿuÿuäh¹ÿuìÿuè‹EøØP‹EüØPè$ƒÄ Eäƒ}äuƒì hŽøè¿¡ÿÿƒÄ¸ÉÃU‰åSƒì$‹E‹U‰Eð‰UôÇEäÇEèÇEìƒ}ä~ëHkUä‹E ÿtÿ4kUä‹Eÿtÿ4è[ ƒÄÝ]Ø‹MØ‹]܉ȉÚÝEè‰E؉UÜÝEØÞÁÝ]èÿEäë±ÝEèÙîÙÉÚéßà€äE€ü@tëv¸éʉöƒ}tƒìÿu hÏùè¡ÿÿƒÄƒìÿuƒì‹E ˆÿpÿ0‹Eˆÿpÿ0èσÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒè€ÿpÿ0‹Eƒè€ÿpÿ0膃ÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì‹E ƒÀxÿpÿ0‹EƒÀxÿpÿ0è=ƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒÀpÿpÿ0‹EƒÀpÿpÿ0èôƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì‹E ƒÀhÿpÿ0‹EƒÀhÿpÿ0諃ÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒÀ`ÿpÿ0‹EƒÀ`ÿpÿ0èbƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì‹E ƒÀXÿpÿ0‹EƒÀXÿpÿ0èƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒÀPÿpÿ0‹EƒÀPÿpÿ0èЃÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì‹E ƒÀHÿpÿ0‹EƒÀHÿpÿ0臃ÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒÀ@ÿpÿ0‹EƒÀ@ÿpÿ0è>ƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì‹E ƒÀ8ÿpÿ0‹EƒÀ8ÿpÿ0èõƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒÀ0ÿpÿ0‹EƒÀ0ÿpÿ0謃ÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì‹E ƒÀ(ÿpÿ0‹EƒÀ(ÿpÿ0ècƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒÀ ÿpÿ0‹EƒÀ ÿpÿ0èƒÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì‹E ƒÀÿpÿ0‹EƒÀÿpÿ0èуÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$ƒì ‹E ƒÀÿpÿ0‹EƒÀÿpÿ0舃ÄÝ]Ø‹MØ‹]܉ȉÚÝ8‰E؉UÜÝEØÞÉÜuèd$øÝ$hÀè[œÿÿĸ‹]üÉÃvU‰åƒìƒì h@è5œÿÿƒÄÉÃU‰åƒì(ƒ=Œu%ƒ=€tƒì h‡è œÿÿƒÄ¸éñ‰öƒìEðPEôPh£è¶ÿÿƒÄ‰Eè‹Eè…Àu ¸éÃÿ ÇEìÇEä‹Eè9Eì|é‡vƒ= t‹Eô‹UðÝÜ"ÝUøÙîÙÉÚéßàöÄEtéƒ}ä~ƒìÿuhÏùèn›ÿÿƒÄƒì‹EôƒÀ0P‹Eô‹UðÝ@ÜbÜuød$øÝ$‹Eô‹UðÝ@ÜbÜuød$øÝ$‹Eô‹UðÝ@ÜbÛEÞùd$øÝ$‹Eô‹UðÝÜ"ÛEÞùd$øÝ$hÀèýšÿÿƒÄ0ÿEäƒ= t"‹Eô‹UðÝ@ÜbÝUøÙîÙÉÚéßàöÄEtéƒ}ä~ƒìÿuhÏùè¶šÿÿƒÄƒì‹EôƒÀ0P‹Eô‹UðÝ@(Üb(Üuød$øÝ$‹Eô‹UðÝ@ Üb Üuød$øÝ$‹Eô‹UðÝ@(Üb(ÛEÞùd$øÝ$‹Eô‹UðÝ@ÜbÛEÞùd$øÝ$h èCšÿÿƒÄ0ÿEäÿEìEôƒPEðƒPémþÿÿƒ}äuƒì hŽøèšÿÿƒÄ¸ÉÃvU‰åƒìƒì h@ èõ™ÿÿƒÄÉÃU‰åƒìHƒ=Œu%ƒ=€tƒì h‡ èË™ÿÿƒÄ¸é±‰öƒìEøPEüPh£ èÓ³ÿÿƒÄ‰EÈ‹EÈ…Àu ¸éƒÿ$ÇEÌÇEÄ‹EÈ9EÌ|éGv‹Eü‹UøÝÜ"Ý]ð‹Eü‹UøÝ@ÜbÝ]è‹Eü‹UøÝ@ÜbÝ]à‹Eü‹UøÝ@ÜbÝ]Ø‹Eü‹UøÝ@ Üb Ý]Ѓ=$tbÝEðÙîÙÉÚéßà€äE€ô@uOÝEèÙîÙÉÚéßà€äE€ô@u<ÝEàÙîÙÉÚéßà€äE€ô@u)ÝEØÙîÙÉÚéßà€äE€ô@uÝEÐÙîÙÉÚéßà€äE€ô@uë|ƒ}Ä~ƒìÿuhÏù袘ÿÿƒÄ‹EüƒÀ(PÛEÝEÐÞñd$øÝ$ÛEÝEØÞñd$øÝ$ÛEÝEàÞñd$øÝ$ÛEÝEèÞñd$øÝ$ÛEÝEðÞñd$øÝ$hÀ èC˜ÿÿƒÄ0ÿEÄÿEÌEüƒHEøƒHé­þÿÿƒ}Äuƒì hŽøè˜ÿÿƒÄ¸ÉÃvU‰åƒì‹E‹U ‰Eø‰Uü‹E‹U‰Eð‰Uô‹Eø‹Uü‰Eè‰Uì‹Uì;Uô|‹Eì;Eô‹Uè;Uðr ßmøßmðÞéëßmøÝè ÞÁßmðÞéÉÉöU‰åSƒì¡,»,ƒøÿtv¼'ƒëÿЋƒøÿuôX[]ÃU‰åƒì‰ì]öU‰åSRè[Ãr"vèW˜ÿÿ‹]üÉÃ$Id: atsar.c,v 1.9 2004/07/08 12:52:38 gerlof Exp $mallocAs:e:i:f:n:Sprogramming-failure: ambiguous flag '%c' 1%d/var/log/atsar/atsa%02dopen %s: open pipeatsadc/usr/local/bin/atsadcexec atsadcforkopen input-fileNot a proper statistics file Statistics file with incompatible format %d.%d.%d%s %s not supported %s linux restarts ¼‹                                  <Œô‹  tŒ    ÄŒ    Œread input-fileusage: %s [-flags] t [n] or %s [-flags] [-s hh:mm] [-e hh:mm] [-i sec] [-n day# | -f file] flags: -A all flags -S time-stamp for every output-line -%c %s (default flag) %s %s %s %s %s %s %02d:%02d:%02d%02d/%02d/%04d%d:%d$Id: funcdef.c,v 1.24 2004/07/08 12:52:51 gerlof Exp $cpu %%usr %%sys %%nice %%idle _cpu_ cpu %%usr %%nice %%sys %%irq %%softirq %%wait %%idle _cpu_ genstatall %4.0lf %4.0lf %5.0lf %5.0lf all %4.0lf %5.0lf %6.0lf %4.0lf %8.0lf %8.0lf %5.0lf %s %3d %5.0lf %5.0lf %6.0lf %6.0lf %s %3d %4.0lf %5.0lf %6.0lf %4.0lf %8.0lf %8.0lf %5.0lf Y@pswch/s runq nrproc lavg1 lavg5 avg15 _procload_ %7.0lf %4lld %6lld %5.2lf %5.2lf %5.2lf memtot memfree buffers cached slabmem swptot swpfree _mem_ memstat%5lldM %6lldM %6lldM %7lldM %7lldM %5lldM %6lldM pagein/s pageout/s swapin/s swapout/s fork/s _page_ tabstat%9.2lf %9.2lf %9.2lf %9.2lf %7.2lf cpu iq%02d _intr/s_all %4.0lf %s %3lu superb-sz inode-sz file-sz dquota-sz flock-sz _curmax_ %4lld/%-4lld %5lld/%-5lld %4lld/%-4lld %5lld/%-5lld %4lld/%-4lld port xmit/s recv/s frer/s parer/s ovrun/s brk/s _tty_ ttystat%s %4X %8.2lf %8.2lf %8.3lf %8.3lf %8.3lf %8.3lf inpck/s otpck/s inbyt/s otbyt/s incmpr/s otcmpr/s inmcst/s iface _if_ ifstat%7.1lf %7.1lf %7.0lf %7.0lf %8.2lf %8.2lf %8.2lf %s inerr/s oterr/s coll/s indrop/s otdrop/s infram/s otcarr/s iface _if_ %7.2lf %7.2lf %6.2lf %8.2lf %8.2lf %8.2lf %8.2lf %s inrecv/s outreq/s indeliver/s forward/s reasmok/s fragcreat/s _ip_ netstat%8.1lf %8.1lf %11.1lf %9.1lf %9.1lf %11.1lf in: dsc/s hder/s ader/s unkp/s ratim/s rfail/s ot: dsc/s nort/s _ip_ %5.1lf %6.1lf %6.1lf %6.1lf %7.1lf %7.1lf %5.1lf %6.1lf insegs/s otsegs/s actopen/s pasopen/s nowopen socknow sockmax _tcp_ sockstat%8.1lf %8.1lf %9.1lf %9.1lf %7lld %7ld %7ld inerr/s retrans/s attfail/s estabreset/s outreset/s _tcp_ %7.1lf %9.1lf %9.1lf %12.1lf %10.1lf indgram/s otdgram/s inerr/s noport/s socknow sockmax _udp_ %9.1lf %9.1lf %7.2lf %9.2lf %7ld %7ld intot/s outtot/s inecho/s inerep/s otecho/s oterep/s _icmp_ %7.1lf %8.1lf %8.2lf %8.2lf %8.2lf %8.2lf ierr/s isq/s ird/s idu/s ite/s oerr/s osq/s ord/s odu/s ote/s _icmp_ %6.2lf %5.2lf %5.2lf %5.2lf %5.2lf %6.2lf %5.2lf %5.2lf %5.2lf %5.2lf inrecv/s outreq/s inmc/s outmc/s indeliv/s reasmok/s fragcre/s _ip6_ %8.1lf %8.1lf %6.1lf %7.1lf %9.1lf %9.1lf %9.1lf in: dsc/s hder/s ader/s unkp/s ratim/s rfail/s ot: dsc/s nort/s _ip6_ socknow sockmax _tcp6_ %7ld %7ld indgram/s otdgram/s inerr/s noport/s socknow sockmax _udp6_ %9.1lf %9.1lf %7.2lf %9.2lf %7ld %7ld intot/s outtot/s inerr/s innsol/s innadv/s otnsol/s otnadv/s _icmp6_ %7.1lf %8.1lf %7.2lf %8.2lf %8.2lf %8.2lf %8.2lf iecho/s ierep/s oerep/s idu/s odu/s ird/s ord/s ite/s ote/s _icmp6_ %7.2lf %7.2lf %7.2lf %5.2lf %5.2lf %5.2lf %5.2lf %5.2lf %5.2lf device read/s rdKb/s write/s wrKb/s rdwr/s _disk_ counter-values in kernel version %d.%d:disk%03lld-%03lld %10.2lf %6.2lf %7.2lf %6.2lf %10.2lf @partition busy read/s Kbyt/r write/s Kbyt/w avque avserv _part_ partstat%s (%d-%d)%-11s %3.0lf%% %7.2lf %6.1lf %9.2lf %6.1lf %6.2lf %6.2lf ms %-11s %7.2lf %6.1lf %9.2lf %6.1lf @Y@@@svrpc/s clrpc/s sudp/s stcp/s stcon/s cudp/s ctcp/s ctcon/s _nfs_ nfsstat%7.2lf %7.2lf %8.2lf %6.2lf %7.3lf %8.2lf %6.2lf %7.3lf svbadfmt/s svbadauth/s svbadclnt/s clretrans/s clauthrefresh/s _nfs_ %10.3lf %11.3lf %11.3lf %11.3lf %15.3lf rchit/s rcmiss/s %%hit fhstal/s iord/s iowr/s racach thr tlast/s _nfs_ %7.2lf %8.2lf %4.0lf %8.3lf %5.1lfK %5.1lfK %5lldK %3lld %7.3lf Y@@gat sat lku rln rd wrc wr cre rm rnm lnk sln mkd rmd rdd fst _rpc_ %srv2%srv3%cln2%cln3%3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %s Y@xfers/s kbytes/s avg_time avg_kbytes direct name _ftp_ interval for ftp-counters:ftpstat%7.3lf %8.2lf %8.2lf s %11.3lf output %s %7.3lf %8.2lf %8.2lf s %11.3lf input %s head/s get/s put/s post/s delete/s name _http_ interval for http-counters:httpstat%7.3lf %7.3lf %7.3lf %7.3lf %8.3lf %s ðAhttp trafficftp trafficnfs-rpc (%calls)nfs (server)nfs (errors)nfs (general)icmp v6 (per type)icmp v6 (general)udp v6tcp v6 (general)ip v6 (errors)ip v6 (general)icmp v4 (per type)icmp v4 (general)udp v4tcp v4 (errors)tcp v4 (general)ip v4 (errors)ip v4 (general)net-interf (errors)net-interf (general)tty activitykernel-resourcesinterruptspaging & swappingmemory & swapdisk-partitiondiskprocess loadcpu8uä£(¤ä P ª$ª× d€Õ˜ÕÒ D\ÙtÙà r« «µ p°¬Ȭ£ ID®è¯˜ và±ø±‡ y˜²°²z lp¶ˆ¶e LpºˆºQ wd¿|¿< WÔÀìÀ( t¨ T Ä8Äÿ U”ŬÅ÷ mÇ,Çâ MÀÈØÈÌ gLËdË· G0ÍHÍ£ jLÏdÏŽ hÈÏàφ kHÑ`Ñq K,ÓDÓ[ N@ÞXÞF Epàˆà2 VÌáäá RÜäôä FÜëôëý Hî4îð $Id: version.c,v 1.7 2002/09/03 12:09:21 root Exp root $ ì† Àð(D„‚ . <à †Ü…0þÿÿo¼…ÿÿÿoðÿÿor…ÿÿÿÿÿÿÿÿd‡*‡:‡J‡Z‡j‡z‡Їš‡ª‡º‡ʇÚ‡ê‡ú‡ ˆˆ*ˆ:ˆJˆZˆjˆzˆŠˆšˆªˆºˆʈ¢ƒd‰d‰9<H€r€Œ€»€ó€0€€Ò€ý€,€V€€™€´€Õ€€1€V€€€©‚¢¢ ‚cV$‚ï[L‚b‚y‚¢¢¢‚ØÆ€Ç¢Ú€ ñ€!€"€#3€%K€&a€1x€2€3§€4À€5Ø€6ñ€8 €9"€;B€=X€>n€?„€@š€A±€BÉ€C߀Dö€E €F$€G;€HT€Ii€NÏ€Qç€R€S€T9€UU€Vm€X…€[Ÿ€^·€eÍ€hç€l €q €r5 €uP €vm €yˆ €z¥ €}½ €€Ö €ƒñ €„ €‡& €Š@ ‚Ë”t ‚Fœ €¢Ò € €#V €Y €4u €< €Cú €F €S© €Zç €^€Ù€lù€tM€yn€ö€†4€Œ¢¢‚ L€b€8¢w‚Š‚b‚¢œ‚¢É€K¢¢L€€#Ô‚ç‚5ÁLÂwŠ‚œ¢Âø€×€€H8€Kg€L˜€UË€Z€^?€aw€b¯€\€€û€r€­¢¢–€5 €7!€89€9S€:¢m d‰init.c/usr/src/build/87998-i386/BUILD/glibc-2.2.5/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/87998-i386/BUILD/glibc-2.2.5/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.got.bss.stab.stabstr.comment.noteô€ô# 1((Ü7 ‚@?D„D.Gÿÿÿor…rHTþÿÿo¼…¼ c Ü…Ü0l  † à uì†ìp‡Ð{àˆààgÀðÀp‡àðàp  ` •``’Ÿdd’Ȩ,,“¯44“¶<<“€»ÀÀ“ ÀÀ“¤ Æd›ƒÏ紸؟¶ ?·Þ¨¼@ K èÉ‚ô€(‚D„r…¼…Ü… † ì† ‡ àˆ Àð àð`d,4<Àñÿñÿ‰ "‰ 2ñÿ0‰ =A4O [0‰ q`„‰ Ô˜ ‰ ¤Ð‰ ¯½,2ñÿ€ð Ë€ð á0¤°ð ¯`î8û`ñÿÀð ñÿà‰ ñ4ì"ñÿä£  ô7,8€E€MU_is }$‡ñÿ|ð  9‘ °™dÏa £Ìá ¬°¬ µȬ| ¾ø± Æä£B Îäáõ ×tÙË àp¶ çð^ ðP öìÀ£ ÿd\î ‡•"8$‡.M4‡%_D‡:pàðwÄ K }€Õ „T‡ù–ÔÀ Ÿd‡-²t‡2ÂØÈs ͤžw ÔLË Ý`ç¬Åg ñd÷@Þ ÿì† `ÑË „‡p"|¿U +pæi 3”‡:C« K˜² Sôë% [4îå d¤‡%"‡¡ë ”Å ™LÏ £ÀµÄÇP¢“ ÏhÕlÜpè´‡.úˆàC ćDàˆ Ô‡3+ä‡=tF¨Âu Nà± V8žk ^ô‡¯pw8Ä[ pà ‡\Ù x–DÓ; ¡€ B §pº ®|·HÑ ÂÈÏ ÌHÍ Õü¡R ݼñÿéà‰W îÜä ö Ä þŸ €˜Õ ˆÓ3,Ç“ >0Í GXÞ O„Xˆ^ « fˆªx ƒ$ˆ2•Àð ›4ˆ@¬Dˆ'¾Üë ÆdËË Ï,Ó Úôä{ âÇ íŒôTˆ@(¤â dˆåtˆ+,„ˆ->¼ñÿE<[Àñÿ`”ˆCrȇˆºÙ ޤˆ:d¿ ¦Ì¸äðÇ, S Ñ ÙD®¡ á´ˆ-ôàÏg þ(à è¯ö   '$ªã /ÐAˆ¶å HĈ@X ª `°²¾ hÀÈ s init.cinitfini.cgcc2_compiled.call_gmon_startcrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__atsar.crcsidlastused.0funcdef.cfirstcall.0headerline.1usedirqusedmaxsampcnt.2sampcnt.3sampcnt.4sampcnt.5sampcnt.6version.cfilehdrtcpv6linenfssheadpageheadpagelinetablinecpuheadnfsslinepartlineifheadsubtractosrelIPv4line_DYNAMICponcehttphead__register_frame_info@@GLIBC_2.0localtime@@GLIBC_2.0strcmp@@GLIBC_2.0close@@GLIBC_2.0_fp_hwmkdatdkheadperror@@GLIBC_2.0IPv4headfprintf@@GLIBC_2.0fork@@GLIBC_2.0ICMPv4linereadinipv6headdaynumberudpv4lineSflagnfshead_initicmpv6linemalloc@@GLIBC_2.0ipv4lineprirpcspipe@@GLIBC_2.0memheadttyheadftplinehttpline__deregister_frame_info@@GLIBC_2.0convtimudpv4headtcpv6headstdout@@GLIBC_2.0stderr@@GLIBC_2.0getcsetcsampnflagsnewintervalsetbuf@@GLIBC_2.0NFSlinetime@@GLIBC_2.0_startgetopt@@GLIBC_2.0execlp@@GLIBC_2.0oncelisttcplinetabheadreadsetstrlen@@GLIBC_2.0funcntTCPlineNFSheadpartheadconceICMPv6linemktimIFheadnsamplesicmpv6headudpv6headIPv6linedaysecs__bss_startmainrpcheadTCPheadprusageintervaldkline__libc_start_main@@GLIBC_2.0icmpv4lineIPv6headnfslinesamplistpsampmemlinestrcat@@GLIBC_2.0data_startprintf@@GLIBC_2.0_finilseek@@GLIBC_2.0memcpy@@GLIBC_2.0ftpheadipv6lineICMPv6headrpclineicmpv4headinfileopen@@GLIBC_2.0cpulineexit@@GLIBC_2.0atoi@@GLIBC_2.0sscanf@@GLIBC_2.0_edata_GLOBAL_OFFSET_TABLE__endmemset@@GLIBC_2.0__ctype_b@@GLIBC_2.0IFlinedup@@GLIBC_2.0ipv4headoptarg@@GLIBC_2.0_IO_stdin_usedprintheadtcpheadintheadsprintf@@GLIBC_2.0udpv6lineifdfuncdef__data_startintlinenumsampprclineoptind@@GLIBC_2.0iflineread@@GLIBC_2.0prcheadttylineICMPv4head__gmon_start__atsar-1.7/atsar/Makefile0000644000175000017500000000032010073242162016071 0ustar mstonemstone00000000000000all: atsar atsar: atsar.o funcdef.o cc -o atsar atsar.o funcdef.o ../version.o atsar.o: ../include/atsar.h funcdef.o: ../include/atsar.h ../include/includes.h ../include/linuxstat.h clean: rm *.o atsar-1.7/atsar/atsar.c0000444000175000017500000005202410073242162015715 0ustar mstonemstone00000000000000#include "includes.h" /* ** System Activity Report ** ** The program 'atsar' offers a number of options to report about ** the statistics of important system-resources. ** The program has been designed to operate as a framework to which ** new options can be added very easily (table-driven). It cooperates ** with the data-collector program 'atsadc' in a similar way as the ** standard 'sar' operates with 'sadc'. ** ================================================================ ** Author: Gerlof Langeveld - AT Computing, Nijmegen, Holland ** E-mail: gerlof@ATComputing.nl ** Date: Januar 1995 ** LINUX-port: Februar 1999 ** ** $Log: atsar.c,v $ ** Revision 1.9 2004/07/08 12:52:38 gerlof ** Adapted for kernel version 2.6. ** ** Revision 1.8 2001/03/14 11:09:44 gerlof ** Minor bug-fix. ** ** Revision 1.7 2001/03/12 14:56:24 gerlof ** Support flag -S to get time-stamp for every counter-line. ** ** Revision 1.6 2000/11/07 09:21:58 gerlof ** Minor bug-fixes. ** ** Revision 1.5 2000/04/25 08:48:28 gerlof ** Disable stdout-buffering to enable output-processing via pipes. ** ** Revision 1.4 1999/09/16 09:25:57 gerlof ** Minor changes for port to Alpha-platform. ** ** Revision 1.3 1999/08/26 06:53:02 gerlof ** Code-cleanup and adding new parameter when calling printline-function. ** ** Revision 1.2 1999/05/18 08:30:34 gerlof ** Back-port from version 2.2 to 2.0. ** ** Revision 1.1 1999/05/05 11:40:03 gerlof ** Initial revision ** ** ** ** This program is free software; you can redistribute it and/or modify it ** under the terms of the GNU General Public License as published by the ** Free Software Foundation; either version 2, or (at your option) any ** later version. ** ** This program is distributed in the hope that it will be useful, but ** WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details. */ static const char rcsid[] = "$Id: atsar.c,v 1.9 2004/07/08 12:52:38 gerlof Exp $"; #define EQUAL 0 #define SECSDAY 86400 /* ** definition table for all flags and corresponding functions */ extern struct funcdef funcdef[]; extern int funcnt; /* ** values of the command-line arguments */ char *infile; /* input file-name */ int ifd; /* input file-descriptor */ char *interval; /* argument: number-of-seconds interval */ char *nsamples; /* argument: number-of-intervals */ char numsamp[32]; /* nsamples+1 as argument for atsadc */ int nflags; /* number of options required */ int newinterval; /* argument: overruling interval with -i*/ int daynumber; /* day-number specified i.s.o. full name*/ char Sflag; /* every output-line needs time-stamp? */ extern char *optarg; extern int optind, opterr; /* ** list of counters which are available */ struct filehdr filehdr; struct osrel osrel; struct countdef *oncelist; /* read-once counter definition */ char *ponce, *conce; /* read-once counter values */ struct countdef *samplist; /* per-sample counter definition */ char *psamp, *csamp; /* per-sample counter values */ /* ** function prototypes */ int readset(struct samphdr *, void *); int readin(int, char *, int); void prusage(char *); void printhead(struct utsname *, time_t); void mktim(time_t, char *); void mkdat(time_t, char *); int convtim(char *, unsigned int *); int daysecs(time_t); int main(int argc, char *argv[]) { register int i; int c; unsigned int stoffset, offset; char asbuf[100]; char *flaglist; unsigned int starttime = 0, endtime=SECSDAY-1; struct samphdr *phead, *chead; char *oncenames, *sampnames; /* ** prepare verification of command-line options */ if ( (flaglist = (char *) malloc(funcnt+12)) == NULL) { perror("malloc"); exit(5); } for (i=0; i < funcnt; i++) /* gather function flags */ *(flaglist+i) = funcdef[i].flag; *(flaglist+i) = 0; /* set terminator */ strcat(flaglist, "As:e:i:f:n:S"); /* add standard flags */ /* ** verify if a flag has been used twice in this list (programming ** error) */ for (c=strlen(flaglist)-1; c; c--) { if ( *(flaglist+c) == ':' ) continue; for (i=0; i 0 ) { if ( !isdigit(*argv[optind]) ) prusage(argv[0]); interval = argv[optind++]; if ( atoi(interval) <= 0 ) prusage(argv[0]); if ( (argc - optind) > 0 ) /* still more args ? */ { if ( !isdigit(*argv[optind]) ) prusage(argv[0]); nsamples = argv[optind]; } else nsamples = "1"; /* set default to 1 sample */ /* add one to samples for the data-collector 'atsadc' */ i = atoi(nsamples); i++; sprintf(numsamp, "%d", i); nsamples = numsamp; } /* ** undo buffering for stdout to enable processing of the output ** via e.g. a pipe */ setbuf(stdout, NULL); /* ** open the counter input file */ if (!infile) { /* ** no input file defined; check if on-the-fly statistics ** wanted or statistics from default file (= statistics ** of today untill this very moment) */ if (interval == NULL && nsamples == NULL) { struct tm *tt; time_t curtime; if (daynumber) /* specific day wanted */ { sprintf(asbuf, ATOUTF, daynumber); } else { /* today wanted */ curtime = time(0); tt = localtime(&curtime); sprintf(asbuf, ATOUTF, tt->tm_mday); } if ( (ifd = open(asbuf, O_RDONLY)) == -1) { fprintf(stderr, "open %s: ", asbuf); perror(""); exit(1); } } else { int fds[2]; /* ** on-the-fly analysis; activate backend ** data-collector */ if ( pipe(fds) == -1 ) { perror("open pipe"); exit(1); } switch ( fork() ) { case 0: /* child */ (void) close(1); (void) dup(fds[1]); (void) close(fds[0]); (void) close(fds[1]); execlp(ATEXEC, "atsadc", interval, nsamples, 0); perror("exec atsadc"); exit(1); case -1: perror("fork"); exit(1); default: /* parent */ ifd = fds[0]; (void) close(fds[1]); } } } else { /* ** input-file specified on command-line: open it */ if ( (ifd = open(infile, O_RDONLY)) ==-1) { perror("open input-file"); exit(1); } } /* ** input-file (or pipe) is opened; start reading ...... ** ** first read the general file-header and check if ** it really concerns a statistics file */ if ( readin(ifd, (char *)&filehdr, sizeof(filehdr)) == 0 ) exit(0); if (filehdr.magic != ATMAGIC) { fprintf(stderr, "Not a proper statistics file\n"); exit(6); } if (filehdr.hdrsize != sizeof(struct filehdr)) { fprintf(stderr, "Statistics file with incompatible format\n"); exit(6); } /* ** determine kernel-version of measured system */ sscanf(filehdr.utsinfo.release, "%d.%d.%d", &(osrel.rel), &(osrel.vers), &(osrel.sub)); /* ** read list of variable names for once-counters */ if ( (oncelist = (struct countdef *) malloc(filehdr.oncecnt*sizeof(struct countdef)))==NULL) { perror("malloc"); exit(5); } if ( readin(ifd, (char *)oncelist, filehdr.oncecnt*sizeof(struct countdef))==0) exit(0); /* ** read list of names for once-counters */ if ( (oncenames = (char *) malloc(filehdr.oncenames)) == NULL) { perror("malloc"); exit(5); } if ( readin(ifd, (char *)oncenames, filehdr.oncenames) == 0) exit(0); /* ** correct offsets for names in counter-list to real pointers ** change counter-sizes into offsets for counters */ for (i=0, offset=0; i < filehdr.oncecnt; i++) { int soffset; soffset = offset; offset += (oncelist+i)->ksize * (oncelist+i)->kinst; (oncelist+i)->kname += (unsigned long) oncenames; (oncelist+i)->ksize = soffset; } /* ** read list of variable names for samp-counters */ if ( (samplist = (struct countdef *) malloc(filehdr.sampcnt*sizeof(struct countdef)))==NULL) { perror("malloc"); exit(5); } if ( readin(ifd, (char *)samplist, filehdr.sampcnt*sizeof(struct countdef)) ==0) exit(0); /* ** read list of names for samp-counters */ if ( (sampnames = (char *) malloc(filehdr.sampnames)) == NULL) { perror("malloc"); exit(5); } if ( readin(ifd, (char *)sampnames, filehdr.sampnames) == 0) exit(0); /* ** correct offsets for names in counter-list to real pointers ** change counter-sizes into offsets for counters */ for (i=0, offset=0; i < filehdr.sampcnt; i++) { int soffset; soffset = offset; offset += (samplist+i)->ksize * (samplist+i)->kinst; (samplist+i)->kname += (unsigned long) sampnames; (samplist+i)->ksize = soffset; } /* ** read the once-counter values into 'current' and take care ** that the 'previous' counters are zero */ if ( (ponce = (char *) malloc(filehdr.oncevars)) == NULL) { perror("malloc"); exit(5); } memset(ponce, 0, filehdr.oncevars); if ( (conce = (char *) malloc(filehdr.oncevars)) == NULL) { perror("malloc"); exit(5); } if ( readin(ifd, (char *)conce, filehdr.oncevars) == 0) exit(0); /* ** create two areas for the sample-counters and header: ** one to hold the previous sample and one to hold the current; ** the previous sample will be filled with the start-counters */ if ( (phead = (struct samphdr *) malloc(sizeof(struct samphdr)))==NULL) { perror("malloc"); exit(5); } if ( (chead = (struct samphdr *) malloc(sizeof(struct samphdr)))==NULL) { perror("malloc"); exit(5); } if ( (psamp = (char *) malloc(filehdr.sampvars)) == NULL) { perror("malloc"); exit(5); } if ( (csamp = (char *) malloc(filehdr.sampvars)) == NULL) { perror("malloc"); exit(5); } /* ** INPUT FROM PIPE */ if (!infile && interval != NULL) { char timbuf[16], ptimbuf[16]; /* ** read the initial sample header and counters */ if ( !readset(phead, psamp) ) exit(0); /* ** print header info */ printhead(&filehdr.utsinfo, phead->curtim); /* ** print header line if only one flag required */ if (nflags == 1) { mktim(phead->curtim, ptimbuf); for (i=0; i < funcnt; i++) { if (funcdef[i].active) { printf("%s ", ptimbuf); (funcdef[i].prihead)(&osrel); break; } } } /* ** print sample-sets untill EOF */ while ( readset(chead, csamp) ) { time_t deltasec, deltatic; char valid; char *hsamp; struct samphdr *hhead; /* ** calculate the interval of the last sample */ deltasec = chead->curtim - phead->curtim; deltatic = chead->curlbolt - phead->curlbolt; if (!deltasec) deltasec = 1; /* be sure: no divide 0 */ /* ** print all counter lines */ mktim(chead->curtim, timbuf); mktim(phead->curtim, ptimbuf); for (i=0; i < funcnt; i++) { if (! funcdef[i].active) continue; if (nflags > 1) { printf("\n%s ", ptimbuf); (funcdef[i].prihead)(&osrel); } printf("%s ", timbuf); valid = (funcdef[i].priline) ( deltasec, deltatic, filehdr.hertz, filehdr.numcpu, &osrel, Sflag ? timbuf : " "); if ( !valid ) /* no counters */ { printf(" not supported\n"); funcdef[i].active = 0; } } if (nflags > 1) printf("\n"); /* ** make the current counters 'previous' */ hhead = chead; chead = phead; phead = hhead; hsamp = csamp; csamp = psamp; psamp = hsamp; } (void) close(ifd); exit(0); } /* ** INPUT FROM FILE ** ** read the counter-sets untill the correct start-time is found ** and remember the start-offset to be able to make ** several passes (one per flag) because this is a file and NO pipe */ do { stoffset = lseek(ifd, 0, SEEK_CUR); if ( !readset(phead, psamp) ) exit(0); } while ( starttime > daysecs(phead->curtim) ); /* ** print header line of total report containing the date and ** system-info */ printhead(&filehdr.utsinfo, phead->curtim); /* ** handle every defined flag */ for (i=0; i < funcnt; i++) { if (funcdef[i].active) { char timbuf[16], valid; /* ** rewind input file */ (void) lseek(ifd, stoffset, SEEK_SET); /* ** read initial sample header and counters */ if ( !readset(phead, psamp) ) exit(0); if (phead->cntsize == 0) memset(psamp, 0, filehdr.sampvars); /* ** print header line */ mktim(phead->curtim, timbuf); printf("%s ", timbuf); (funcdef[i].prihead)(&osrel); /* ** print sample-sets untill EOF */ while ( readset(chead, csamp) ) { time_t deltasec, deltatic; char *hsamp; struct samphdr *hhead; /* ** check if specified endtime exceeded */ if (endtime < daysecs(chead->curtim) ) break; mktim(chead->curtim, timbuf); /* ** if special reboot record found, ** print a restart line */ if (chead->cntsize == 0) { printf("%s linux restarts\n", timbuf); hhead = chead; chead = phead; phead = hhead; memset(psamp, 0, filehdr.sampvars); continue; } /* ** check if overruling interval time is ** already exceeded (as specified with ** the -i flag) */ if (newinterval) { if ( (chead->curtim+2) < (phead->curtim+newinterval) ) continue; } /* ** calculate the interval of the last sample */ deltasec = chead->curtim - phead->curtim; deltatic = chead->curlbolt - phead->curlbolt; if (!deltasec) deltasec = 1; /* no divide 0 */ /* ** print counter line */ printf("%s ", timbuf); valid = (funcdef[i].priline) ( deltasec, deltatic, filehdr.hertz, filehdr.numcpu, &osrel, Sflag ? timbuf : " "); if ( !valid ) /* cannot find counters */ { printf(" not supported\n"); funcdef[i].active = 0; break; } /* ** make the current counters 'previous' */ hhead = chead; chead = phead; phead = hhead; hsamp = csamp; csamp = psamp; psamp = hsamp; } printf("\n"); } } (void) close(ifd); exit(0); } /* ** Read one set of sample header-data and counter-data. ** ** Return-value: 0 - End-Of-File ** 1 - Success */ int readset(struct samphdr *hdr, void *cnt) { /* ** read header info */ if ( readin(ifd, (char *)hdr, sizeof(struct samphdr)) == 0) return(0); /* EOF */ if (hdr->cntsize == 0) return(1); /* ** read counter contents */ if ( readin(ifd, (char *)cnt, hdr->cntsize) == 0) return(0); /* EOF */ return(1); } /* ** Read the input-file: ** This is a separate function because the input-file can be a pipe ** and it is likely that the blocks which are transferred exceed the ** atomicity-factor of the target system; this means that a block which ** is written as e.g. 6 Kbytes may arrive in pieces and has to be reassembled ** here. ** ** Return-value: 0 - End-Of-File ** 1 - Success */ int readin(int fd, char *buf, int sz) { register int n; while (sz) /* as long as the requested buffer is not filled */ { if ( (n = read(fd, buf, sz)) == -1 ) { perror("read input-file"); exit(1); } if (n == 0) return(0); /* EOF reached */ sz -= n; buf += n; } return(1); } /* ** Print the usage-string and terminate abnormally. */ void prusage(char *pname) { register int i; fprintf(stderr, "usage: %s [-flags] t [n] or\n", pname); fprintf(stderr, " %s [-flags] [-s hh:mm] [-e hh:mm] [-i sec] " "[-n day# | -f file]\n", pname); fprintf(stderr, "flags:\n"); fprintf(stderr, "\t-A\tall flags\n"); fprintf(stderr, "\t-S\ttime-stamp for every output-line\n"); for (i=0; i < funcnt; i++) { fprintf(stderr, "\t-%c\t%s", funcdef[i].flag, funcdef[i].about); if (!i) /* first entry ? */ fprintf(stderr, " (default flag)\n"); else fprintf(stderr, "\n"); } exit(1); } /* ** Print header-information about measured machine and ** the measurement-date */ void printhead(struct utsname *uname, time_t mtime) { char datstring[16]; mkdat(mtime, datstring); printf("\n%s %s %s %s %s %s\n\n", uname->sysname, uname->nodename, uname->release, uname->version, uname->machine, datstring); } /* ** Generate ascii time in format hh:mm:ss */ void mktim(time_t itime, char *otime) { struct tm *tt; tt = localtime(&itime); sprintf(otime, "%02d:%02d:%02d", tt->tm_hour, tt->tm_min, tt->tm_sec); } /* ** Generate ascii date in format mm/dd/yyyy */ void mkdat(time_t idate, char *odate) { struct tm *tt; tt = localtime(&idate); sprintf(odate, "%02d/%02d/%04d", tt->tm_mon+1, tt->tm_mday, tt->tm_year+1900); } /* ** Convert a hh:mm string into a number of seconds since 00:00 ** ** Return-value: 0 - Wrong input-format ** 1 - Success */ int convtim(char *itim, unsigned int *otim) { register int i; int hours, minutes; /* ** check string syntax */ for (i=0; *(itim+i) != 0; i++) if ( !isdigit(*(itim+i)) && *(itim+i) != ':' ) return(0); sscanf(itim, "%d:%d", &hours, &minutes); if ( hours < 0 || hours > 24 || minutes < 0 || minutes > 60 ) return(0); *otim = (hours * 3600) + (minutes * 60); if ( *otim >= SECSDAY) *otim = SECSDAY-1; return(1); } /* ** Return number of seconds since midnight according local clock time ** ** Return-value: Number of seconds */ int daysecs(time_t itime) { struct tm *tt; tt = localtime(&itime); return( (tt->tm_hour*3600) + (tt->tm_min*60) ); } /* ** Get counterset ** ============== ** To be called by the print-line functions to obtain a pointer ** to the current counter-values and a pointer to the previous counter-values. ** ** Input: name of the counter(struct) which is required ** location to store 'current' pointer ** location to store 'previous' pointer ** ** Output: 'current' pointer ** 'previous' pointer ** ** Returns: number of counter-instances ** this implies that 0 instances is FALSE (so not found) ** ** The given name is always searched in the per-sample counters first. */ int getcset(char *name, void **curptr, void **preptr) { register int i; static int lastused; /* assume that only one set used */ /* ** check if the last used name is requested again (performance optim) */ if ( strcmp(name, (samplist+lastused)->kname) == EQUAL ) { *curptr = csamp + (samplist+lastused)->ksize; *preptr = psamp + (samplist+lastused)->ksize; return( (samplist+lastused)->kinst); } /* ** linear search through per-sample list ** note: if the list of names in future will be very long, ** it might be interesting to implement some hash-list here .... ** however profiling has proven that only 1% of the CPU-time ** consumption of a total 'atsar -A' run is spent in the ** 'getcset' function, which is not worth to implement hashing */ for (i=0; i < filehdr.sampcnt; i++) { if ( strcmp(name, (samplist+i)->kname) == EQUAL ) { *curptr = csamp + (samplist+i)->ksize; *preptr = psamp + (samplist+i)->ksize; lastused= i; return((samplist+i)->kinst); } } /* ** linear search through read-once list ** note: if the list of names in future will be very long, ** it might be interesting to implement some hash-list here... ** however profiling has proven that only 1% of the CPU-time ** consumption of a total 'atsar -A' run is spent in the ** 'getcset' function, which is not worth implementing hashing */ for (i=0; i < filehdr.oncecnt; i++) { if ( strcmp(name, (oncelist+i)->kname) == EQUAL ) { *curptr = conce + (oncelist+i)->ksize; *preptr = ponce; return((oncelist+i)->kinst); } } return(0); /* not found at all */ } atsar-1.7/atsar/funcdef.c0000444000175000017500000015002610073242162016216 0ustar mstonemstone00000000000000#include "includes.h" /* ** This file contains the functions which print the header and a ** statistics line for every defined flag. ** ** New functions (to print new statistics) can be added to this file ** as follows: ** 1. Add a new entry to the function definition table at the end ** of this file (funcdef[]). ** 2. Add the defined 'printhead' and 'printline' functions. ** ** If certain counters are required which are not yet collected, the ** fetchdef.c file of the data-collector should be updated as well. ** ** Function 'printhead': ** Called with one parameter: ** 1. Structure holding the release- and version-info of kernel. ** ** Return value: not relevant. ** ** This function is assumed to print the header of a statistics ** list behind the time-stamp, which has already been printed ** before the 'printhead' function is called. So the header may contain ** 70 characters maximum. ** ** Function 'printline': ** Called with six parameters: ** 1. Number of seconds passed since the previous sample. ** 2. Number of clock-ticks passed since the previous sample. ** 3. Number of clock-ticks per second for the target-system. ** 4. Number of processors available in the target-system ** 5. Structure holding the release- and version-info of kernel. ** 6. Time-stamp string to be used when printing more than one line. ** ** Return value: true (1) in case the relevant counters were ** succesfully read and printed ** false (0) in case the relevant counters could ** not be obtained; the reaction on ** this return-value is that a message ** is printed and the 'printline' is ** never called again. ** ** The 'printline' function can get the required counters via the ** function 'getcset' (see file atsar.c). ** --------------------------------------------------------------------- ** Author: Gerlof Langeveld - AT Computing, Nijmegen, Holland ** E-mail: gerlof@ATComputing.nl ** Date: Januar 1995 ** LINUX-port: Februar 1999 ** ** $Log: funcdef.c,v $ ** Revision 1.24 2004/07/08 12:52:51 gerlof ** Adapted for kernel version 2.6. ** Support of new disk-names. ** ** Revision 1.23 2001/03/19 12:53:56 gerlof ** Counter-correction after overflow of unsigned long's. ** ** Revision 1.22 2001/03/16 09:38:17 gerlof ** Reimplement FTP/HTTP counters. ** ** Revision 1.21 2001/03/14 14:03:00 root ** Changed numbers of disks 2.2 ** ** Revision 1.20 2001/03/14 11:08:58 gerlof ** TTY statistics added. ** ** Revision 1.19 2001/03/12 14:57:18 gerlof ** IPv6 counters. ** ** Revision 1.18 2001/02/26 15:34:14 gerlof ** Show load-averages in the default atsar-output. ** ** Revision 1.17 2001/02/26 15:27:11 gerlof ** Use counters of type 'double' i.s.o. long for HTTP and FTP. ** ** Revision 1.16 2000/11/07 09:21:10 gerlof ** Support for modified per-partition statistics. ** ** Revision 1.15 1999/10/18 12:57:56 gerlof ** Separate counters for FTP-input and -output. ** ** Revision 1.14 1999/10/18 08:58:53 gerlof ** Error-message when using -F or -H flag in combination with an interval. ** ** Revision 1.13 1999/09/23 14:38:47 gerlof ** Function partline did not return 1 for success ** ** Revision 1.12 1999/09/22 11:30:47 gerlof ** modified headerline of page/swap counters (-p) ** ** Revision 1.11 1999/09/17 11:26:14 gerlof ** Changed header-line of disk-output: sect i.s.o. blk ** ** Revision 1.10 1999/09/17 09:38:08 gerlof ** Extra counter (kbytes/s) in output of _ftp_ ** ** Revision 1.9 1999/09/16 09:26:33 gerlof ** Minor code-restyling. ** ** Revision 1.8 1999/08/31 09:33:36 gerlof ** Implement support for WEB-servers. ** Porting to version 2.0. ** ** Revision 1.7 1999/08/30 13:54:29 gerlof ** Code-cleanup rpc-call statistics ** ** Revision 1.6 1999/08/27 14:05:04 gerlof ** Added NFS-statistics. ** ** Revision 1.5 1999/08/26 06:55:23 gerlof ** Code-cleanup, new calling-parameter for print-line functions (number of ** cpu's), new flags -W, -T and -L introduced and reorganized output per flag. ** ** Revision 1.4 1999/05/18 08:31:03 gerlof ** Back-port from version 2.2 to 2.0. ** ** Revision 1.3 1999/05/11 09:08:08 gerlof ** Add support for disk-partition statistics and kernel-tables. ** ** Revision 1.2 1999/05/10 10:12:24 gerlof ** New flag -v and changed output for flag -p. ** ** Revision 1.1 1999/05/05 11:40:11 gerlof ** Initial revision ** ** This program is free software; you can redistribute it and/or modify it ** under the terms of the GNU General Public License as published by the ** Free Software Foundation; either version 2, or (at your option) any ** later version. ** ** This program is distributed in the hope that it will be useful, but ** WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details. */ static const char rcsid[] = "$Id: funcdef.c,v 1.24 2004/07/08 12:52:51 gerlof Exp $"; /* ** Function proto-types */ int getcset(char *, void **, void **); double subtract(count_t, count_t); int prirpcs(count_t [], count_t [], double, char *, int, char *); /* ** CPU statistics */ void cpuhead(struct osrel *osr) { if (osr->rel < 2 || osr->vers < 6) printf("cpu %%usr %%sys %%nice %%idle " " _cpu_\n"); else printf("cpu %%usr %%nice %%sys %%irq %%softirq " "%%wait %%idle _cpu_\n"); } int cpuline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { register int i; double usrdelta, sysdelta, nicdelta, idldelta, waidelta, irqdelta, sirdelta; struct genstat *cur, *pre; /* ** obtain the general statistics */ if ( !getcset("genstat", (void **)&cur, (void **)&pre) ) return(0); /* ** print overall statistics */ usrdelta = subtract(cur->cpu_user, pre->cpu_user) / ncpu; sysdelta = subtract(cur->cpu_system, pre->cpu_system) / ncpu; nicdelta = subtract(cur->cpu_nice, pre->cpu_nice) / ncpu; waidelta = subtract(cur->cpu_wait, pre->cpu_wait) / ncpu; irqdelta = subtract(cur->cpu_irq, pre->cpu_irq) / ncpu; sirdelta = subtract(cur->cpu_sirq, pre->cpu_sirq) / ncpu; idldelta = deltatic - (usrdelta+sysdelta+nicdelta+waidelta+irqdelta+sirdelta); if (idldelta < 0.0) idldelta = 0.0; if (osr->rel < 2 || osr->vers < 6) printf("all %4.0lf %4.0lf %5.0lf %5.0lf\n", usrdelta * 100.0 / deltatic, sysdelta * 100.0 / deltatic, nicdelta * 100.0 / deltatic, idldelta * 100.0 / deltatic); else printf("all %4.0lf %5.0lf %6.0lf %4.0lf %8.0lf %8.0lf %5.0lf\n", usrdelta * 100.0 / deltatic, nicdelta * 100.0 / deltatic, sysdelta * 100.0 / deltatic, irqdelta * 100.0 / deltatic, sirdelta * 100.0 / deltatic, waidelta * 100.0 / deltatic, idldelta * 100.0 / deltatic); /* ** print per-cpu statistics */ if (ncpu > 1) { for (i=0; i < ncpu; i++) { usrdelta = subtract(cur->per_cpu_user[i], pre->per_cpu_user[i]); sysdelta = subtract(cur->per_cpu_system[i], pre->per_cpu_system[i]); nicdelta = subtract(cur->per_cpu_nice[i], pre->per_cpu_nice[i]); waidelta = subtract(cur->per_cpu_wait[i], pre->per_cpu_wait[i]); irqdelta = subtract(cur->per_cpu_irq[i], pre->per_cpu_irq[i]); sirdelta = subtract(cur->per_cpu_sirq[i], pre->per_cpu_sirq[i]); idldelta = deltatic - (usrdelta+sysdelta+nicdelta+ waidelta+irqdelta+sirdelta); if (idldelta < 0.0) idldelta = 0.0; if (osr->rel < 2 || osr->vers < 6) printf("%s %3d %5.0lf %5.0lf %6.0lf %6.0lf\n", tstamp, i, usrdelta * 100.0 / deltatic, sysdelta * 100.0 / deltatic, nicdelta * 100.0 / deltatic, idldelta * 100.0 / deltatic); else printf("%s %3d %4.0lf %5.0lf %6.0lf %4.0lf " "%8.0lf %8.0lf %5.0lf\n", tstamp, i, usrdelta * 100.0 / deltatic, nicdelta * 100.0 / deltatic, sysdelta * 100.0 / deltatic, irqdelta * 100.0 / deltatic, sirdelta * 100.0 / deltatic, waidelta * 100.0 / deltatic, idldelta * 100.0 / deltatic); } } return(1); } /* ** Process statistics */ void prchead(struct osrel *osr) { printf("pswch/s runq nrproc lavg1 lavg5 avg15" " _procload_\n"); } int prcline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { struct genstat *cur, *pre; /* ** obtain the general statistics */ if ( !getcset("genstat", (void **)&cur, (void **)&pre) ) return(0); /* ** print overall statistics */ printf("%7.0lf %4lld %6lld %5.2lf %5.2lf %5.2lf\n", subtract(cur->context_swtch, pre->context_swtch) / deltasec, cur->nrrun, cur->nrproc, cur->loadavg1, cur->loadavg5, cur->loadavg15); return(1); } /* ** Memory- & swap-usage */ void memhead(struct osrel *osr) { printf("memtot memfree buffers cached slabmem" " swptot swpfree _mem_\n" ); } int memline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { struct memstat *mcur, *mpre; if ( !getcset("memstat", (void **)&mcur, (void **)&mpre) ) return(0); printf("%5lldM %6lldM %6lldM %7lldM %7lldM %5lldM %6lldM\n", mcur->memtot/1024, mcur->memfree/1024, mcur->membuf/1024, mcur->memcache/1024, mcur->memslab/1024, mcur->swptot/1024, mcur->swpfree/1024); return(1); } /* ** Paging & swapping statistics */ void pagehead(struct osrel *osr) { printf(" pagein/s pageout/s swapin/s swapout/s " " fork/s _page_\n"); } int pageline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double si, so, pi, po, fo; struct genstat *scur, *spre; struct tabstat *pcur, *ppre; /* ** obtain the general statistics */ if ( !getcset("genstat", (void **)&scur, (void **)&spre) ) return(0); pi = subtract(scur->pgpgin, spre->pgpgin); po = subtract(scur->pgpgout, spre->pgpgout); si = subtract(scur->pswpin, spre->pswpin); so = subtract(scur->pswpout, spre->pswpout); if (getcset("tabstat", (void **)&pcur, (void **)&ppre) ) fo = subtract(pcur->totforks, ppre->totforks); else fo = 0; printf("%9.2lf %9.2lf %9.2lf %9.2lf %7.2lf\n", pi / deltasec, po / deltasec, si / deltasec, so / deltasec, fo / deltasec); return(1); } /* ** Interrupt statistics */ static char usedirq[16]; static int usedmax; void inthead(struct osrel *osr) { register unsigned long i; static char firstcall = 1, headerline[128]; struct genstat *cur, *pre; /* ** generate the header-line dynamically, only showing headers ** for the irq's which have been used so far */ if (firstcall) { /* ** obtain the general statistics */ if ( !getcset("genstat", (void **)&cur, (void **)&pre) ) { memcpy(headerline, "\n", 2); printf(headerline); firstcall = 0; return; } for (i=0; i < MAXIRQ; i++) { if (pre->irqs[i]) { usedirq[usedmax] = i; if ( ++usedmax >= 16 ) break; } } memcpy(headerline, "cpu ", 5); for (i=0; i < usedmax; i++) { char tmpbuf[16]; sprintf(tmpbuf, "iq%02d ", usedirq[i]); strcat(headerline, tmpbuf); } /* ** try if a right-aligned marker still fits */ i = strlen(headerline); if (i < 61) { memset(&headerline[i], ' ', 61-i); strcat(headerline, "_intr/s_"); } strcat(headerline, "\n"); firstcall = 0; } printf(headerline); } int intline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { register unsigned long i, j; struct genstat *cur, *pre; /* ** obtain the general statistics */ if ( !getcset("genstat", (void **)&cur, (void **)&pre) ) return(0); /* ** print overall interrupts */ printf("all "); for (i=0; i < usedmax; i++) { printf("%4.0lf ", subtract(cur->irqs[(int)usedirq[i]], pre->irqs[(int)usedirq[i]]) / deltasec); } printf("\n"); /* ** print per-cpu interrupts */ if (ncpu > 1) { for (i=0; i < ncpu; i++) { printf("%s %3lu ", tstamp, i); for (j=0; j < usedmax; j++) { printf("%4.0lf ", subtract( cur->per_irqs[i][(int)usedirq[j]], pre->per_irqs[i][(int)usedirq[j]])/ deltasec); } printf("\n"); } } return(1); } /* ** Kernel-parameter statistics */ void tabhead(struct osrel *osr) { printf("superb-sz inode-sz file-sz dquota-sz" " flock-sz _curmax_\n" ); } int tabline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { struct tabstat *pcur, *ppre; if ( !getcset("tabstat", (void **)&pcur, (void **)&ppre) ) return(0); printf("%4lld/%-4lld %5lld/%-5lld %4lld/%-4lld %5lld/%-5lld " "%4lld/%-4lld\n", pcur->cursuper, pcur->maxsuper, pcur->curinode, pcur->maxinode, pcur->curfiles, pcur->maxfiles, pcur->curdquot, pcur->maxdquot, pcur->curlocks, pcur->maxlocks); return(1); } /* ** Kernel-parameter statistics */ void ttyhead(struct osrel *osr) { printf("port xmit/s recv/s frer/s parer/s ovrun/s brk/s" " _tty_\n"); } int ttyline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { static int sampcnt = 0; register int nr, i, j, lines; struct serialstat *tcur, *tpre; double tx, rx, fe, pe, br, oe; if ( !( nr = getcset("ttystat", (void **)&tcur, (void **)&tpre)) ) return(0); sampcnt++; for (i=j=lines=0; i < nr && j < nr && (tcur+i)->port; i++, j++) { /* ** note that only the active tty's are registered; ** when a new tty has been used for the first time in ** the last sample, the position of the existing statistics ** in the table might have been shifted related to the ** previous sample */ if ( (tcur+i)->port != (tpre+j)->port) { /* resync */ for (j=0; j < nr && (tpre+j)->port; j++) { if ( (tcur+i)->port == (tpre+j)->port) break; } } tx = subtract((tcur+i)->tx, (tpre+j)->tx); rx = subtract((tcur+i)->rx, (tpre+j)->rx); fe = subtract((tcur+i)->fe, (tpre+j)->fe); pe = subtract((tcur+i)->pe, (tpre+j)->pe); oe = subtract((tcur+i)->oe, (tpre+j)->oe); br = subtract((tcur+i)->br, (tpre+j)->br); if (sampcnt > 1 && tx+rx+fe+pe+oe+br == 0.0) continue; lines++; if (lines > 1) printf("%s ", tstamp); printf("%4X %8.2lf %8.2lf %8.3lf %8.3lf %8.3lf %8.3lf\n", (int)(tcur+i)->port, tx / deltasec, rx / deltasec, fe / deltasec, pe / deltasec, oe / deltasec, br / deltasec); } if (lines == 0) printf("\n"); return(1); } /* ** Network-interface statistics */ void ifhead(struct osrel *osr) { printf("inpck/s otpck/s inbyt/s otbyt/s " "incmpr/s otcmpr/s inmcst/s iface _if_\n" ); } int ifline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { static int sampcnt = 0; register int i, j, nvalid, nrif; double ip, op, ib, ob, ic, oc, im; struct ifstat *cur, *pre; if ( !(nrif = getcset("ifstat", (void **)&cur, (void **)&pre)) ) return(0); sampcnt++; for (i=0, j=0, nvalid=0; i < nrif; i++, j=i) /* per interface */ { if ( (cur+i)->name[0] == 0 ) break; /* always returns 'true', even if */ /* no entries are found in this */ /* interval */ /* ** note that if-layers may be added or deleted since the ** previous sample; this also means that the position ** of the existing statistics in this table might have ** been shifted since the previous sample */ if ( strcmp( (cur+i)->name, (pre+j)->name) != 0) { /* resync */ for (j=0; j < nrif; j++) { if ( (pre+j)->name[0] == 0 ) break; /* not known in previous samp */ if ( strcmp( (cur+i)->name, (pre+j)->name) ==0) break; } sampcnt = 1; /* show the new total list of if's */ } ip = subtract((cur+i)->rpack, (pre+j)->rpack); op = subtract((cur+i)->spack, (pre+j)->spack); ib = subtract((cur+i)->rbyte, (pre+j)->rbyte); ob = subtract((cur+i)->sbyte, (pre+j)->sbyte); ic = subtract((cur+i)->rcompr, (pre+j)->rcompr); oc = subtract((cur+i)->scompr, (pre+j)->scompr); im = subtract((cur+i)->rmultic, (pre+j)->rmultic); /* ** print for the first sample all interfaces which ** are found; afterwards print only the interfaces ** which were really active during the interval */ if (sampcnt > 1 && !ip && !op) continue; if (nvalid) printf("%s ", tstamp); nvalid++; printf("%7.1lf %7.1lf %7.0lf %7.0lf %8.2lf %8.2lf %8.2lf %s\n", ip / deltasec, op / deltasec, ib / deltasec, ob / deltasec, ic / deltasec, oc / deltasec, im / deltasec, (cur+i)->name); } if (nvalid == 0) printf("\n"); return(1); } void IFhead(struct osrel *osr) { printf("inerr/s oterr/s coll/s indrop/s otdrop/s " "infram/s otcarr/s iface _if_\n" ); } int IFline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { static int sampcnt = 0; register int i, j, nvalid, nrif; double ip, op, ie, oe, co, id, od, ifi, ofi, ifr, oca; struct ifstat *cur, *pre; if ( !(nrif = getcset("ifstat", (void **)&cur, (void **)&pre)) ) return(0); sampcnt++; for (i=0, j=0, nvalid=0; i < nrif; i++, j=i) /* per interface */ { if ( (cur+i)->name[0] == 0 ) break; /* always returns 'true', even if */ /* no entries are found in this */ /* interval */ /* ** note that if-layers may be added or deleted since the ** previous sample; this also means that the position ** of the existing statistics in this table might have ** been shifted since the previous sample */ if ( strcmp( (cur+i)->name, (pre+j)->name) != 0) { /* resync */ for (j=0; j < nrif; j++) { if ( (pre+j)->name[0] == 0 ) break; /* not known in previous samp */ if ( strcmp( (cur+i)->name, (pre+j)->name) ==0) break; } sampcnt = 1; /* show the new total list of if's */ } ip = subtract((cur+i)->rpack, (pre+j)->rpack); op = subtract((cur+i)->spack, (pre+j)->spack); ie = subtract((cur+i)->rerrs, (pre+j)->rerrs); oe = subtract((cur+i)->serrs, (pre+j)->serrs); co = subtract((cur+i)->scollis, (pre+j)->scollis); id = subtract((cur+i)->rdrop, (pre+j)->rdrop); od = subtract((cur+i)->sdrop, (pre+j)->sdrop); ifi = subtract((cur+i)->rfifo, (pre+j)->rfifo); ofi = subtract((cur+i)->sfifo, (pre+j)->sfifo); ifr = subtract((cur+i)->rframe, (pre+j)->rframe); oca = subtract((cur+i)->scarrier, (pre+j)->scarrier); /* ** print for the first sample all interfaces which ** are found; afterwards print only the interfaces ** which were really active during the interval */ if (sampcnt > 1 && !ip && !op) continue; if (nvalid) printf("%s ", tstamp); nvalid++; printf("%7.2lf %7.2lf %6.2lf %8.2lf %8.2lf %8.2lf %8.2lf %s\n", ie / deltasec, oe / deltasec, co / deltasec, id / deltasec, od / deltasec, ifr / deltasec, oca / deltasec, (cur+i)->name); } if (nvalid == 0) printf("\n"); return(1); } /* ** IP version 4 statistics */ void ipv4head(struct osrel *osr) { printf("inrecv/s outreq/s indeliver/s forward/s " "reasmok/s fragcreat/s _ip_\n" ); } int ipv4line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double ir, or, id, fw, ro, fc; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); ir = subtract(cur->ip.IpInReceives, pre->ip.IpInReceives); or = subtract(cur->ip.IpOutRequests, pre->ip.IpOutRequests); id = subtract(cur->ip.IpInDelivers, pre->ip.IpInDelivers); fw = subtract(cur->ip.IpForwarding, pre->ip.IpForwarding); ro = subtract(cur->ip.IpReasmOKs, pre->ip.IpReasmOKs); fc = subtract(cur->ip.IpFragCreates, pre->ip.IpFragCreates); printf("%8.1lf %8.1lf %11.1lf %9.1lf %9.1lf %11.1lf\n", ir / deltasec, or / deltasec, id / deltasec, fw / deltasec, ro / deltasec, fc / deltasec); return(1); } void IPv4head(struct osrel *osr) { printf("in: dsc/s hder/s ader/s unkp/s ratim/s rfail/s " "ot: dsc/s nort/s _ip_\n" ); } int IPv4line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double ihe, iae, iup, ids, ods, onr, rto, rfl; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); ids = subtract(cur->ip.IpInDiscards, pre->ip.IpInDiscards); ihe = subtract(cur->ip.IpInHdrErrors, pre->ip.IpInHdrErrors); iae = subtract(cur->ip.IpInAddrErrors, pre->ip.IpInAddrErrors); iup = subtract(cur->ip.IpInUnknownProtos, pre->ip.IpInUnknownProtos); rto = subtract(cur->ip.IpReasmTimeout, pre->ip.IpReasmTimeout); rfl = subtract(cur->ip.IpReasmFails, pre->ip.IpReasmFails); ods = subtract(cur->ip.IpOutDiscards, pre->ip.IpOutDiscards); onr = subtract(cur->ip.IpOutNoRoutes, pre->ip.IpOutNoRoutes); printf(" %5.1lf %6.1lf %6.1lf %6.1lf %7.1lf %7.1lf " " %5.1lf %6.1lf\n", ids / deltasec, ihe / deltasec, iae / deltasec, iup / deltasec, rto / deltasec, rfl / deltasec, ods / deltasec, onr / deltasec); return(1); } /* ** TCP version 4 statistics */ void tcphead(struct osrel *osr) { printf("insegs/s otsegs/s actopen/s pasopen/s " "nowopen socknow sockmax _tcp_\n" ); } int tcpline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double is, os, ao, po; unsigned long sn=0, sm=0; struct netstat *cur, *pre; struct sockstat *scur, *spre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); if ( getcset("sockstat", (void **)&scur, (void **)&spre) ) { sn = scur->tcpnow; sm = scur->tcpmax; } is = subtract(cur->tcp.TcpInSegs, pre->tcp.TcpInSegs); os = subtract(cur->tcp.TcpOutSegs, pre->tcp.TcpOutSegs); ao = subtract(cur->tcp.TcpActiveOpens, pre->tcp.TcpActiveOpens); po = subtract(cur->tcp.TcpPassiveOpens, pre->tcp.TcpPassiveOpens); printf("%8.1lf %8.1lf %9.1lf %9.1lf %7lld %7ld %7ld\n", is / deltasec, os / deltasec, ao / deltasec, po / deltasec, cur->tcp.TcpCurrEstab, sn, sm); return(1); } void TCPhead(struct osrel *osr) { printf("inerr/s retrans/s attfail/s " "estabreset/s outreset/s _tcp_\n"); } int TCPline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double ie, rs, af, er, or; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); ie = subtract(cur->tcp.TcpInErrs, pre->tcp.TcpInErrs); rs = subtract(cur->tcp.TcpRetransSegs, pre->tcp.TcpRetransSegs); af = subtract(cur->tcp.TcpAttemptFails, pre->tcp.TcpAttemptFails); er = subtract(cur->tcp.TcpEstabResets, pre->tcp.TcpEstabResets); or = subtract(cur->tcp.TcpOutRsts, pre->tcp.TcpOutRsts); printf("%7.1lf %9.1lf %9.1lf %12.1lf %10.1lf\n", ie / deltasec, rs / deltasec, af / deltasec, er / deltasec, or / deltasec); return(1); } /* ** UDP version 4 statistics */ void udpv4head(struct osrel *osr) { printf("indgram/s otdgram/s inerr/s noport/s " " socknow sockmax _udp_\n" ); } int udpv4line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double id, ot, ie, np; unsigned long sn=0, sm=0; struct netstat *cur, *pre; struct sockstat *scur, *spre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); if ( getcset("sockstat", (void **)&scur, (void **)&spre) ) { sn = scur->udpnow; sm = scur->udpmax; } id = subtract(cur->udp.UdpInDatagrams, pre->udp.UdpInDatagrams); ot = subtract(cur->udp.UdpOutDatagrams, pre->udp.UdpOutDatagrams); ie = subtract(cur->udp.UdpInErrors, pre->udp.UdpInErrors); np = subtract(cur->udp.UdpNoPorts, pre->udp.UdpNoPorts); printf("%9.1lf %9.1lf %7.2lf %9.2lf %7ld %7ld\n", id / deltasec, ot / deltasec, ie / deltasec, np / deltasec, sn, sm); return(1); } /* ** ICMP version 4 statistics */ void icmpv4head(struct osrel *osr) { printf("intot/s outtot/s inecho/s inerep/s " "otecho/s oterep/s _icmp_\n" ); } int icmpv4line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double it, ot, ie, oe, ir, or; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); it = subtract(cur->icmp.IcmpInMsgs, pre->icmp.IcmpInMsgs); ot = subtract(cur->icmp.IcmpOutMsgs, pre->icmp.IcmpOutMsgs); ie = subtract(cur->icmp.IcmpInEchos, pre->icmp.IcmpInEchos); oe = subtract(cur->icmp.IcmpOutEchos, pre->icmp.IcmpOutEchos); ir = subtract(cur->icmp.IcmpInEchoReps, pre->icmp.IcmpInEchoReps); or = subtract(cur->icmp.IcmpOutEchoReps, pre->icmp.IcmpOutEchoReps); printf("%7.1lf %8.1lf %8.2lf %8.2lf %8.2lf %8.2lf\n", it / deltasec, ot / deltasec, ie / deltasec, ir / deltasec, oe / deltasec, or / deltasec); return(1); } void ICMPv4head(struct osrel *osr) { printf("ierr/s isq/s ird/s idu/s ite/s " "oerr/s osq/s ord/s odu/s ote/s _icmp_\n"); } int ICMPv4line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double ier, oer, idu, odu, ite, ote, isq, osq, ird, ord; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); ier = subtract(cur->icmp.IcmpInErrors, pre->icmp.IcmpInErrors); idu = subtract(cur->icmp.IcmpInDestUnreachs, pre->icmp.IcmpInDestUnreachs); ite = subtract(cur->icmp.IcmpInTimeExcds, pre->icmp.IcmpInTimeExcds); isq = subtract(cur->icmp.IcmpInSrcQuenchs, pre->icmp.IcmpInSrcQuenchs); ird = subtract(cur->icmp.IcmpInRedirects, pre->icmp.IcmpInRedirects); oer = subtract(cur->icmp.IcmpOutErrors, pre->icmp.IcmpOutErrors); odu = subtract(cur->icmp.IcmpOutDestUnreachs, pre->icmp.IcmpOutDestUnreachs); ote = subtract(cur->icmp.IcmpOutTimeExcds, pre->icmp.IcmpOutTimeExcds); osq = subtract(cur->icmp.IcmpOutSrcQuenchs, pre->icmp.IcmpOutSrcQuenchs); ord = subtract(cur->icmp.IcmpOutRedirects, pre->icmp.IcmpOutRedirects); printf("%6.2lf %5.2lf %5.2lf %5.2lf %5.2lf " "%6.2lf %5.2lf %5.2lf %5.2lf %5.2lf\n", ier / deltasec, isq / deltasec, ird / deltasec, idu / deltasec, ite / deltasec, oer / deltasec, osq / deltasec, ord / deltasec, odu / deltasec, ote / deltasec); return(1); } /* ** IP version 6 statistics */ void ipv6head(struct osrel *osr) { printf("inrecv/s outreq/s inmc/s outmc/s indeliv/s " "reasmok/s fragcre/s _ip6_\n"); } int ipv6line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double ir, or, im, om, id, ro, fc; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); ir = subtract(cur->ip6.Ip6InReceives, pre->ip6.Ip6InReceives); or = subtract(cur->ip6.Ip6OutRequests, pre->ip6.Ip6OutRequests); im = subtract(cur->ip6.Ip6InMcastPkts, pre->ip6.Ip6InMcastPkts); om = subtract(cur->ip6.Ip6OutMcastPkts, pre->ip6.Ip6OutMcastPkts); id = subtract(cur->ip6.Ip6InDelivers, pre->ip6.Ip6InDelivers); ro = subtract(cur->ip6.Ip6ReasmOKs, pre->ip6.Ip6ReasmOKs); fc = subtract(cur->ip6.Ip6FragCreates, pre->ip6.Ip6FragCreates); printf("%8.1lf %8.1lf %6.1lf %7.1lf %9.1lf %9.1lf %9.1lf\n", ir / deltasec, or / deltasec, im / deltasec, om / deltasec, id / deltasec, ro / deltasec, fc / deltasec); return(1); } void IPv6head(struct osrel *osr) { printf("in: dsc/s hder/s ader/s unkp/s ratim/s rfail/s " "ot: dsc/s nort/s _ip6_\n"); } int IPv6line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double ihe, iae, iup, ids, ods, onr, rto, rfl; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); ids = subtract(cur->ip6.Ip6InDiscards, pre->ip6.Ip6InDiscards); ihe = subtract(cur->ip6.Ip6InHdrErrors, pre->ip6.Ip6InHdrErrors); iae = subtract(cur->ip6.Ip6InAddrErrors, pre->ip6.Ip6InAddrErrors); iup = subtract(cur->ip6.Ip6InUnknownProtos, pre->ip6.Ip6InUnknownProtos); rto = subtract(cur->ip6.Ip6ReasmTimeout, pre->ip6.Ip6ReasmTimeout); rfl = subtract(cur->ip6.Ip6ReasmFails, pre->ip6.Ip6ReasmFails); ods = subtract(cur->ip6.Ip6OutDiscards, pre->ip6.Ip6OutDiscards); onr = subtract(cur->ip6.Ip6OutNoRoutes, pre->ip6.Ip6OutNoRoutes); printf(" %5.1lf %6.1lf %6.1lf %6.1lf %7.1lf %7.1lf " " %5.1lf %6.1lf\n", ids / deltasec, ihe / deltasec, iae / deltasec, iup / deltasec, rto / deltasec, rfl / deltasec, ods / deltasec, onr / deltasec); return(1); } /* ** TCP version 6 statistics */ void tcpv6head(struct osrel *osr) { printf(" " " socknow sockmax _tcp6_\n" ); } int tcpv6line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { unsigned long sn=0, sm=0; struct sockstat *scur, *spre; if ( getcset("sockstat", (void **)&scur, (void **)&spre) ) { sn = scur->tcp6now; sm = scur->tcp6max; } printf(" " " %7ld %7ld\n", sn, sm); return(1); } /* ** UDP version 6 statistics */ void udpv6head(struct osrel *osr) { printf("indgram/s otdgram/s inerr/s noport/s " " socknow sockmax _udp6_\n" ); } int udpv6line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double id, ot, ie, np; unsigned long sn=0, sm=0; struct netstat *cur, *pre; struct sockstat *scur, *spre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); if ( getcset("sockstat", (void **)&scur, (void **)&spre) ) { sn = scur->udp6now; sm = scur->udp6max; } id = subtract(cur->udp6.UdpInDatagrams, pre->udp6.UdpInDatagrams); ot = subtract(cur->udp6.UdpOutDatagrams, pre->udp6.UdpOutDatagrams); ie = subtract(cur->udp6.UdpInErrors, pre->udp6.UdpInErrors); np = subtract(cur->udp6.UdpNoPorts, pre->udp6.UdpNoPorts); printf("%9.1lf %9.1lf %7.2lf %9.2lf %7ld %7ld\n", id / deltasec, ot / deltasec, ie / deltasec, np / deltasec, sn, sm); return(1); } /* ** ICMP version 6 statistics */ void icmpv6head(struct osrel *osr) { printf("intot/s outtot/s inerr/s innsol/s innadv/s " "otnsol/s otnadv/s _icmp6_\n" ); } int icmpv6line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double it, ot, ier, ins, ina, ons, ona; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); it = subtract(cur->icmp6.Icmp6InMsgs, pre->icmp6.Icmp6InMsgs); ot = subtract(cur->icmp6.Icmp6OutMsgs, pre->icmp6.Icmp6OutMsgs); ier = subtract(cur->icmp6.Icmp6InErrors, pre->icmp6.Icmp6InErrors); ins = subtract(cur->icmp6.Icmp6InNeighborSolicits, pre->icmp6.Icmp6InNeighborSolicits); ina = subtract(cur->icmp6.Icmp6InNeighborAdvertisements, pre->icmp6.Icmp6InNeighborAdvertisements); ons = subtract(cur->icmp6.Icmp6OutNeighborSolicits, pre->icmp6.Icmp6OutNeighborSolicits); ona = subtract(cur->icmp6.Icmp6OutNeighborAdvertisements, pre->icmp6.Icmp6OutNeighborAdvertisements); printf("%7.1lf %8.1lf %7.2lf %8.2lf %8.2lf %8.2lf %8.2lf\n", it / deltasec, ot / deltasec, ier / deltasec, ins / deltasec, ina / deltasec, ons / deltasec, ona / deltasec); return(1); } void ICMPv6head(struct osrel *osr) { printf("iecho/s ierep/s oerep/s idu/s odu/s ird/s ord/s ite/s " "ote/s _icmp6_\n"); } int ICMPv6line(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { double iec, ier, oer, idu, odu, ird, ord, ite, ote; struct netstat *cur, *pre; if ( !getcset("netstat", (void **)&cur, (void **)&pre) ) return(0); iec = subtract(cur->icmp6.Icmp6InEchos, pre->icmp6.Icmp6InEchos); ier = subtract(cur->icmp6.Icmp6InEchoReplies, pre->icmp6.Icmp6InEchoReplies); oer = subtract(cur->icmp6.Icmp6OutEchoReplies, pre->icmp6.Icmp6OutEchoReplies); idu = subtract(cur->icmp6.Icmp6InDestUnreachs, pre->icmp6.Icmp6InDestUnreachs); odu = subtract(cur->icmp6.Icmp6OutDestUnreachs, pre->icmp6.Icmp6OutDestUnreachs); ird = subtract(cur->icmp6.Icmp6InRedirects, pre->icmp6.Icmp6InRedirects); ord = subtract(cur->icmp6.Icmp6OutRedirects, pre->icmp6.Icmp6OutRedirects); ite = subtract(cur->icmp6.Icmp6InTimeExcds, pre->icmp6.Icmp6InTimeExcds); ote = subtract(cur->icmp6.Icmp6OutTimeExcds, pre->icmp6.Icmp6OutTimeExcds); printf("%7.2lf %7.2lf %7.2lf %5.2lf %5.2lf " "%5.2lf %5.2lf %5.2lf %5.2lf\n", iec / deltasec, ier / deltasec, oer / deltasec, idu / deltasec, odu / deltasec, ird / deltasec, ord / deltasec, ite / deltasec, ote / deltasec); return(1); } /* ** Disk statistics */ void dkhead(struct osrel *osr) { printf("device read/s rdKb/s " "write/s wrKb/s rdwr/s _disk_\n"); } int dkline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { register int i, j, lines; double rw, rn, rb, wn, wb; struct genstat *cur, *pre; /* ** obtain the general statistics */ if (osr->rel >= 2 && osr->vers >= 6) { printf("counter-values in kernel version %d.%d:", osr->rel, osr->vers); return 0; } if ( !getcset("genstat", (void **)&cur, (void **)&pre) ) return(0); for (i=j=lines=0; i < MAXDISK && (cur->dk_drive_maj[i] || cur->dk_drive_min[i]); i++, j++) { if (cur->dk_drive_tot[i] == 0) continue; /* ** note that only the active disks are shown; ** when a disk has been used for the first time in ** the last sample, the position of the existing statistics ** in the table might have been shifted related to the ** previous sample */ if ( cur->dk_drive_maj[i] != pre->dk_drive_maj[j] || cur->dk_drive_min[i] != pre->dk_drive_min[j] ) { /* resync */ for (j=0; j < MAXDISK; j++) { if (cur->dk_drive_maj[i] == pre->dk_drive_maj[j] && cur->dk_drive_min[i] == pre->dk_drive_min[j] ) break; } } rw = subtract(cur->dk_drive_tot[i], pre->dk_drive_tot[j]); if (rw == 0.0) continue; rn = subtract(cur->dk_drive_rio[i], pre->dk_drive_rio[j]); wn = subtract(cur->dk_drive_wio[i], pre->dk_drive_wio[j]); rb = subtract(cur->dk_drive_rblk[i], pre->dk_drive_rblk[j]); wb = subtract(cur->dk_drive_wblk[i], pre->dk_drive_wblk[j]); if (lines > 0) printf("%s ", tstamp); printf("disk%03lld-%03lld %10.2lf %6.2lf %7.2lf %6.2lf" " %10.2lf\n", cur->dk_drive_maj[i], cur->dk_drive_min[i], rn / deltasec, rb / deltasec / 2.0, wn / deltasec, wb / deltasec / 2.0, rw / deltasec); lines++; } if (lines == 0) printf("\n"); return(1); } /* ** Disk-partition statistics */ void parthead(struct osrel *osr) { printf("partition busy read/s Kbyt/r " "write/s Kbyt/w avque avserv _part_\n"); } int partline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { register int i, nr, lines; double busy, avq, avs, avkr, avkw, rd, wr, rs, ws, io_msecs; char lastchar, dskname[32]; unsigned long deltams = deltatic * 1000 / hz; struct dkstat *cur, *pre; if ( (nr = getcset("partstat", (void **)&cur, (void **)&pre)) == 0) return 0; for (i=0, lines=0; i < nr; i++, cur++, pre++) { if ( cur->readblocks == pre->readblocks && cur->writblocks == pre->writblocks ) continue; /* no activity on this partition */ /* ** check if a new partition popped up during interval */ if ( (cur->major != pre->major || cur->minor != pre->minor) && (pre->major != 0 || pre->minor != 0 ) ) continue; /* ** this partition was active during last interval */ if (lines > 0) printf("%s ", tstamp); rd = subtract(cur->readblocks, pre->readblocks); wr = subtract(cur->writblocks, pre->writblocks); rs = subtract(cur->readsectors, pre->readsectors); ws = subtract(cur->writsectors, pre->writsectors); if (rd > 0) avkr = rs / rd / 2.0; else avkr = 0.0; if (wr > 0) avkw = ws / wr / 2.0; else avkw = 0.0; lastchar = cur->name[strlen(cur->name)-1]; /* ** print info for entire disk */ if ( !isdigit(lastchar) ) { io_msecs = subtract(cur->rdwr_msecs, pre->rdwr_msecs); if ( (busy = io_msecs * 100.0 / deltams) > 100.0) busy = 100.0; avs = io_msecs / (rd+wr); if (io_msecs > 0) avq = subtract(cur->avq, pre->avq) / io_msecs; else avq = 0.0; sprintf(dskname, "%s (%d-%d)", cur->name, cur->major, cur->minor); printf("%-11s %3.0lf%% %7.2lf %6.1lf %9.2lf %6.1lf " "%6.2lf %6.2lf ms\n", dskname, busy, rd * 1000.0 / deltams, avkr, wr * 1000.0 / deltams, avkw, avq, avs); } /* ** print info for a partition */ else { printf("%-11s %7.2lf %6.1lf %9.2lf %6.1lf\n", cur->name, rd * 1000.0 / deltams, avkr, wr * 1000.0 / deltams, avkw); } lines++; } if (lines == 0) printf("\n"); return(1); } /* ** NFS general statistics */ void nfshead(struct osrel *osr) { printf("svrpc/s clrpc/s sudp/s stcp/s stcon/s " "cudp/s ctcp/s ctcon/s _nfs_\n"); } int nfsline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { struct nfsstat *cur, *pre; double sr, sn, su, st, sc, cr, cn, cu, ct, cc; if ( !getcset("nfsstat", (void **)&cur, (void **)&pre) ) return(0); sr = subtract(cur->sv_rpccnt, pre->sv_rpccnt); sn = subtract(cur->sv_netcnt, pre->sv_netcnt); su = subtract(cur->sv_netudpcnt, pre->sv_netudpcnt); st = subtract(cur->sv_nettcpcnt, pre->sv_nettcpcnt); sc = subtract(cur->sv_nettcpconn, pre->sv_nettcpconn); cr = subtract(cur->cl_rpccnt, pre->cl_rpccnt); cn = subtract(cur->cl_netcnt, pre->cl_netcnt); cu = subtract(cur->cl_netudpcnt, pre->cl_netudpcnt); ct = subtract(cur->cl_nettcpcnt, pre->cl_nettcpcnt); cc = subtract(cur->cl_nettcpconn, pre->cl_nettcpconn); printf("%7.2lf %7.2lf %8.2lf %6.2lf %7.3lf %8.2lf %6.2lf %7.3lf\n", sr / deltasec, cr / deltasec, su / deltasec, st / deltasec, sc / deltasec, cu / deltasec, ct / deltasec, cc / deltasec); return(1); } /* ** NFS error statistics */ void NFShead(struct osrel *osr) { printf("svbadfmt/s svbadauth/s svbadclnt/s " "clretrans/s clauthrefresh/s _nfs_\n"); } int NFSline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { struct nfsstat *cur, *pre; double sf, sa, sc, cr, ca; if ( !getcset("nfsstat", (void **)&cur, (void **)&pre) ) return(0); sf = subtract(cur->sv_rpcbadfmt, pre->sv_rpcbadfmt); sa = subtract(cur->sv_rpcbadauth, pre->sv_rpcbadauth); sc = subtract(cur->sv_rpcbadclnt, pre->sv_rpcbadclnt); cr = subtract(cur->cl_rpcretrans, pre->cl_rpcretrans); ca = subtract(cur->cl_rpcauthrefresh,pre->cl_rpcauthrefresh); printf("%10.3lf %11.3lf %11.3lf %11.3lf %15.3lf\n", sf / deltasec, sa / deltasec, sc / deltasec, cr / deltasec, ca / deltasec); return(1); } /* ** NFS additional server statistics */ void nfsshead(struct osrel *osr) { printf("rchit/s rcmiss/s %%hit fhstal/s iord/s iowr/s " "racach thr tlast/s _nfs_\n"); } int nfssline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { struct nfsstat *cur, *pre; double rch, rcm, rcn, fst, flu, fan, fnd, fnn, ior, iow, thl, perc; if ( !getcset("nfsstat", (void **)&cur, (void **)&pre) ) return(0); rch = subtract(cur->sv_rchits, pre->sv_rchits); rcm = subtract(cur->sv_rcmisses, pre->sv_rcmisses); rcn = subtract(cur->sv_rcnocache, pre->sv_rcnocache); fst = subtract(cur->sv_fhstale, pre->sv_fhstale); flu = subtract(cur->sv_fhlookup, pre->sv_fhlookup); fan = subtract(cur->sv_fhanon, pre->sv_fhanon); fnd = subtract(cur->sv_fhnocachedir, pre->sv_fhnocachedir); fnn = subtract(cur->sv_fhnocachenondir, pre->sv_fhnocachenondir); ior = subtract(cur->sv_ioread, pre->sv_ioread); iow = subtract(cur->sv_iowrite, pre->sv_iowrite); thl = subtract(cur->sv_thlastcnt, pre->sv_thlastcnt); if (rch+rcm > 0) perc = rch * 100.0 / (rch + rcm); else perc = 0.0; printf("%7.2lf %8.2lf %4.0lf %8.3lf %5.1lfK %5.1lfK %5lldK " "%3lld %7.3lf\n", rch / deltasec, rcm / deltasec, perc, fst / deltasec, ior / deltasec / 1024.0, iow / deltasec / 1024.0, cur->sv_rasize / 1024, cur->sv_thcount, thl / deltasec); return(1); } /* ** RPC statistics */ void rpchead(struct osrel *osr) { printf("gat sat lku rln rd wrc wr cre rm " "rnm lnk sln mkd rmd rdd fst _rpc_\n"); } int rpcline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { register int lines=0; struct nfsstat *cur, *pre; double stot, ctot; if ( !getcset("nfsstat", (void **)&cur, (void **)&pre) ) return(0); stot = subtract(cur->sv_rpccnt, pre->sv_rpccnt); ctot = subtract(cur->cl_rpccnt, pre->cl_rpccnt); /* ** print server rpc-call statistics (version 2 and 3) */ if (stot > 0.0) { lines += prirpcs(cur->sv_proc2, pre->sv_proc2, stot, "%srv2", lines, tstamp); lines += prirpcs(cur->sv_proc3, pre->sv_proc3, stot, "%srv3", lines, tstamp); } /* ** print client rpc-call statistics (version 2 and 3) */ if (ctot > 0.0) { lines += prirpcs(cur->cl_proc2, pre->cl_proc2, ctot, "%cln2", lines, tstamp); lines += prirpcs(cur->cl_proc3, pre->cl_proc3, ctot, "%cln3", lines, tstamp); } if (lines == 0) printf("\n"); return(1); } /* ** print one line with percentages about RPC-call usage */ #define NNULL 0 #define NGETATTR 1 #define NSETATTR 2 #define NROOT 3 #define NLOOKUP 4 #define NREADLINK 5 #define NREAD 6 #define NWRITEC 7 #define NWRITE 8 #define NCREATE 9 #define NREMOVE 10 #define NRENAME 11 #define NLINK 12 #define NSYMLINK 13 #define NMKDIR 14 #define NRMDIR 15 #define NREADDIR 16 #define NSTATFS 17 #define NNUMRPC 18 int prirpcs(count_t rpccur[], count_t rpcpre[], double tot, char *txt, int lines, char *tstamp) { register int i; double sub; for (i=0, sub=0.0; i < NNUMRPC; i++) sub += subtract(rpccur[i], rpcpre[i]); if (sub == 0.0) return 0; if (lines) printf("%s ", tstamp); printf("%3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf " "%3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %3.0lf %s\n", subtract(rpccur[NGETATTR], rpcpre[NGETATTR]) * 100.0 / sub, subtract(rpccur[NSETATTR], rpcpre[NSETATTR]) * 100.0 / sub, subtract(rpccur[NLOOKUP], rpcpre[NLOOKUP]) * 100.0 / sub, subtract(rpccur[NREADLINK], rpcpre[NREADLINK]) * 100.0 / sub, subtract(rpccur[NREAD], rpcpre[NREAD]) * 100.0 / sub, subtract(rpccur[NWRITEC], rpcpre[NWRITEC]) * 100.0 / sub, subtract(rpccur[NWRITE], rpcpre[NWRITE]) * 100.0 / sub, subtract(rpccur[NCREATE], rpcpre[NCREATE]) * 100.0 / sub, subtract(rpccur[NREMOVE], rpcpre[NREMOVE]) * 100.0 / sub, subtract(rpccur[NRENAME], rpcpre[NRENAME]) * 100.0 / sub, subtract(rpccur[NLINK], rpcpre[NLINK]) * 100.0 / sub, subtract(rpccur[NSYMLINK], rpcpre[NSYMLINK]) * 100.0 / sub, subtract(rpccur[NMKDIR], rpcpre[NMKDIR]) * 100.0 / sub, subtract(rpccur[NRMDIR], rpcpre[NRMDIR]) * 100.0 / sub, subtract(rpccur[NREADDIR], rpcpre[NREADDIR]) * 100.0 / sub, subtract(rpccur[NSTATFS], rpcpre[NSTATFS]) * 100.0 / sub, txt); return 1; } #ifdef WEBSUPPORT /* ** FTP statistics */ void ftphead(struct osrel *osr) { printf("xfers/s kbytes/s avg_time avg_kbytes direct name" " _ftp_\n"); } int ftpline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { static int sampcnt = 0; register int i, n, lines; double xfers; struct ftpstat *cur, *pre; extern char *infile; /* input file-name */ extern char *interval; /* number-of-seconds interval */ /* ** not supported when reading from pipe, i.e. starting with interval */ if (!infile && interval != NULL) { printf("interval for ftp-counters:"); return 0; } if ( (n = getcset("ftpstat", (void **)&cur, (void **)&pre)) == 0) return 0; sampcnt++; for (i=0, lines=0; i < n; i++, cur++, pre++) { /* ** check output-activity */ if ( sampcnt == 1 || (xfers = cur->ocumxfer - pre->ocumxfer) > 0.0) { if (lines > 0) printf("%s ", tstamp); printf("%7.3lf %8.2lf %8.2lf s %11.3lf output %s\n", (cur->ocumxfer - pre->ocumxfer) /deltasec, (cur->ocumkbytes - pre->ocumkbytes) /deltasec, (cur->ocumseconds - pre->ocumseconds)/xfers, (cur->ocumkbytes - pre->ocumkbytes) /xfers, cur->logname); lines++; } /* ** check input-activity */ if ( sampcnt == 1 || (xfers = cur->icumxfer - pre->icumxfer) > 0.0) { if (lines > 0) printf("%s ", tstamp); printf("%7.3lf %8.2lf %8.2lf s %11.3lf input %s\n", (cur->icumxfer - pre->icumxfer) /deltasec, (cur->icumkbytes - pre->icumkbytes) /deltasec, (cur->icumseconds - pre->icumseconds)/xfers, (cur->icumkbytes - pre->icumkbytes) /xfers, cur->logname); lines++; } } if (lines == 0) printf("\n"); return 1; } /* ** HTTP statistics */ void httphead(struct osrel *osr) { printf(" head/s get/s put/s post/s delete/s name" " _http_\n"); } int httpline(time_t deltasec, time_t deltatic, time_t hz, int ncpu, struct osrel *osr, char *tstamp) { static int sampcnt = 0; register int i, n, lines; struct httpstat *cur, *pre; double head, gets, puts, post, dels; extern char *infile; /* input file-name */ extern char *interval; /* number-of-seconds interval */ /* ** not supported when reading from pipe, i.e. starting with interval */ if (!infile && interval != NULL) { printf("interval for http-counters:"); return 0; } if ( (n = getcset("httpstat", (void **)&cur, (void **)&pre)) == 0) return 0; sampcnt++; for (i=0, lines=0; i < n; i++, cur++, pre++) { head = cur->cumhead - pre->cumhead; gets = cur->cumgets - pre->cumgets; puts = cur->cumputs - pre->cumputs; post = cur->cumpost - pre->cumpost; dels = cur->cumdels - pre->cumdels; if (sampcnt == 1 || head || gets || puts || post || dels) { if (lines > 0) printf("%s ", tstamp); printf("%7.3lf %7.3lf %7.3lf %7.3lf %8.3lf %s\n", head / deltasec, gets / deltasec, puts / deltasec, post / deltasec, dels / deltasec, cur->logname); lines++; } } if (lines == 0) printf("\n"); return 1; } #endif /*********************************************************************/ /* Generic function to subtract two unsigned long's taking into */ /* account the possibility of overflow. */ /*********************************************************************/ double subtract(count_t newval, count_t oldval) { if (newval >= oldval) return (double) newval - oldval; else return (double) ULONG_MAX + 1.0 + newval - oldval; } /*********************************************************************/ /* Function definition table. */ /* */ /* The layout of this table is as follows: */ /* Column 1: */ /* Boolean which indicates if the specified function is */ /* active during a run of 'atsar'. When 'atsar' is started, */ /* this boolean will be defined 'true' for all entries for */ /* which the command-line flag has been specified. Initially */ /* this column should contain 0 (false), unless this function */ /* is always required. */ /* If no flags are specified for 'atsar', the first entry */ /* in this table is defined active (default flag). */ /* */ /* Column 2: */ /* Flag which can be used as command-line argument to */ /* select the function defined in this table-entry. Be sure */ /* that a unique character is choosen. */ /* The flags 'f', 's', 'e', 'i', 'S' and 'A' are reserved! */ /* */ /* Column 3: */ /* Entry-point of the 'printhead' function. */ /* */ /* Column 4: */ /* Entry-point of the 'printline' function. */ /* */ /* Column 5: */ /* Information about the statistics shown by the function */ /* specified by the table-entry. This text is printed as */ /* command-usage. */ /*********************************************************************/ struct funcdef funcdef[] = { {0, 'u', cpuhead, cpuline, "cpu", }, {0, 'P', prchead, prcline, "process load", }, {0, 'd', dkhead, dkline, "disk", }, {0, 'D', parthead, partline, "disk-partition", }, {0, 'r', memhead, memline, "memory & swap", }, {0, 'p', pagehead, pageline, "paging & swapping", }, {0, 'I', inthead, intline, "interrupts", }, {0, 'v', tabhead, tabline, "kernel-resources", }, {0, 'y', ttyhead, ttyline, "tty activity", }, {0, 'l', ifhead, ifline, "net-interf (general)", }, {0, 'L', IFhead, IFline, "net-interf (errors)", }, {0, 'w', ipv4head, ipv4line, "ip v4 (general)", }, {0, 'W', IPv4head, IPv4line, "ip v4 (errors)", }, {0, 't', tcphead, tcpline, "tcp v4 (general)", }, {0, 'T', TCPhead, TCPline, "tcp v4 (errors)", }, {0, 'U', udpv4head, udpv4line, "udp v4", }, {0, 'm', icmpv4head, icmpv4line, "icmp v4 (general)", }, {0, 'M', ICMPv4head, ICMPv4line, "icmp v4 (per type)", }, {0, 'g', ipv6head, ipv6line, "ip v6 (general)", }, {0, 'G', IPv6head, IPv6line, "ip v6 (errors)", }, {0, 'j', tcpv6head, tcpv6line, "tcp v6 (general)", }, {0, 'h', udpv6head, udpv6line, "udp v6", }, {0, 'k', icmpv6head, icmpv6line, "icmp v6 (general)", }, {0, 'K', ICMPv6head, ICMPv6line, "icmp v6 (per type)", }, {0, 'N', nfshead, nfsline, "nfs (general)", }, {0, 'E', NFShead, NFSline, "nfs (errors)", }, {0, 'V', nfsshead, nfssline, "nfs (server)", }, {0, 'R', rpchead, rpcline, "nfs-rpc (%calls)", }, #ifdef WEBSUPPORT {0, 'F', ftphead, ftpline, "ftp traffic", }, {0, 'H', httphead, httpline, "http traffic", }, #endif }; int funcnt = sizeof(funcdef)/sizeof(struct funcdef); atsar-1.7/atsadc/0000755000175000017500000000000010073242162014563 5ustar mstonemstone00000000000000atsar-1.7/atsadc/atsadc0000755000175000017500000012704510073242162015761 0ustar mstonemstone00000000000000ELFðŠ4À™4 (44€4€ÀÀôô€ô€€€ n npððD`ÄsÄóÄóÈÈ /lib/ld-linux.so.2GNU%+#)%&*  !" $   '(+„ˆQ)”ˆgĤˆD0´ˆ•"gĈ@ÑÔˆ%Ýäˆ:Fôˆùm‰-ê‰>M$‰p24‰-uD‰%"ã`õÌT‰D9d‰@"t‰¯a„‰:Z”‰/𤉴‰ÓTĉ@?Ô‰'Ü䉉ô‰:°Š>Š1÷$Š@¨4ŠüñDŠåüTŠ+¡dŠ-FtŠô½„ŠC!dõ’”Šœö¤Š Ø´Š:$ÝÄŠ@K ÔŠ0libc.so.6strcpysnprintftimes__ctype_busleepfscanffgetsmemcpyperrormalloclseekstrtolunamewritefprintf__deregister_frame_inforeadstrncpymemcmpsscanfregcompgettimeofdaymemsetregexectimestrcmpdupfclosestderraccessexitfopenatoi_IO_stdin_used__libc_start_mainstrlenstrchr__register_frame_infofree__gmon_start__GLIBC_2.1GLIBC_2.0ii Zii d@õ)`õdõ#¨ô¬ô°ô´ô¸ô¼ôÀôÄôÈô Ìô Ðô Ôô Øô Üôàôäôèôìôðôôôøôüôõõõ õõõõõ õ $õ!(õ",õ$0õ%4õ&8õ(<õ*U‰åƒìè­èCèNTÉÃÿ5 ôÿ%¤ôÿ%¨ôhéàÿÿÿÿ%¬ôhéÐÿÿÿÿ%°ôhéÀÿÿÿÿ%´ôhé°ÿÿÿÿ%¸ôh é ÿÿÿÿ%¼ôh(éÿÿÿÿ%Àôh0é€ÿÿÿÿ%Äôh8épÿÿÿÿ%Èôh@é`ÿÿÿÿ%ÌôhHéPÿÿÿÿ%ÐôhPé@ÿÿÿÿ%ÔôhXé0ÿÿÿÿ%Øôh`é ÿÿÿÿ%Üôhhéÿÿÿÿ%àôhpéÿÿÿÿ%äôhxéðþÿÿÿ%èôh€éàþÿÿÿ%ìôhˆéÐþÿÿÿ%ðôhéÀþÿÿÿ%ôôh˜é°þÿÿÿ%øôh é þÿÿÿ%üôh¨éþÿÿÿ%õh°é€þÿÿÿ%õh¸épþÿÿÿ%õhÀé`þÿÿÿ% õhÈéPþÿÿÿ%õhÐé@þÿÿÿ%õhØé0þÿÿÿ%õhàé þÿÿÿ%õhèéþÿÿÿ% õhðéþÿÿÿ%$õhøéðýÿÿÿ%(õhéàýÿÿÿ%,õhéÐýÿÿÿ%0õhéÀýÿÿÿ%4õhé°ýÿÿÿ%8õh é ýÿÿÿ%<õh(éýÿÿ1í^‰áƒäðPTRhÝh\ˆQVhð‹è£þÿÿô‰öU‰åSPè[Ã~i‹ƒ¤…ÀtÿЋ]üÉÉöU‰åƒì‹ ð…ÒuI‹ð‹…Àtt&B£ðÿ‹ð‹ …Éuê¸D‰…Àtƒì hÀóè¸ýÿÿƒÄ¸£ ð‰ì]ÃvU‰åƒì‰ì]öU¸´ˆ‰åƒì…ÀtƒìhhõhÀóèãüÿÿƒÄ‰ì]ô&U‰åƒì‰ì]öU‰åS줃}ŽÑ‹E ƒÀ‹¾kСdõf‹%f…À„Ÿ‹E ƒÀƒì ÿ0èþÿÿƒÄ‰À‰À£ðƒ=ðƒì ‹E ÿ0è%ƒÄƒ}~!‹E ƒÀ‹¾kСdõf‹%f…Àuƒì ‹E ÿ0èîƒÄ‹E ƒÀƒì ÿ0è¯ýÿÿƒÄ‰À‰À£ðƒ}~‹E ƒÀ ‹£õë‰ö‹E ƒÀ‹£õƒ=õuƒì jèÌýÿÿƒÄ‰À‰EðÆE÷éÓvƒìjÿ5õèüÿÿƒÄ‰Àƒøÿubƒ=ðu ƒì jèýÿÿvƒìh´jAÿ5õèãüÿÿƒÄ‰À‰Eðƒ}ðÿuƒì huÝè˜ûÿÿƒÄƒì jèÛüÿÿvÆE÷éWvƒìjÿ5õèœüÿÿƒÄ‰À‰Eðƒ}ðÿuƒì hˆÝèQûÿÿƒÄƒì jè”üÿÿƒìh°…8þÿÿPÿuðèýüÿÿƒÄ‰Àƒøÿuƒì h™ÝèûÿÿƒÄƒì jèYüÿÿ½8þÿÿ¾ºíþt(ƒìÿ5õhÀÝÿ5`õèóúÿÿƒÄƒì jè&üÿÿ‰öƒìjjÿuðè•ûÿÿƒÄÆE÷ƒ=ð…‰ƒì jèûÿÿƒÄ‰À‰…(þÿÿƒì …þÿÿPèûÿÿƒÄ‰À‰…,þÿÿÇ…0þÿÿƒìj …(þÿÿPÿuðè4úÿÿƒÄ‰Àƒøÿuƒì hãÝèMúÿÿƒÄƒì jèûÿÿƒì ÿuðè%úÿÿƒÄƒì jèxûÿÿƒì …xüÿÿPè©úÿÿƒÄƒì hŒõhˆõh„õhñÝ…xüÿÿ‚Pè^ûÿÿƒÄ ƒ=„õ*ÿ5ˆõÿ5„õhÞÿ5`õèÖùÿÿƒÄƒì jè ûÿÿÇ…düÿÿÇ…þÿÿÇ… þÿÿ‹…düÿÿ;¬ò|é ‹…düÿÿ‰ÂÁ⸴òƒ<t/ƒì‹…düÿÿ‰ÁÁẴòh„õ‹…düÿÿÁà¬òP‹ÿЃÄ‹…düÿÿ‰ÂÁ⸬òf‹Dƒàf…Àt2‹…düÿÿ‰ÃÁ㹬ò‹…düÿÿ‰ÂÁ⸬òf‹DfÁè@Áàf‰D ‹…düÿÿ‰ÂÁ⸬ò·L‹…düÿÿ‰ÂÁ⸬ò·D‰Ê¯Ð… þÿÿ‹…düÿÿ‰ÂÁ⸬òƒì ÿ4èùÿÿƒÄ‰À‰À…þÿÿ@‰…þÿÿÿ…düÿÿéçþÿÿv‹…þÿÿƒà…Àt‹…þÿÿÁø@Áà‰…þÿÿÇ…düÿÿÇ…þÿÿÇ…þÿÿ‹…düÿÿ;`ó|é ‹…düÿÿ‰ÂÁ⸸òƒ<t/ƒì‹…düÿÿ‰ÁÁẸòh„õ‹…düÿÿÁà°òP‹ÿЃÄ‹…düÿÿ‰ÂÁ⸰òf‹Dƒàf…Àt2‹…düÿÿ‰ÃÁã¹°ò‹…düÿÿ‰ÂÁ⸰òf‹DfÁè@Áàf‰D ‹…düÿÿ‰ÂÁ⸰ò·L‹…düÿÿ‰ÂÁ⸰ò·D‰Ê¯Ð…þÿÿ‹…düÿÿ‰ÂÁ⸰òƒì ÿ4èÂ÷ÿÿƒÄ‰À‰À…þÿÿ@‰…þÿÿÿ…düÿÿéçþÿÿv‹…þÿÿƒà…Àt‹…þÿÿÁø@Áà‰…þÿÿ€}÷t.ƒì ÿµþÿÿÿµ þÿÿÿµþÿÿÿµþÿÿÿuðèSƒÄ é§v‹…@þÿÿ;¬òuv‹…Dþÿÿ;…þÿÿuh‹…Hþÿÿ;… þÿÿuZ‹…Lþÿÿ;`óuL‹…Pþÿÿ;…þÿÿu>‹…Tþÿÿ;…þÿÿu0…xüÿÿ‚…8þÿÿªƒìRPè7öÿÿƒÄ‰À‰À…Àuë"‰öƒìh@Þÿ5`õèEöÿÿƒÄƒì jèx÷ÿÿƒì ÿµþÿÿèJöÿÿƒÄ‰À‰…\üÿÿ‹…\üÿÿ…Àuƒì hgÞèøõÿÿƒÄƒì jè;÷ÿÿvƒìj…püÿÿPèçöÿÿƒÄ‹…püÿÿ‰…hüÿÿ‹ð‰ÐÁàÐ…Ð…Ð…Ð…Ð…ÐÁà‰…lüÿÿÇEì‰ö‹Eì;ð|éЃ}ìtoƒìj…püÿÿPèeöÿÿƒÄ‹…püÿÿ;…hüÿÿ| ƒì ‹…tüÿÿ‹•lüÿÿ)‰ÐPè»ôÿÿƒÄë!‰öƒì ‹•tüÿÿ‹…lüÿÿ)Ð@BPè˜ôÿÿƒÄ‹ð…hüÿÿƒì jèMõÿÿƒÄ‰À‰…(þÿÿƒì …þÿÿPèÓõÿÿƒÄ‰À‰…,þÿÿ‹…þÿÿ‰…0þÿÿÇ…düÿÿÇ…`üÿÿ‹…düÿÿ;`ó|ë|ƒì‹…düÿÿ‰ÁÁẼò‹…\üÿÿ…`üÿÿPh„õ‹…düÿÿÁà°òP‹ÿЃÄ‹…düÿÿ‰ÂÁ⸰ò·L‹…düÿÿ‰ÂÁ⸰ò·D¯Á…`üÿÿÿ…düÿÿévÿÿÿ‰öƒìj …(þÿÿPÿuðèØóÿÿƒÄ‰À…Àyƒì huÞèòóÿÿƒÄƒì jè5õÿÿƒìÿµþÿÿÿµ\üÿÿÿuðèóÿÿƒÄ‰À…Àyƒì hŒÞè·óÿÿƒÄƒì jèúôÿÿ‰öEìÿé"þÿÿ‰öƒì ÿuðèóÿÿƒÄ¸‹]üÉÃU‰åVSìС¬ò‰ÀÁà‰…<þÿÿ¡`ó‰ÀÁà‰…8þÿÿÇ…Hþÿÿ¾ºíþÇ…Lþÿÿ°¡¬ò‰…Pþÿÿ‹E ‰…Tþÿÿ‹E‰…Xþÿÿ¡`ó‰…\þÿÿ‹E‰…`þÿÿ‹E‰…dþÿÿÇ…hþÿÿdè´‰À‰…lþÿÿƒì …HþÿÿƒÀ(PèróÿÿƒÄƒìh°…HþÿÿPÿuè˜òÿÿƒÄ‰À…Àyƒì h¥Þè²òÿÿƒÄƒì jèõóÿÿƒì ÿµ<þÿÿèÆòÿÿƒÄ‰À‰…@þÿÿ‹…@þÿÿ…Àuƒì hgÞètòÿÿƒÄƒì jè·óÿÿvƒì ÿu è‰òÿÿƒÄ‰À‰…Dþÿÿ‹…Dþÿÿ…Àuƒì hgÞè7òÿÿƒÄƒì jèzóÿÿ‰öÇ…4þÿÿÇ…0þÿÿv‹…4þÿÿ;¬ò|éÅ‹…4þÿÿ‰ÂÁ⸬òƒì ÿ4èaòÿÿƒÄ‰À‰ÃCƒìS‹…4þÿÿ‰ÂÁ⸬òÿ4‹…0þÿÿ…DþÿÿPèòÿÿƒÄk•4þÿÿ‹…@þÿÿ‹0þÿÿ‰ kµ4þÿÿ‹@þÿÿ‹…4þÿÿ‰ÂÁ⸬òf‹Df‰D1kµ4þÿÿ‹@þÿÿ‹…4þÿÿ‰ÂÁ⸬òf‹Df‰D10þÿÿÿ…4þÿÿé(ÿÿÿƒìÿµ<þÿÿÿµ@þÿÿÿuèñðÿÿƒÄ‰À…Àyƒì hÀÞè ñÿÿƒÄƒì jèNòÿÿ‰öƒìÿu ÿµDþÿÿÿuè¸ðÿÿƒÄ‰À…Àyƒì háÞèÒðÿÿƒÄƒì jèòÿÿƒì ÿµDþÿÿè6òÿÿƒÄƒì ÿµ@þÿÿè%òÿÿƒÄƒì ÿµ8þÿÿèÄðÿÿƒÄ‰À‰…@þÿÿ‹…@þÿÿ…Àuƒì hgÞèrðÿÿƒÄƒì jèµñÿÿƒì ÿuè‰ðÿÿƒÄ‰À‰…Dþÿÿ‹…Dþÿÿ…Àuƒì hgÞè7ðÿÿƒÄƒì jèzñÿÿ‰öÇ…4þÿÿÇ…0þÿÿv‹…4þÿÿ;`ó|éÅ‹…4þÿÿ‰ÂÁ⸰òƒì ÿ4èaðÿÿƒÄ‰À‰ÃCƒìS‹…4þÿÿ‰ÂÁ⸰òÿ4‹…0þÿÿ…DþÿÿPèðÿÿƒÄk•4þÿÿ‹…@þÿÿ‹0þÿÿ‰ kµ4þÿÿ‹@þÿÿ‹…4þÿÿ‰ÂÁ⸰òf‹Df‰D1kµ4þÿÿ‹@þÿÿ‹…4þÿÿ‰ÂÁ⸰òf‹Df‰D10þÿÿÿ…4þÿÿé(ÿÿÿƒìÿµ8þÿÿÿµ@þÿÿÿuèñîÿÿƒÄ‰À…Àyƒì hÀÞè ïÿÿƒÄƒì jèNðÿÿ‰öƒìÿuÿµDþÿÿÿuè¸îÿÿƒÄ‰À…Àyƒì háÞèÒîÿÿƒÄƒì jèðÿÿƒì ÿµDþÿÿè6ðÿÿƒÄƒì ÿµ@þÿÿè%ðÿÿƒÄƒì ÿuèÇîÿÿƒÄ‰À‰…,þÿÿ‹…,þÿÿ…Àuƒì hgÞèuîÿÿƒÄƒì jè¸ïÿÿÇ…4þÿÿÇ…0þÿÿv‹…4þÿÿ;¬ò|ë|ƒì‹…4þÿÿ‰ÁÁẸò‹…,þÿÿ…0þÿÿPh„õ‹…4þÿÿÁà¬òP‹ÿЃÄ‹…4þÿÿ‰ÂÁ⸬ò·L‹…4þÿÿ‰ÂÁ⸬ò·D¯Á…0þÿÿÿ…4þÿÿévÿÿÿ‰öƒìÿuÿµ,þÿÿÿuè€íÿÿƒÄ‰À…Àyƒì høÞèšíÿÿƒÄƒì jèÝîÿÿƒì ÿµ,þÿÿèþîÿÿƒÄeø[^]ÃU‰åƒìƒìÿuh ßÿ5`õèhíÿÿƒÄƒì jè›îÿÿvU‰åìxÇEðƒìh#ßh%ßèÖîÿÿƒÄ‰À‰Eôƒ}ôu ¸馉övƒìÿuôh…èûÿÿPèaíÿÿƒÄ‰À…ÀuëN‰öƒì…˜ûÿÿPh0ß…èûÿÿPè9îÿÿƒÄ€½˜ûÿÿcuµ€½™ûÿÿpu¬€½šûÿÿuu£€½›ûÿÿtšEðÿë“vƒì ÿuôè}íÿÿƒÄ‹Eð‰…”ûÿÿƒ½”ûÿÿ} Ç…”ûÿÿ‹…”ûÿÿÉÉöU‰åSìÄ"ƒìh´WjÿuèØíÿÿƒÄƒìhxßhzßèãíÿÿƒÄ‰À‰Eôƒ}ô„S ƒìÿuôh …èßÿÿPèyìÿÿƒÄ‰À…Àué vƒì…¨ÝÿÿøP…¨ÝÿÿðP…¨ÝÿÿèP…¨ÝÿÿàP…¨ÝÿÿØP…¨ÝÿÿÐP…¨ÝÿÿÈP…¨ÝÿÿÀP…¨Ýÿÿ¸P…¨Ýÿÿ°P…¨Ýÿÿ¨P…¨Ýÿÿ P…¨Ýÿÿ˜P…¨ÝÿÿP…¨ÝÿÿˆP…¨Ýÿÿ€P…¨ÝÿÿxP…¨ÝÿÿpP…¨ÝÿÿhP…¨Ýÿÿ`P…¨ÝÿÿXP…¨ÝÿÿPP…¨ÝÿÿHP…¨Ýÿÿ@P…¨Ýÿÿ8P…¨Ýÿÿ0P…¨Ýÿÿ(P…¨Ýÿÿ P…¨ÝÿÿP…¨ÝÿÿP…¨ÝÿÿP…¨ÝÿÿP…¨ÝÿÿøP…¨ÝÿÿðP…¨ÝÿÿèP…¨ÝÿÿàP…¨ÝÿÿØP…¨ÝÿÿÐP…¨ÝÿÿÈP…¨ÝÿÿÀP…¨Ýÿÿ¸P…¨Ýÿÿ°P…¨Ýÿÿ¨P…¨Ýÿÿ P…¨Ýÿÿ˜P…¨ÝÿÿP…¨ÝÿÿˆP…¨Ýÿÿƒè€P…¨ÝÿÿƒÀxP…¨ÝÿÿƒÀpP…¨ÝÿÿƒÀhP…¨ÝÿÿƒÀ`P…¨ÝÿÿƒÀXP…¨ÝÿÿƒÀPP…¨ÝÿÿƒÀHP…¨ÝÿÿƒÀ@P…¨ÝÿÿƒÀ8P…¨ÝÿÿƒÀ0P…¨ÝÿÿƒÀ(P…¨ÝÿÿƒÀ P…¨ÝÿÿƒÀP…¨ÝÿÿƒÀP…¨ÝÿÿƒÀP…¨ÝÿÿP…¨ßÿÿPh ß…èßÿÿPèrêÿÿĉ…`Ýÿÿƒ½`ÝÿÿéÈüÿÿ…¨ßÿÿƒìPhæàè´èÿÿƒÄ‰À‰À…À…±‹M‹…¨Ýÿÿ‹•¬Ýÿÿ‰‰Q‹M‹…°Ýÿÿ‹•´Ýÿÿ‰A‰Q ‹M‹…¸Ýÿÿ‹•¼Ýÿÿ‰A‰Q‹M‹…ÀÝÿÿ‹•ÄÝÿÿ‰A‰Q‹E ƒ8ŽFüÿÿ‹E ƒxŽ9üÿÿ‹M‹…ÈÝÿÿ‹•ÌÝÿÿ‰A ‰Q$‹M‹…ÐÝÿÿ‹•ÔÝÿÿ‰A(‰Q,‹M‹…ØÝÿÿ‹•ÜÝÿÿ‰A0‰Q4éõûÿÿ€½¨ßÿÿc…‡€½©ßÿÿp…z€½ªßÿÿu…m…¨ßÿÿƒÀƒì Pè;éÿÿƒÄ‰À‰À‰…¤Ýÿÿƒ½¤Ýÿÿ¡ûÿÿƒ½¤Ýÿÿˆ”ûÿÿ‹]‹…¤Ýÿÿ‰ÀÁàH0‹…¨Ýÿÿ‹•¬Ýÿÿ‰D‰T ‹]‹…¤Ýÿÿ‰ÀÁàˆ0‹…°Ýÿÿ‹•´Ýÿÿ‰D‰T ‹]‹…¤Ýÿÿ‰ÀÁàˆ0‹…¸Ýÿÿ‹•¼Ýÿÿ‰D‰T ‹]‹…¤Ýÿÿ‰ÀÁàˆ0‹…ÀÝÿÿ‹•ÄÝÿÿ‰D‰T ‹E ƒ8Žëúÿÿ‹E ƒxŽÞúÿÿ‹]‹…¤Ýÿÿ‰ÀÁàˆ0‹…ÈÝÿÿ‹•ÌÝÿÿ‰D‰T ‹]‹…¤Ýÿÿ‰ÀÁàˆ0‹…ÐÝÿÿ‹•ÔÝÿÿ‰D‰T ‹]‹…¤Ýÿÿ‰ÀÁàˆ0‹…ØÝÿÿ‹•ÜÝÿÿ‰D‰T éaúÿÿ…¨ßÿÿƒìPhêàèLæÿÿƒÄ‰À‰À…Àu!‹M‹…¨Ýÿÿ‹•¬Ýÿÿ‰8I‰‘äÿÿƒÄ‰À‰À‰…¤Ýÿÿƒ½¤Ýÿÿuécøÿÿvv…¤Ýÿÿÿ‹…¤Ýÿÿ€8 tíÇ…dÝÿÿvƒì …hÝÿÿP…pÝÿÿP…xÝÿÿP…€ÝÿÿP…ˆÝÿÿP…ÝÿÿP…˜ÝÿÿPh áÿµ¤ÝÿÿèˆåÿÿƒÄ0‰…`Ýÿÿ‹…`Ýÿÿƒøtéß÷ÿÿv‹]‹…dÝÿÿ‰ÀÁàˆPI‹…˜Ýÿÿ‹•œÝÿÿ‰D ‰T‹]‹…dÝÿÿ‰ÀÁàˆ`K‹…Ýÿÿ‹•”Ýÿÿ‰D‰T‹]‹…dÝÿÿ‰ÀÁàˆ`M‹…ˆÝÿÿ‹•ŒÝÿÿ‰D ‰T‹]‹…dÝÿÿ‰ÀÁàˆpO‹…€Ýÿÿ‹•„Ýÿÿ‰D‰T‹]‹…dÝÿÿ‰ÀÁàˆpQ‹…pÝÿÿ‹•tÝÿÿ‰D ‰T‹]‹…dÝÿÿ‰ÀÁàˆ€S‹…xÝÿÿ‹•|Ýÿÿ‰D‰T‹]‹…dÝÿÿ‰ÀÁàˆ€U‹…hÝÿÿ‹•lÝÿÿ‰D ‰T…dÝÿÿÿƒ½dÝÿÿ?~é®öÿÿ‰öƒìj ÿµ¤Ýÿÿè\âÿÿƒÄ‰À‰À‰…¤Ýÿÿƒ½¤Ýÿÿuéöÿÿv…¤Ýÿÿÿ‹…¤Ýÿÿ€8 tíé(þÿÿ…¨ßÿÿƒìPhHáèPâÿÿƒÄ‰À‰À…À…µ‹…`ÝÿÿH‰…dÝÿÿ‹…dÝÿÿ‰…TÝÿÿƒ½TÝÿÿ@~ Ç…TÝÿÿ@‹TÝÿÿ‰dÝÿÿÇ…\Ýÿÿv‹…\Ýÿÿ;…dÝÿÿ|ééõÿÿ‹Mk…\Ýÿÿ`K‹…\Ýÿÿ@‰D ‰ÃÁû‰\ ‹]k…\Ýÿÿˆ`Mk•\Ýÿÿ…¨Ýÿÿ‰À‹‹R‰D ‰Tÿ…\Ýÿÿë‘…¨ßÿÿƒìPhMáèxáÿÿƒÄ‰À‰À…À…‘‹…`ÝÿÿH‰…dÝÿÿ‹…dÝÿÿ‰…PÝÿÿƒ½PÝÿÿ@~ Ç…PÝÿÿ@‹PÝÿÿ‰dÝÿÿÇ…\Ýÿÿv‹…\Ýÿÿ;…dÝÿÿ|éõÿÿ‹]k…\ÝÿÿˆpOk•\Ýÿÿ…¨Ýÿÿ‰À‹‹R‰D‰Tÿ…\Ýÿÿëµ…¨ßÿÿƒìPhVáèÄàÿÿƒÄ‰À‰À…À…‘‹…`ÝÿÿH‰…dÝÿÿ‹…dÝÿÿ‰…LÝÿÿƒ½LÝÿÿ@~ Ç…LÝÿÿ@‹LÝÿÿ‰dÝÿÿÇ…\Ýÿÿv‹…\Ýÿÿ;…dÝÿÿ|é]ôÿÿ‹]k…\ÝÿÿˆpQk•\Ýÿÿ…¨Ýÿÿ‰À‹‹R‰D ‰Tÿ…\Ýÿÿëµ…¨ßÿÿƒìPh_áèàÿÿƒÄ‰À‰À…À…‘‹…`ÝÿÿH‰…dÝÿÿ‹…dÝÿÿ‰…HÝÿÿƒ½HÝÿÿ@~ Ç…HÝÿÿ@‹HÝÿÿ‰dÝÿÿÇ…\Ýÿÿv‹…\Ýÿÿ;…dÝÿÿ|é©óÿÿ‹]k…\Ýÿÿˆ€Sk•\Ýÿÿ…¨Ýÿÿ‰À‹‹R‰D‰Tÿ…\Ýÿÿëµ…¨ßÿÿƒìPhiáè\ßÿÿƒÄ‰À‰À…À…Móÿÿ‹…`ÝÿÿH‰…dÝÿÿ‹…dÝÿÿ‰…DÝÿÿƒ½DÝÿÿ@~ Ç…DÝÿÿ@‹DÝÿÿ‰dÝÿÿÇ…\Ýÿÿv‹…\Ýÿÿ;…dÝÿÿ|éõòÿÿ‹]k…\Ýÿÿˆ€Uk•\Ýÿÿ…¨Ýÿÿ‰À‹‹R‰D ‰Tÿ…\Ýÿÿ뵃ì ÿuôèÁßÿÿƒÄƒìhxßhsáèlàÿÿƒÄ‰À‰Eôƒ}ô„üƒìÿuôh …èßÿÿPèßÿÿƒÄƒìÿuôh …èßÿÿPèéÞÿÿƒÄ‰À…Àué¯vƒì…¨ÝÿÿøP…¨ÝÿÿðP…¨ÝÿÿèP…¨ÝÿÿàP…¨ÝÿÿØP…¨ÝÿÿÐP…¨ÝÿÿÈP…¨ÝÿÿÀP…¨Ýÿÿ¸P…¨Ýÿÿ°P…¨Ýÿÿ¨P…¨Ýÿÿ P…¨Ýÿÿ˜P…¨ÝÿÿP…¨ÝÿÿˆP…¨Ýÿÿ€P…¨ÝÿÿxP…¨ÝÿÿpP…¨ÝÿÿhP…¨Ýÿÿ`P…¨ÝÿÿXP…¨ÝÿÿPP…¨ÝÿÿHP…¨Ýÿÿ@P…¨Ýÿÿ8P…¨Ýÿÿ0P…¨Ýÿÿ(P…¨Ýÿÿ P…¨ÝÿÿP…¨ÝÿÿP…¨ÝÿÿP…¨ÝÿÿP…¨ÝÿÿøP…¨ÝÿÿðP…¨ÝÿÿèP…¨ÝÿÿàP…¨ÝÿÿØP…¨ÝÿÿÐP…¨ÝÿÿÈP…¨ÝÿÿÀP…¨Ýÿÿ¸P…¨Ýÿÿ°P…¨Ýÿÿ¨P…¨Ýÿÿ P…¨Ýÿÿ˜P…¨ÝÿÿP…¨ÝÿÿˆP…¨Ýÿÿƒè€P…¨ÝÿÿƒÀxP…¨ÝÿÿƒÀpP…¨ÝÿÿƒÀhP…¨ÝÿÿƒÀ`P…¨ÝÿÿƒÀXP…¨ÝÿÿƒÀPP…¨ÝÿÿƒÀHP…¨ÝÿÿƒÀ@P…¨ÝÿÿƒÀ8P…¨ÝÿÿƒÀ0P…¨ÝÿÿƒÀ(P…¨ÝÿÿƒÀ P…¨ÝÿÿƒÀP…¨ÝÿÿƒÀP…¨ÝÿÿƒÀP…¨ÝÿÿP…dÝÿÿPh á…èßÿÿPèâÜÿÿĉ…`Ýÿÿƒ½`ÝÿÿéÈüÿÿ‹…`ÝÿÿH‰…¤Ýÿÿ‹…¤Ýÿÿ‰…@Ýÿÿƒ½@Ýÿÿ ~ Ç…@Ýÿÿ ‹@Ýÿÿ‰¤ÝÿÿÇ…\Ýÿÿ‰ö‹…\Ýÿÿ;…¤Ýÿÿ|éqüÿÿ‹]‹…\ÝÿÿÁà…dÝÿÿkÀˆ0 k•\Ýÿÿ…¨Ýÿÿ‰À‹‹R‰D‰T ÿ…\Ýÿÿ몉öƒì ÿuôè¡ÛÿÿƒÄƒìhxßhæâèLÜÿÿƒÄ‰À‰Eôƒ}ôtxƒìÿuôh …èßÿÿPèçÚÿÿƒÄ‰À…ÀtJƒì‹ETIP‹ELIP‹EHIP‹EDIP‹E@IPhôâ…èßÿÿPèÛÿÿƒÄ ‰…`Ýÿÿƒì ÿuôè ÛÿÿƒÄƒìhxßhãè´ÛÿÿƒÄ‰À‰Eôƒ}ô„”Ç…¤Ýÿÿƒìÿuôh …èßÿÿPèAÚÿÿƒÄ‰À…À„Xƒ½¤ÝÿÿéJ‰ö…hÝÿÿP…¨ßÿÿPhã…èßÿÿPèÛÿÿƒÄ‰…`Ýÿÿƒ½`Ýÿÿë™…¨ßÿÿƒìPhãèLÙÿÿƒÄ‰À‰À…Àu#‹E‹•hÝÿÿ‹lÝÿÿ‰”W‰ˆ˜W…¤Ýÿÿÿ…¨ßÿÿƒìPh#ãè ÙÿÿƒÄ‰À‰À…Àu#‹E‹•hÝÿÿ‹lÝÿÿ‰œW‰ˆ W…¤Ýÿÿÿ…¨ßÿÿƒìPh+ãèÈØÿÿƒÄ‰À‰À…Àu#‹E‹•hÝÿÿ‹lÝÿÿ‰¤W‰ˆ¨W…¤Ýÿÿÿ…¨ßÿÿƒìPh2ãè†ØÿÿƒÄ‰À‰À…À…¯þÿÿ‹E‹•hÝÿÿ‹lÝÿÿ‰¬W‰ˆ°W…¤Ýÿÿÿé‡þÿÿvƒì ÿuôèQÙÿÿƒÄ‹]üÉÃU‰åìHÇ…¼ûÿÿƒìj8jÿuèÆÙÿÿƒÄƒìhxßh:ãèÑÙÿÿƒÄ‰À‰Eôƒ}ôué‰övƒìÿuôh…èûÿÿPèaØÿÿƒÄ‰À…À„܃½¼ûÿÿéΉö…ÀûÿÿP…ÈûÿÿPhã…èûÿÿPè%ÙÿÿƒÄ‰Àƒøë¡…ÈûÿÿƒìPhHãèt×ÿÿƒÄ‰À‰À…Àu‹M‹…Àûÿÿ‹•Äûÿÿ‰‰Qÿ¼ûÿÿ…ÈûÿÿƒìPhRãè;×ÿÿƒÄ‰À‰À…Àu‹M‹…Àûÿÿ‹•Äûÿÿ‰A‰Q ÿ¼ûÿÿ…ÈûÿÿƒìPh[ãè×ÿÿƒÄ‰À‰À…Àu‹M‹…Àûÿÿ‹•Äûÿÿ‰A‰Qÿ¼ûÿÿ…ÈûÿÿƒìPhdãèÇÖÿÿƒÄ‰À‰À…Àu‹M‹…Àûÿÿ‹•Äûÿÿ‰A‰Qÿ¼ûÿÿ…ÈûÿÿƒìPhlãèÖÿÿƒÄ‰À‰À…Àu‹M‹…Àûÿÿ‹•Äûÿÿ‰A ‰Q$ÿ¼ûÿÿ…ÈûÿÿƒìPhrãèSÖÿÿƒÄ‰À‰À…Àu‹M‹…Àûÿÿ‹•Äûÿÿ‰A(‰Q,ÿ¼ûÿÿ…ÈûÿÿƒìPh}ãèÖÿÿƒÄ‰À‰À…À…"þÿÿ‹M‹…Àûÿÿ‹•Äûÿÿ‰A0‰Q4ÿ¼ûÿÿéþÿÿ‰öƒì ÿuôèíÖÿÿƒÄÉÃU‰åìÇEôƒìj …èíÿÿPÿu ètƒÄ‰À‰Eô‹U‹EôÁø@Áàf‰B‹Efƒx v ‹EfÇ@ ÉÉöU‰åƒìƒì‹E·P‰ÐÁàÐÁàPjÿuè×ÿÿƒÄƒì‹E·@Pÿuÿu èƒÄÉÃU‰åì(Ç…àûÿÿƒìhxßh‡ãèëÖÿÿƒÄ‰À‰Eôƒ}ôu ¸éóvvƒìÿuôh…èûÿÿPèuÕÿÿƒÄ‰À…Àué³v‹…àûÿÿ;E|é …èûÿÿƒìj:PèsÔÿÿƒÄ‰À‰À‰…äûÿÿƒ½äûÿÿt ‹…äûÿÿÆ ‹Eƒ8…¨‹Eƒx›ƒìhjÿu èÖÿÿƒÄƒì‹E ƒè€P‹E ƒÀxP‹E ƒÀpP‹E ƒÀhP‹E ƒÀ`P‹E ƒÀXP‹E ƒÀ8P‹E ƒÀ0P‹E ƒÀ(P‹E ƒÀ P‹E ƒÀPÿu h ã…èûÿÿPè’ÕÿÿƒÄ@‰…Üûÿÿƒ½Üûÿÿ ´‹E Æéåþÿÿƒì‹E ˆP‹E ƒè€P‹E ƒÀxP‹E ƒÀpP‹E ƒÀhP‹E ƒÀ`P‹E ƒÀXP‹E ƒÀPP‹E ƒÀHP‹E ƒÀ@P‹E ƒÀ8P‹E ƒÀ0P‹E ƒÀ(P‹E ƒÀ P‹E ƒÀP‹E ƒÀPÿu hàã…èûÿÿPèçÔÿÿƒÄP‰…Üûÿÿƒ½Üûÿÿ ‹E Æé>þÿÿ‰öÿ…àûÿÿE é(þÿÿƒì ÿuôè)ÔÿÿƒÄ‹…àûÿÿÉÉöU‰åìˆÇ…€úÿÿƒìh¨jÿuè—ÔÿÿƒÄƒìhxßhèè¢ÔÿÿƒÄ‰À‰Eôƒ}ô„6ƒìÿuôh…èûÿÿPè9ÓÿÿƒÄ‰À…Àuévƒì…ˆúÿÿ8P…ˆúÿÿ0P…ˆúÿÿ(P…ˆúÿÿ P…ˆúÿÿP…ˆúÿÿP…ˆúÿÿP…ˆúÿÿP…ˆúÿÿøP…ˆúÿÿðP…ˆúÿÿèP…ˆúÿÿàP…ˆúÿÿØP…ˆúÿÿÐP…ˆúÿÿÈP…ˆúÿÿÀP…ˆúÿÿ¸P…ˆúÿÿ°P…ˆúÿÿ¨P…ˆúÿÿ P…ˆúÿÿ˜P…ˆúÿÿP…ˆúÿÿˆP…ˆúÿÿƒè€P…ˆúÿÿƒÀxP…ˆúÿÿƒÀpP…ˆúÿÿƒÀhP…ˆúÿÿƒÀ`P…ˆúÿÿƒÀXP…ˆúÿÿƒÀPP…ˆúÿÿƒÀHP…ˆúÿÿƒÀ@P…ˆúÿÿƒÀ8P…ˆúÿÿƒÀ0P…ˆúÿÿƒÀ(P…ˆúÿÿƒÀ P…ˆúÿÿƒÀP…ˆúÿÿƒÀP…ˆúÿÿƒÀP…ˆúÿÿP…ÈûÿÿPh@è…èûÿÿPèRÒÿÿ݉…„úÿÿƒ½„úÿÿéèýÿÿ…ÈûÿÿƒìPhéè”ÐÿÿƒÄ‰À‰À…Àu!ƒìh˜…ˆúÿÿPÿuèrÑÿÿƒÄéªýÿÿ‰ö…ÈûÿÿƒìPhéèTÐÿÿƒÄ‰À‰À…Àu%ƒìhÐ…ˆúÿÿP‹E˜Pè,ÑÿÿƒÄédýÿÿ…ÈûÿÿƒìPhéèÐÿÿƒÄ‰À‰À…Àu%ƒìjp…ˆúÿÿP‹EhPèëÐÿÿƒÄé#ýÿÿv…ÈûÿÿƒìPhéèÌÏÿÿƒÄ‰À‰À…À…ýüÿÿƒìj …ˆúÿÿP‹EØPè£ÐÿÿƒÄéÛüÿÿvƒì ÿuôèÐÿÿƒÄƒìhxßh"éèHÑÿÿƒÄ‰À‰Eôƒ}ô„÷Ç…€úÿÿƒìh°jh õèøÐÿÿƒÄƒìhàjh€öèáÐÿÿƒÄƒìj jh`öèÍÐÿÿƒÄ‰öƒìÿuôh…èûÿÿPè‘ÏÿÿƒÄ‰À…Àuév…ˆúÿÿP…ÈûÿÿPhã…èûÿÿPèaÐÿÿƒÄ‰…„úÿÿ•Èûÿÿk€úÿÿ¸ ðƒìRÿ4èªÎÿÿƒÄ‰À‰À…Àu#k•€úÿÿ¸$ð‹ ‹…ˆúÿÿ‹•Œúÿÿ‰‰QëÇ…€úÿÿ‰ö‹…€úÿÿ;Ðñ|ë4•Èûÿÿk€úÿÿ¸ ðƒìRÿ4èBÎÿÿƒÄ‰À‰À…Àuë ÿ…€úÿÿ뼋…€úÿÿ;Ðñ} k•€úÿÿ¸$ð‹ ‹…ˆúÿÿ‹•Œúÿÿ‰‰Qÿ…€úÿÿ‹…€úÿÿ;ÐñŒÎþÿÿÇ…€úÿÿé¿þÿÿvƒìh°h õ‹EøPè¹ÎÿÿƒÄƒìhàh€ö‹E¨Pè›ÎÿÿƒÄƒìj h`ö‹EˆPè€ÎÿÿƒÄƒì ÿuôè‚ÎÿÿƒÄÉÃU‰åìHƒìhhjÿuèÏÿÿƒÄƒìhxßh2éè ÏÿÿƒÄ‰À‰Eôƒ}ô„ô‰öƒìÿuôh…èûÿÿPè¡ÍÿÿƒÄ‰À…Àué¿vƒì…ÈúÿÿøP…ÈúÿÿðP…ÈúÿÿèP…ÈúÿÿàP…ÈúÿÿØP…ÈúÿÿÐP…ÈúÿÿÈP…ÈúÿÿÀP…Èúÿÿ¸P…Èúÿÿ°P…Èúÿÿ¨P…Èúÿÿ P…Èúÿÿ˜P…ÈúÿÿP…ÈúÿÿˆP…Èúÿÿƒè€P…ÈúÿÿƒÀxP…ÈúÿÿƒÀpP…ÈúÿÿƒÀhP…ÈúÿÿƒÀ`P…ÈúÿÿƒÀXP…ÈúÿÿƒÀPP…ÈúÿÿƒÀHP…ÈúÿÿƒÀ@P…ÈúÿÿƒÀ8P…ÈúÿÿƒÀ0P…ÈúÿÿƒÀ(P…ÈúÿÿƒÀ P…ÈúÿÿƒÀP…ÈúÿÿƒÀP…ÈúÿÿƒÀP…ÈúÿÿP…ÈûÿÿPh`é…èûÿÿPèÍÿÿĉ…Äúÿÿƒ½ÄúÿÿéHþÿÿƒì jÿu‹…ÄúÿÿHP…ÈúÿÿP…ÈûÿÿPè1ƒÄ éþÿÿƒì ÿuôèIÌÿÿƒÄƒìhxßhêèôÌÿÿƒÄ‰À‰Eôƒ}ô„ô‰öƒìÿuôh…èûÿÿPè‰ËÿÿƒÄ‰À…Àué¿vƒì…ÈúÿÿøP…ÈúÿÿðP…ÈúÿÿèP…ÈúÿÿàP…ÈúÿÿØP…ÈúÿÿÐP…ÈúÿÿÈP…ÈúÿÿÀP…Èúÿÿ¸P…Èúÿÿ°P…Èúÿÿ¨P…Èúÿÿ P…Èúÿÿ˜P…ÈúÿÿP…ÈúÿÿˆP…Èúÿÿƒè€P…ÈúÿÿƒÀxP…ÈúÿÿƒÀpP…ÈúÿÿƒÀhP…ÈúÿÿƒÀ`P…ÈúÿÿƒÀXP…ÈúÿÿƒÀPP…ÈúÿÿƒÀHP…ÈúÿÿƒÀ@P…ÈúÿÿƒÀ8P…ÈúÿÿƒÀ0P…ÈúÿÿƒÀ(P…ÈúÿÿƒÀ P…ÈúÿÿƒÀP…ÈúÿÿƒÀP…ÈúÿÿƒÀP…ÈúÿÿP…ÈûÿÿPh`é…èûÿÿPèËÿÿĉ…Äúÿÿƒ½ÄúÿÿéHþÿÿƒì jÿu‹…ÄúÿÿHP…ÈúÿÿP…ÈûÿÿPèƒÄ éþÿÿƒì ÿuôè1ÊÿÿƒÄÉÃU‰åƒìƒìÿuhêèÉÿÿƒÄ‰À‰À…À…Ã}tQ‹M‹E ‹P‹‰‰Q‹M‹E ƒÀ‹P‹‰A‰Q ‹M‹E ƒÀ‹P‹‰A‰Q‹M‹E ƒÀ‹P‹‰A‰Qéà‹M‹E ‹P‹‰x‰‘|‹M‹E ƒÀ‹P‹‰€‰‘„‹M‹E ƒÀ‹P‹‰ˆ‰‘Œ‹M‹E ƒÀ‹P‹‰‰‘”év‰öƒìÿuhêè$ÈÿÿƒÄ‰À‰À…À…Ƀ}t?‹M‹E ‹P‹‰A ‰Q$‹M‹E ƒÀ‹P‹‰A(‰Q,‹M‹E ƒÀ‹P‹‰A0‰Q4é‹M‹E ‹P‹‰˜‰‘œ‹M‹E ƒÀ‹P‹‰ ‰‘¤‹M‹E ƒÀ‹P‹‰¨‰‘¬‹M‹E ƒÀ‹P‹‰°‰‘´‹M‹E ƒÀ ‹P‹‰¸‰‘¼éŒ‹E€8p…‹E@€8r…÷‹EƒÀ€8o…è‹EƒÀ€8c…Ù‹EƒÀƒì Pè†ÈÿÿƒÄ‰À‰À‰Eü‹Eü‰Eøƒ}øt ƒ}øtZé%ƒ}t&ƒìh ‹E ƒÀP‹EƒÀ8PèÃÇÿÿƒÄéûvƒìh ‹E ƒÀP‹EÀPè›ÇÿÿƒÄéÓvƒ}t&ƒìh ‹E ƒÀP‹EØPèmÇÿÿƒÄ饃ìh ‹E ƒÀP‹E`PèGÇÿÿƒÄévƒìÿuh!êè,ÆÿÿƒÄ‰À‰À…À…µƒ}téR‰ö‹M‹E ‹P‹‰‰‘‹M‹E ƒÀ‹P‹‰‰‘ ‹M‹E ƒÀ‹P‹‰‰‘ƒ} …û‹M‹E ƒÀ8‹P‹‰‰‘‹M‹E ƒÀ0‹P‹‰ ‰‘$‹M‹E ƒÀ(‹P‹‰(‰‘,騃ìÿuh$êèXÅÿÿƒÄ‰À‰À…À…‘ƒ}té~‰ö‹M‹E ‹P‹‰‰‘‹M‹E ƒÀ‹P‹‰ ‰‘$‹M‹E ƒÀ‹P‹‰(‰‘,‹M‹E ƒÀ‹P‹‰0‰‘4‹M‹E ƒÀ ‹P‹‰8‰‘<éøƒìÿuh'êè¨ÄÿÿƒÄ‰À‰À…ÀuEƒ}téÒ‰ö‹M‹E ‹P‹‰@‰‘D‹M‹E ƒÀ‹P‹‰H‰‘L隉öƒìÿuh*êèHÄÿÿƒÄ‰À‰À…Àu=ƒ}tëu‹M‹E ‹P‹‰P‰‘T‹M‹E ƒÀ‹P‹‰X‰‘\ëAƒìÿuh-êèðÃÿÿƒÄ‰À‰À…Àu%ƒ}të‹M‹E ‹P‹‰`‰‘dëvÉÉöU‰åìƒìjXjÿuèTÅÿÿƒÄƒìhxßhzßè_ÅÿÿƒÄ‰À‰Eôƒ}ô„ˆƒìÿuôh…èûÿÿPèõÃÿÿƒÄ‰À…ÀuëW‰ö…ûÿÿP…˜ûÿÿPhã…èûÿÿPèÉÄÿÿƒÄ…˜ûÿÿƒìh0êPè"ÃÿÿƒÄ‰À‰À…Àu›‹M‹…ûÿÿ‹•ûÿÿ‰‰Qƒì ÿuôèÄÿÿƒÄÇ…ûÿÿÇ…ûÿÿƒìhxßh:êèŸÄÿÿƒÄ‰À‰Eôƒ}ôtCƒìÿuôh…èûÿÿPè9ÃÿÿƒÄ‰À…Àuë‰öƒ…ûÿÿƒ•ûÿÿë̃ì ÿuôè‘ÃÿÿƒÄ‹E‹•ûÿÿ‹ûÿÿ‰P‰H ƒìhxßhFêè'ÄÿÿƒÄ‰À‰Eôƒ}ôt(ƒì‹EƒÀPh]êÿuôè’ÂÿÿƒÄƒì ÿuôè4ÃÿÿƒÄƒìhxßhbêèßÃÿÿƒÄ‰À‰Eôƒ}ôt(ƒì‹EƒÀ Ph]êÿuôèJÂÿÿƒÄƒì ÿuôèìÂÿÿƒÄƒìhxßhxêè—ÃÿÿƒÄ‰À‰Eôƒ}ôt(ƒì‹EƒÀHPh]êÿuôèÂÿÿƒÄƒì ÿuôè¤ÂÿÿƒÄƒìhxßhêèOÃÿÿƒÄ‰À‰Eôƒ}ôt(ƒì‹EƒÀPPh]êÿuôèºÁÿÿƒÄƒì ÿuôè\ÂÿÿƒÄ‹E ƒ8u%‹E ƒxƒìh¥ê…ûÿÿPè$ÃÿÿƒÄëvƒìh·ê…ûÿÿPèÃÿÿƒÄ…ûÿÿƒì Pè–ÁÿÿƒÄ‰À‰…ìúÿÿƒìhÅê…ûÿÿ…ìúÿÿPèÑÂÿÿƒÄƒìhxß…ûÿÿPèŠÂÿÿƒÄ‰À‰Eôƒ}ôt(ƒì‹EƒÀ(Ph]êÿuôèõÀÿÿƒÄƒì ÿuôè—ÁÿÿƒÄƒìhÎê…ûÿÿ…ìúÿÿPèjÂÿÿƒÄƒìhxß…ûÿÿPè#ÂÿÿƒÄ‰À‰Eôƒ}ôtM…ðúÿÿP…øúÿÿPhÖêÿuôèŠÀÿÿƒÄƒì ÿuôè,ÁÿÿƒÄ‹E‹•øúÿÿ‹üúÿÿ+•ðúÿÿôúÿÿ‰P0‰H4ƒìhàê…ûÿÿ…ìúÿÿPèÞÁÿÿƒÄƒìhxß…ûÿÿPè—ÁÿÿƒÄ‰À‰Eôƒ}ôt(ƒì‹EƒÀ8Ph]êÿuôèÀÿÿƒÄƒì ÿuôè¤ÀÿÿƒÄƒìhêê…ûÿÿ…ìúÿÿPèwÁÿÿƒÄƒìhxß…ûÿÿPè0ÁÿÿƒÄ‰À‰Eôƒ}ôt,‹EƒÀ8P‹EƒÀ@PhÖêÿuôè—¿ÿÿƒÄƒì ÿuôè9ÀÿÿƒÄÉÃU‰åì˜ÇEôÇEðƒìhxßhóêèËÀÿÿƒÄ‰À‰Eìƒ}섃ìÿuìh…hþÿÿPèa¿ÿÿƒÄ‰À…Àuéëvƒì …hÿÿÿƒÀlP…hÿÿÿƒÀdP…hÿÿÿƒÀ\P…hÿÿÿƒÀTP…hÿÿÿƒÀLP…hÿÿÿƒÀDP…hÿÿÿƒÀì´Ï`ì´Ï€ìÜÏ|î´Wœtî8œ°mîü²P³eî¨ȵ]îhh»UîXÅLît°ÉpÌCî@€Ñ;î8 LÔ3îPTÙÌÙ*îH Û„Û $Id: version.c,v 1.7 2002/09/03 12:09:21 root Exp root $ \ˆ Ý( …p‚ n œô0,‡‡þÿÿoä†ÿÿÿoðÿÿoކÿÿÿÿÿÿÿÿÄ󊈚ˆªˆºˆʈÚˆêˆúˆ ‰‰*‰:‰J‰Z‰j‰z‰Љš‰ª‰º‰ʉÚ‰ê‰ú‰ ŠŠ*Š:ŠJŠZŠjŠzŠŠŠšŠªŠºŠÊŠÚŠ¢ƒd‹d‹9<H€r€Œ€»€ó€0€€Ò€ý€,€V€€™€´€Õ€€1€V€€€©‚¢¢ ‚cV$‚ï[L‚b‚y‚¢¢¢‚ØÆ€Ç¢Ú€ ñ€!€"€#3€%K€&a€1x€2€3§€4À€5Ø€6ñ€8 €9"€;B€=X€>n€?„€@š€A±€BÉ€C߀Dö€E €F$€G;€HT€Ii€NÏ€Qç€R€S€T9€UU€Vm€X…€[Ÿ€^·€eÍ€hç€l €q €r5 €uP €vm €yˆ €z¥ €}½ €€Ö €ƒñ €„ €‡& €Š@ ‚Ë”t ‚Fœ €¢Ò € €#V €Y €4u €< €Cú €F €S© €Zç €^€Ù€lù€tM€yn€ö€†4€Œ¢¢‚ L€b€8¢w‚Š‚b‚¢œ‚¢É€K¢¢L€€#Ô‚ç‚5ÁLÂwŠ‚œ¢Âø€×€€H8€Kg€L˜€UË€Z€^?€aw€b¯€\€€û€r€­¢¢–€5 €7!€89€9S€:¢m d‹init.c/usr/src/build/87998-i386/BUILD/glibc-2.2.5/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/87998-i386/BUILD/glibc-2.2.5/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.got.bss.stab.stabstr.comment.noteô€ô# 1((H7 p‚p°? … nGÿÿÿoކŽVTþÿÿoä†ä0c ‡l ,‡,0 u\ˆ\ptˆtp{ðŠð RÝ]‡ Ý ]€ ðpÀ •ÀóÀsŸÄóÄsȨŒôŒt¯”ô”t¶œôœt¨»`õ`u À`u¤ Æ}ƒÏ‡–¸Ø?˜ ߘÞHžà G (¨ýô€(p‚ …ކ䆇,‡ \ˆ tˆ ðŠ Ý ÝðÀóÄóŒô”ôœô`õñÿñÿ‹ "‹ 2ñÿ@‹ =ðA”ôO ð[@‹ qÀó„ ‹ hõ˜°‹ ¤à‹ ¯ð½Œô2ñÿÀÜ ËÀÜ áô¤ðÜ ¯Àóî˜ôûÀóñÿÝ ñÿð‹ @Ý5ñÿœ @ß8#œÐã .€õ;´Ï( GÜϽ SàñÈ]¨òiñÿ¸Ü €ó9s„ˆQ…”³2 ”ˆg¢¬òª„õ ° ð°¶Ä󿤈DÒ´ˆ•"óĈ@Ôˆ%äˆ:' Ý.ôˆù@‰-SŘ Zh»P aTÙx i‰>{¬›â ƒ\ˆ ‰$‰p›ÌÙ@ ¢Ðñ°4‰-„Û4 ÊD‰%"íü²R ô`õœ°` pÌD T‰D#ðŠ *d‰@;õCt‰¯ULÔ \„‰:mðv”‰/ˆ Ûx ‘P³C —¸¿^ Ÿ¤‰±Dõñÿ½ȵŸ Äð‹€  Ép• Ò õ°Û`ó〛) ëðô´‰Óœ  ð #Ý )ĉ@:Ô‰'L䉉^ô‰:o`ö yŠ>‘Š1¥$Š@µ4ŠüÈDŠåØTŠ+è°É¾ ïdŠ-DõñÿœôtŠô.`÷ñÿ3„ŠCEdõZ€ÑÌ b”Šœu¤Š †´Š:•$ݤð±°ò°¹¬òÁÄŠ@Ñ àÔŠ0ò€öàinit.cinitfini.cgcc2_compiled.call_gmon_startcrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__atsadc.crcsidfetchdef.cisrealdiskusediskstatsnullmodnameabbrevname1validdiskfirstcall.0version.cusleep@@GLIBC_2.0getifstatsstrchr@@GLIBC_2.0oncecntosrelv6tab_DYNAMICregexec@@GLIBC_2.0__register_frame_info@@GLIBC_2.0write@@GLIBC_2.0strcmp@@GLIBC_2.0close@@GLIBC_2.0_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0tabgetnfsgetftpinitaccess@@GLIBC_2.0numcpus_initmalloc@@GLIBC_2.0ftpgetv6tab_entriesfscanf@@GLIBC_2.0httpget__deregister_frame_info@@GLIBC_2.0ifinitstderr@@GLIBC_2.0memgetdkgettime@@GLIBC_2.0_startfgets@@GLIBC_2.0outfilestrlen@@GLIBC_2.0ttygetuname@@GLIBC_2.0nsamplesstrtol@@GLIBC_2.0httpinitifgetnfsfillmemcmp@@GLIBC_2.0__bss_startnetgetmainwritehdripv6_tmpsampcntprusageinterval__libc_start_main@@GLIBC_2.0gengetdata_start_finilseek@@GLIBC_2.0memcpy@@GLIBC_2.0fclose@@GLIBC_2.1times@@GLIBC_2.0udpv6_tmpgettimeofday@@GLIBC_2.0snprintf@@GLIBC_2.0open@@GLIBC_2.0regcomp@@GLIBC_2.0exit@@GLIBC_2.0atoi@@GLIBC_2.0dkinitsscanf@@GLIBC_2.0_edata_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endmemset@@GLIBC_2.0__ctype_b@@GLIBC_2.0sockgetstrncpy@@GLIBC_2.0fopen@@GLIBC_2.1dup@@GLIBC_2.0_IO_stdin_used__data_startsampdefoncedefread@@GLIBC_2.0__gmon_start__strcpy@@GLIBC_2.0icmpv6_tmpatsar-1.7/atsadc/Makefile0000644000175000017500000000033210073242162016221 0ustar mstonemstone00000000000000all: atsadc atsadc: atsadc.o fetchdef.o cc -o atsadc atsadc.o fetchdef.o ../version.o atsadc.o: ../include/atsar.h fetchdef.o: ../include/atsar.h ../include/includes.h ../include/linuxstat.h clean: rm *.o atsar-1.7/atsadc/atsadc.c0000444000175000017500000003006510073242162016170 0ustar mstonemstone00000000000000#include "includes.h" /* ** System Activity Data Collector ** ** The program 'atsadc' offers the possibility to read statistical counters ** from the /proc (sub)directory and write it periodically to stdout or a file. ** The program has been designed to operate as a framework to which ** new counters can be added very easily (table-driven). It cooperates ** with the reporting program 'atsar' in a similar way as the standard UNIX ** 'sadc' cooperates with 'sar'. ** ================================================================ ** Author: Gerlof Langeveld - AT Computing, Nijmegen, Holland ** E-mail: gerlof@ATComputing.nl ** Date: Januar 1995 ** LINUX-port: Februar 1999 ** ** $Log: atsadc.c,v $ ** Revision 1.6 2004/07/08 12:51:40 gerlof ** Adapted for kernel version 2.6. ** ** Revision 1.5 2000/11/07 09:22:42 gerlof ** *** empty log message *** ** ** Revision 1.4 1999/09/01 07:11:47 gerlof ** Ported to Alpha. ** ** Revision 1.3 1999/08/26 06:58:53 gerlof ** Code-cleanup and new code to determine number of cpu's (this modified ** the header of the statistics-file as well). ** ** Revision 1.2 1999/05/18 08:31:30 gerlof ** Back-port from version 2.2 to 2.0. ** ** Revision 1.1 1999/05/05 11:38:27 gerlof ** Initial revision ** ** ** ** This program is free software; you can redistribute it and/or modify it ** under the terms of the GNU General Public License as published by the ** Free Software Foundation; either version 2, or (at your option) any ** later version. ** ** This program is distributed in the hope that it will be useful, but ** WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details. */ static const char rcsid[] = "$Id: atsadc.c,v 1.6 2004/07/08 12:51:40 gerlof Exp $"; /* ** definition of the counters to be read from /proc */ extern struct fetchdef oncedef[]; extern int oncecnt; /* number of entries */ extern struct fetchdef sampdef[]; extern int sampcnt; /* number of entries */ /* ** Kernel-version info */ struct osrel osrel; /* ** values of the command-line arguments */ char *outfile; int interval = 0; int nsamples = 0; /* ** Function prototypes */ void writehdr(int, int, int, int, int); void prusage(char *); int numcpus(void); int main(int argc, char *argv[]) { register int i; char newfile; /* boolean: appended file */ int ofd; /* output file-descriptor */ int cycle; /* count for nr of samples */ struct filehdr filehdr; struct samphdr samphdr; struct tms timbuf; int namosize, namssize; int varosize, varssize; register unsigned long tmpoff; register char *tmpcnt; struct utsname utsname; struct timeval tval; long intervalnano; long secsnext; /* ** check if enough parameters have been specified */ if ( argc > 1 ) { if ( isdigit(*argv[1]) ) /* file or timeout as first */ { interval = atoi(argv[1]); if (interval <= 0) prusage(argv[0]); if ( argc < 3 || !isdigit(*argv[2]) ) prusage(argv[0]); nsamples = atoi(argv[2]); if ( argc > 3 ) outfile = argv[3]; } else { outfile = argv[1]; } } /* ** open the counter output file (default: stdout) */ if ( !outfile ) { ofd = dup(1); newfile = 1; } else { if ( access(outfile, W_OK) == -1 ) { /* ** check if call during init-switch to state 2 ** ----> filename, but no interval */ if (!interval) exit(0); /* ignore call */ /* ** file does not exist yet; create new */ if ( (ofd = open(outfile, O_WRONLY|O_CREAT, 0664)) ==-1) { perror("create output file"); exit(1); } newfile = 1; } else { /* ** file exists: check if this is a statistics file; ** if it is, seek to the end for appending */ if ( (ofd = open(outfile, O_RDWR)) == -1) { perror("open output file"); exit(1); } if ( read(ofd, &filehdr, sizeof(filehdr)) == -1) { perror("verify output file"); exit(1); } if ( filehdr.magic != ATMAGIC ) { fprintf(stderr, "existing file %s has wrong format\n", outfile); exit(6); } (void) lseek(ofd, 0, SEEK_END); newfile = 0; /* ** write a dummy sample header to indicate ** a system-reboot if started without t and n. */ if (!interval) { samphdr.curtim = time(0); samphdr.curlbolt= times(&timbuf); samphdr.cntsize = 0; /* dummy */ if ( write(ofd, &samphdr, sizeof(samphdr))==-1) { perror("write restart"); exit(1); } (void) close(ofd); exit(0); } } } /* ** determine the kernel-version of this system */ uname(&utsname); sscanf(utsname.release, "%d.%d.%d", &(osrel.rel), &(osrel.vers), &(osrel.sub)); if ( osrel.rel < 2 ) { fprintf(stderr, "\nLINUX-version %d.%d not supported!\n", osrel.rel, osrel.vers); exit(5); } /* ** check total space in file needed for names of kernel ** variables and for the counters themselves ** ** all variable sizes are rounded up to 8-bytes units to avoid ** alignment problems with subsequent variables */ for (i=0, namosize=0, varosize=0; i < oncecnt; i++) { if (oncedef[i].initcnt) (oncedef[i].initcnt)(&oncedef[i], &osrel); if (oncedef[i].cdef.ksize & 7) oncedef[i].cdef.ksize = ((oncedef[i].cdef.ksize >> 3) + 1) << 3; varosize += oncedef[i].cdef.ksize * oncedef[i].cdef.kinst; namosize += strlen(oncedef[i].cdef.kname) + 1; } if (namosize & 0x0f) /* not multiple of 16 bytes ?*/ namosize = ((namosize>>4) +1) << 4; for (i=0, namssize=0, varssize=0; i < sampcnt; i++) { if (sampdef[i].initcnt) (sampdef[i].initcnt)(&sampdef[i], &osrel); if (sampdef[i].cdef.ksize & 7) sampdef[i].cdef.ksize = ((sampdef[i].cdef.ksize >> 3) + 1) << 3; varssize += sampdef[i].cdef.ksize * sampdef[i].cdef.kinst; namssize += strlen(sampdef[i].cdef.kname) + 1; } if (namssize & 0x0f) /* not multiple of 16 bytes ?*/ namssize = ((namssize>>4) +1) << 4; /* ** write the headers only for a new file or pipe; ** if appending to an existing file, check the consistency and ** take care that the counter-areas keep the same size */ if (newfile) { writehdr(ofd, namosize, namssize, varosize, varssize); } else { if ( filehdr.oncecnt != oncecnt || filehdr.oncenames != namosize || filehdr.oncevars != varosize || filehdr.sampcnt != sampcnt || filehdr.sampnames != namssize || filehdr.sampvars != varssize || strcmp(filehdr.utsinfo.release, utsname.release) ) { fprintf(stderr, "This existing file cannot be appended\n"); exit(7); } } /* ** allocate a buffer which is big enough to hold all ** counters of one sample */ if ( (tmpcnt = (char *) malloc(varssize)) == NULL) { perror("cannot malloc"); exit(5); } /* ** main loop: ** read all defined statistic structures and ** transfer to file/pipe */ gettimeofday(&tval, (struct timezone *) 0); secsnext = tval.tv_sec; intervalnano = interval * 1000000; for (cycle=0; cycle < nsamples; cycle++) { /* ** wait for interval ** except for the very first cycle */ if (cycle) { /* sleep(interval); --> may cause time-deviation */ gettimeofday(&tval, (struct timezone *) 0); if(tval.tv_sec >= secsnext) usleep(intervalnano - tval.tv_usec); else usleep(intervalnano - tval.tv_usec + 1000000); secsnext += interval; } /* ** gather all counters by calling functions ** defined in sampdef-table */ samphdr.curtim = time(0); samphdr.curlbolt= times(&timbuf); samphdr.cntsize = varssize; for (i=0, tmpoff=0; i < sampcnt; i++) { (sampdef[i].getcnt)(&sampdef[i], &osrel, tmpcnt+tmpoff); tmpoff += sampdef[i].cdef.ksize * sampdef[i].cdef.kinst; } /* ** write the sample-header and -data */ if ( write(ofd, &samphdr, sizeof(samphdr)) < 0) { perror("write of sample header"); exit(1); } if ( write(ofd, tmpcnt, varssize) < 0) { perror("write of sample counters"); exit(1); } } (void) close(ofd); return 0; } /* ** write all static header-info to file/pipe, except the sample data ** ofd - file descriptor of open output file ** namosz - size of total space for 'once' names ** namssz - size of total space for 'samp' names ** varosz - size of total space for 'once' counters ** varssz - size of total space for 'samp' counters */ void writehdr(int ofd, int namosz, int namssz, int varosz, int varssz) { register int i; struct filehdr filehdr; char *tmpname; struct countdef *tmpdef; register unsigned long tmpoff; register char *tmpcnt; int oncetot; /* total countdef size */ int samptot; /* total countdef size */ oncetot = oncecnt * sizeof(struct countdef); samptot = sampcnt * sizeof(struct countdef); filehdr.magic = ATMAGIC; filehdr.hdrsize = sizeof(struct filehdr); filehdr.oncecnt = oncecnt; filehdr.oncenames = namosz; filehdr.oncevars = varosz; filehdr.sampcnt = sampcnt; filehdr.sampnames = namssz; filehdr.sampvars = varssz; filehdr.hertz = HZ; filehdr.numcpu = numcpus(); uname(&filehdr.utsinfo); if ( write(ofd, &filehdr, sizeof(filehdr)) < 0) { perror("write of header data"); exit(1); } /* ** build name table for counters which are only read once */ if ( (tmpdef = (struct countdef *) malloc(oncetot)) == NULL) { perror("cannot malloc"); exit(5); } if ( (tmpname = (char *) malloc(namosz)) == NULL) { perror("cannot malloc"); exit(5); } for (i=0, tmpoff=0; i < oncecnt; i++) { register int len; len = strlen(oncedef[i].cdef.kname)+1; memcpy(tmpname+tmpoff, oncedef[i].cdef.kname, len); (tmpdef+i)->kname = (char *) tmpoff; (tmpdef+i)->ksize = oncedef[i].cdef.ksize; (tmpdef+i)->kinst = oncedef[i].cdef.kinst; tmpoff += len; } if ( write(ofd, tmpdef, oncetot) < 0) { perror("write of counter definition data"); exit(1); } if ( write(ofd, tmpname, namosz) < 0) { perror("write of counter names"); exit(1); } (void) free(tmpname); (void) free(tmpdef); /* ** build name table for counters which are read each sample */ if ( (tmpdef = (struct countdef *) malloc(samptot)) == NULL) { perror("cannot malloc"); exit(5); } if ( (tmpname = (char *) malloc(namssz)) == NULL) { perror("cannot malloc"); exit(5); } for (i=0, tmpoff=0; i < sampcnt; i++) { register int len; len = strlen(sampdef[i].cdef.kname)+1; memcpy(tmpname+tmpoff, sampdef[i].cdef.kname, len); (tmpdef+i)->kname = (char *) tmpoff; (tmpdef+i)->ksize = sampdef[i].cdef.ksize; (tmpdef+i)->kinst = sampdef[i].cdef.kinst; tmpoff += len; } if ( write(ofd, tmpdef, samptot) < 0) { perror("write of counter definition data"); exit(1); } if ( write(ofd, tmpname, namssz) < 0) { perror("write of counter names"); exit(1); } (void) free(tmpname); (void) free(tmpdef); /* ** read only once the non-changing kernel counters ** and transfer to file/pipe */ if ( (tmpcnt = (char *) malloc(varosz)) == NULL) { perror("cannot malloc"); exit(5); } for (i=0, tmpoff=0; i < oncecnt; i++) { (oncedef[i].getcnt)(&oncedef[i], &osrel, tmpcnt+tmpoff); tmpoff += oncedef[i].cdef.ksize * oncedef[i].cdef.kinst; } if ( write(ofd, tmpcnt, varosz) < 0) { perror("write of counters"); exit(1); } (void) free(tmpcnt); } /* ** print the usage string and abort */ void prusage(char *pname) { fprintf(stderr, "usage: %s [t n] [ofile]\n", pname); exit(1); } /* ** Determine number of cpu's active on this system (return value). */ int numcpus(void) { FILE *fp; int cnt = 0; char linebuf[1024], fw[80]; /* ** obtain info about number of processors installed by counting ** all lines in the file /proc/stat which start with the ** string "cpu[0-9]" (per-cpu lines); if these lines are not ** present, just one cpu is installed */ if ( (fp = fopen("/proc/stat", "r")) == NULL) return 1; /* assume one cpu */ while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { sscanf(linebuf, "%s ", fw); if (fw[0] == 'c' && fw[1] == 'p' && fw[2] == 'u' && fw[3] !=0) cnt++; } fclose(fp); return (cnt > 0 ? cnt : 1); } atsar-1.7/atsadc/fetchdef.c0000444000175000017500000013417610073242162016511 0ustar mstonemstone00000000000000#include "includes.h" /* ** This file contains the definitions about which counters have to be ** read from /proc ** ** New counters can be added to the tables in this file as follows: ** Define if the counter-contents is static (e.g. a kernel-param) ** and only has to be read once, or if the counter dynamically ** changes (to be read per sample). In case of a static counter ** add its specification to the 'oncedef' table and for dynamic ** counter, add its specification to the 'sampdef' table. ** ** --------------------------------------------------------------------- ** Author: Gerlof Langeveld - AT Computing, Nijmegen, Holland ** E-mail: gerlof@ATComputing.nl ** Date: Januar 1995 ** LINUX-port: Februar 1999 ** ** $Log: fetchdef.c,v $ ** Revision 1.22 2004/07/08 12:52:03 gerlof ** Adapted for kernel version 2.6. ** Support of new disk-names. ** ** Revision 1.21 2002/09/03 12:06:16 gerlof ** Corrected number of open files and maximum number of open inodes. **  ** ** Revision 1.20 2001/03/16 09:37:18 root ** Reimplement FTP/HTTP counters. ** ** Revision 1.19 2001/03/14 14:04:53 gerlof ** Changed numbers of disks 2.2 ** ** Revision 1.18 2001/03/14 11:08:01 gerlof ** TTY statistics added. ** ** Revision 1.17 2001/03/12 14:57:48 gerlof ** IPv6 counters. ** ** Revision 1.16 2001/03/09 15:08:55 gerlof ** Support IP version 6 counters (/proc/net/snmp6). ** ** Revision 1.15 2001/02/26 15:34:53 gerlof ** Gather load-averages from /proc/loadavg. ** ** Revision 1.14 2001/02/26 15:28:14 gerlof ** Use counters of type 'double' i.s.o. long for HTTP and FTP. ** ** Revision 1.13 2000/11/07 09:23:07 gerlof ** Support for modified per-partition statistics. ** ** Revision 1.12 2000/08/09 11:27:32 gerlof ** Changes needed for per-partition counters (larger disk-names). ** ** Revision 1.11 2000/06/29 05:52:06 gerlof ** Bug: the file opened for NFS statistics was never closed, so after 1024 ** samples, atsadc ran out of file-descriptors. ** ** Revision 1.10 1999/10/18 12:58:53 gerlof ** Separate counters for FTP-input and -output. ** ** Revision 1.9 1999/09/16 09:27:07 gerlof ** Minor code-restyling. ** ** Revision 1.8 1999/09/01 07:12:09 gerlof ** Ported to Alpha. ** ** Revision 1.7 1999/08/31 09:34:29 gerlof ** Implement support for WEB-servers. ** Porting to version 2.0. ** ** Revision 1.6 1999/08/27 14:05:32 gerlof ** Added NFS-statistics. ** ** Revision 1.5 1999/08/26 07:47:19 gerlof ** Code-cleanup, removed all counters obtained from /dev/kmem (obtained via ** /proc now) and gathered new counters (a.o. socket-stats). ** ** Revision 1.4 1999/05/18 08:31:19 gerlof ** Back-port from version 2.2 to 2.0. ** ** Revision 1.3 1999/05/11 09:07:33 gerlof ** Add support for disk-partition statistics and kernel-tables. ** ** Revision 1.2 1999/05/10 10:13:19 gerlof ** Gather statistics about kernel-table occupation (parinfo). ** ** Revision 1.1 1999/05/05 11:38:33 gerlof ** Initial revision ** ** This program is free software; you can redistribute it and/or modify it ** under the terms of the GNU General Public License as published by the ** Free Software Foundation; either version 2, or (at your option) any ** later version. ** ** This program is distributed in the hope that it will be useful, but ** WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details. */ static const char rcsid[] = "$Id: fetchdef.c,v 1.22 2004/07/08 12:52:03 gerlof Exp $"; static int isrealdisk(char *, char *, int); #define EQ 0 /*************************************************************/ /* specific routines which are defined above */ /*************************************************************/ #define MAXCNT 64 /* ** Gather general system statistics from /proc and store in binary form. */ void genget(struct fetchdef *fdef, struct osrel *osrel, struct genstat *gs) { register int nr, i; FILE *fp; char linebuf[8192], nam[64]; count_t cnts[MAXCNT]; memset(gs, 0, sizeof(struct genstat)); /* ** gather various general statistics from the file /proc/stat and ** store them in binary form in a proprietary structure. */ if ( (fp = fopen("/proc/stat", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { nr = sscanf(linebuf, "%s %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld\n", nam, &cnts[0], &cnts[1], &cnts[2], &cnts[3], &cnts[4], &cnts[5], &cnts[6], &cnts[7], &cnts[8], &cnts[9], &cnts[10], &cnts[11], &cnts[12], &cnts[13], &cnts[14], &cnts[15], &cnts[16], &cnts[17], &cnts[18], &cnts[19], &cnts[20], &cnts[21], &cnts[22], &cnts[23], &cnts[24], &cnts[25], &cnts[26], &cnts[27], &cnts[28], &cnts[29], &cnts[30], &cnts[31], &cnts[32], &cnts[33], &cnts[34], &cnts[35], &cnts[36], &cnts[37], &cnts[38], &cnts[39], &cnts[40], &cnts[41], &cnts[42], &cnts[43], &cnts[44], &cnts[45], &cnts[46], &cnts[47], &cnts[48], &cnts[49], &cnts[50], &cnts[51], &cnts[52], &cnts[53], &cnts[54], &cnts[55], &cnts[56], &cnts[57], &cnts[58], &cnts[59], &cnts[60], &cnts[61], &cnts[62], &cnts[63]); if (nr < 1) /* wrong format --> skip */ continue; if ( strcmp("cpu", nam) == EQ) { gs->cpu_user = cnts[0]; gs->cpu_nice = cnts[1]; gs->cpu_system = cnts[2]; gs->cpu_idle = cnts[3]; if (osrel->rel >= 2 && osrel->vers >= 6) { gs->cpu_wait = cnts[4]; gs->cpu_irq = cnts[5]; gs->cpu_sirq = cnts[6]; } continue; } if ( nam[0] == 'c' && nam[1] == 'p' && nam[2] == 'u' ) { int cpunr = atoi( &nam[3] ); if (cpunr < MAXCPU && cpunr >= 0) { gs->per_cpu_user[cpunr] = cnts[0]; gs->per_cpu_nice[cpunr] = cnts[1]; gs->per_cpu_system[cpunr] = cnts[2]; gs->per_cpu_idle[cpunr] = cnts[3]; if (osrel->rel >= 2 && osrel->vers >= 6) { gs->per_cpu_wait[cpunr] = cnts[4]; gs->per_cpu_irq [cpunr] = cnts[5]; gs->per_cpu_sirq[cpunr] = cnts[6]; } } continue; } if ( strcmp("ctxt", nam) == EQ) { gs->context_swtch = cnts[0]; continue; } if ( strcmp("intr", nam) == EQ) { int max = (nr-2) < MAXIRQ ? (nr-2) : MAXIRQ; /* first counter is the sum of all counters */ for (i=1; i < max; i++) gs->irqs[i-1] = cnts[i]; continue; } if ( strcmp("page", nam) == EQ) { gs->pgpgin = cnts[0]; gs->pgpgout = cnts[1]; continue; } if ( strcmp("swap", nam) == EQ) { gs->pswpin = cnts[0]; gs->pswpout = cnts[1]; continue; } /* ** handle disk-statistics ** only for kernel-version 2.4 */ if ( memcmp("disk_io", nam, 7) == EQ) { char *p; count_t major, minor, tot, rio, rblk, wio, wblk; int dkix; /* ** redo the parsing due to format: ** (major,minor):(tot,rio,rbk,wio,wbk) .... ** ** search for stats of first disk */ if ( (p = strchr(linebuf, ' ')) == NULL) continue; while (*++p == ' '); dkix = 0; while ((nr=sscanf(p, "(%lld,%lld):(%lld,%lld,%lld," "%lld,%lld) ", &major, &minor, &tot, &rio, &rblk, &wio, &wblk)) ==7) { gs->dk_drive_maj [dkix] = major; gs->dk_drive_min [dkix] = minor; gs->dk_drive_tot [dkix] = tot; gs->dk_drive_rio [dkix] = rio; gs->dk_drive_wio [dkix] = wio; gs->dk_drive_rblk[dkix] = rblk; gs->dk_drive_wblk[dkix] = wblk; dkix++; if (dkix >= MAXDISK) break; if ( (p = strchr(p, ' ')) == NULL) break; while (*++p == ' '); } continue; } /* ** handle disk-statistics kernel-version < 2.4 */ if ( strcmp("disk", nam) == EQ) { int max = (nr-1) < MAXDISK ? (nr-1) : MAXDISK; for (i=0; i < max; i++) { gs->dk_drive_min[i] = i+1; gs->dk_drive_tot[i] = cnts[i]; } continue; } if ( strcmp("disk_rio", nam) == EQ) { int max = (nr-1) < MAXDISK ? (nr-1) : MAXDISK; for (i=0; i < max; i++) gs->dk_drive_rio[i] = cnts[i]; continue; } if ( strcmp("disk_wio", nam) == EQ) { int max = (nr-1) < MAXDISK ? (nr-1) : MAXDISK; for (i=0; i < max; i++) gs->dk_drive_wio[i] = cnts[i]; continue; } if ( strcmp("disk_rblk", nam) == EQ) { int max = (nr-1) < MAXDISK ? (nr-1) : MAXDISK; for (i=0; i < max; i++) gs->dk_drive_rblk[i] = cnts[i]; continue; } if ( strcmp("disk_wblk", nam) == EQ) { int max = (nr-1) < MAXDISK ? (nr-1) : MAXDISK; for (i=0; i < max; i++) gs->dk_drive_wblk[i] = cnts[i]; continue; } } fclose(fp); } /* ** gather counters of per-cpu interrupt-statistics */ if ( (fp = fopen("/proc/interrupts", "r")) != NULL) { /* skip header-line */ (void) fgets(linebuf, sizeof(linebuf), fp); /* read counter-lines */ while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { int irq, max; nr = sscanf(linebuf, "%d: %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld\n", &irq, &cnts[0], &cnts[1], &cnts[2], &cnts[3], &cnts[4], &cnts[5], &cnts[6], &cnts[7], &cnts[8], &cnts[9], &cnts[10], &cnts[11], &cnts[12], &cnts[13], &cnts[14], &cnts[15], &cnts[16], &cnts[17], &cnts[18], &cnts[19], &cnts[20], &cnts[21], &cnts[22], &cnts[23], &cnts[24], &cnts[25], &cnts[26], &cnts[27], &cnts[28], &cnts[29], &cnts[30], &cnts[31], &cnts[32], &cnts[33], &cnts[34], &cnts[35], &cnts[36], &cnts[37], &cnts[38], &cnts[39], &cnts[40], &cnts[41], &cnts[42], &cnts[43], &cnts[44], &cnts[45], &cnts[46], &cnts[47], &cnts[48], &cnts[49], &cnts[50], &cnts[51], &cnts[52], &cnts[53], &cnts[54], &cnts[55], &cnts[56], &cnts[57], &cnts[58], &cnts[59], &cnts[60], &cnts[61], &cnts[62], &cnts[63]); if (nr < 2) continue; max = (nr-1) < MAXCPU ? (nr-1) : MAXCPU; for (i=0; i < max; i++) gs->per_irqs[i][irq] = cnts[i]; } fclose(fp); } /* ** gather load-averages */ if ( (fp = fopen("/proc/loadavg", "r")) != NULL) { if ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { nr = sscanf(linebuf, "%f %f %f %lld/%lld", &(gs->loadavg1), &(gs->loadavg5), &(gs->loadavg15), &(gs->nrrun), &(gs->nrproc)); } fclose(fp); } /* ** gather page-/swap-counters kernel version >= 2.6 */ if ( (fp = fopen("/proc/vmstat", "r")) != NULL) { int nrfields = 4; count_t cnt; while ( fgets(linebuf, sizeof(linebuf), fp) != NULL && nrfields > 0) { nr = sscanf(linebuf, "%s %lld", nam, &cnt); if (nr < 2) /* invalid line --> skip */ continue; if ( strcmp("pgpgin", nam) == EQ) { gs->pgpgin = cnt; nrfields--; } if ( strcmp("pgpgout", nam) == EQ) { gs->pgpgout = cnt; nrfields--; } if ( strcmp("pswpin", nam) == EQ) { gs->pswpin = cnt; nrfields--; } if ( strcmp("pswpout", nam) == EQ) { gs->pswpout = cnt; nrfields--; } } fclose(fp); } } /* ** Gather memory-related statistics from /proc and store in binary form. */ void memget(struct fetchdef *fdef, struct osrel *osrel, struct memstat *mi) { register int nr, nrfields=7; FILE *fp; char linebuf[1024]; char itsname[32]; count_t cnt; memset(mi, 0, sizeof(struct memstat)); if ( (fp = fopen("/proc/meminfo", "r")) == NULL) return; while ( fgets(linebuf, sizeof(linebuf), fp) != NULL && nrfields > 0) { nr = sscanf(linebuf, "%s %lld", itsname, &cnt); if (nr < 2) /* invalid line --> skip */ continue; if ( strcmp("MemTotal:", itsname) == EQ) { mi->memtot = cnt; nrfields--; } if ( strcmp("MemFree:", itsname) == EQ) { mi->memfree = cnt; nrfields--; } if ( strcmp("Buffers:", itsname) == EQ) { mi->membuf = cnt; nrfields--; } if ( strcmp("Cached:", itsname) == EQ) { mi->memcache = cnt; nrfields--; } if ( strcmp("Slab:", itsname) == EQ) { mi->memslab = cnt; nrfields--; } if ( strcmp("SwapTotal:", itsname) == EQ) { mi->swptot = cnt; nrfields--; } if ( strcmp("SwapFree:", itsname) == EQ) { mi->swpfree = cnt; nrfields--; } } fclose(fp); } /* ** Gather network-interface statistics from /proc and store in binary form. */ int getifstats(struct osrel *, struct ifstat *, int); void ifinit(struct fetchdef *fdef, struct osrel *osrel) { int numnet=0; struct ifstat ifs[MAXNET]; numnet = getifstats(osrel, ifs, MAXNET); /* ** current number of instances defined; ** however, this number might be changed dynamically, so ** reserve some spare entries (round up to unit of 8); ** unused entries will be filled with binary zeroes during ** each sample */ fdef->cdef.kinst = ((numnet>>3) + 1) << 3; if (fdef->cdef.kinst > MAXNET) fdef->cdef.kinst = MAXNET; } void ifget(struct fetchdef *fdef, struct osrel *osrel, struct ifstat *ifsbuf) { memset(ifsbuf, 0, sizeof(struct ifstat) * fdef->cdef.kinst); (void) getifstats(osrel, ifsbuf, fdef->cdef.kinst); } int getifstats(struct osrel *osrel, struct ifstat *ifsp, int maxif) { register int i=0, nr; FILE *fp; char linebuf[1024], *cp; if ( (fp = fopen("/proc/net/dev", "r")) == NULL) return(0); while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { if (i >= maxif) break; if ( (cp = strchr(linebuf, ':')) != NULL) *cp = ' '; /* substitute ':' by space */ if (osrel->rel == 2 && osrel->vers < 2) { memset(ifsp, 0, sizeof(struct ifstat)); nr = sscanf(linebuf, "%s %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld\n", ifsp->name, &(ifsp->rpack), &(ifsp->rerrs), &(ifsp->rdrop), &(ifsp->rfifo), &(ifsp->rframe), &(ifsp->spack), &(ifsp->serrs), &(ifsp->sdrop), &(ifsp->sfifo), &(ifsp->scollis), &(ifsp->scarrier)); if (nr < 12) /* skip header & lines without stats */ { ifsp->name[0] = 0; continue; } } else { nr = sscanf(linebuf, "%s %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld " "%lld\n", ifsp->name, &(ifsp->rbyte), &(ifsp->rpack), &(ifsp->rerrs), &(ifsp->rdrop), &(ifsp->rfifo), &(ifsp->rframe), &(ifsp->rcompr), &(ifsp->rmultic), &(ifsp->sbyte), &(ifsp->spack), &(ifsp->serrs), &(ifsp->sdrop), &(ifsp->sfifo), &(ifsp->scollis), &(ifsp->scarrier), &(ifsp->scompr)); if (nr < 16) /* skip header & lines without stats */ { ifsp->name[0] = 0; continue; } } i++; ifsp++; } fclose(fp); return i; } /* ** Gather ip-icmp-tcp-udp statistics from /proc and store in binary form ** in the snmp mib-structure where the counters are derived from. */ struct ipv6_mib ipv6_tmp; struct icmpv6_mib icmpv6_tmp; struct udp_mib udpv6_tmp; struct v6tab { char *nam; count_t *val; } v6tab[] = { {"Ip6InReceives", &ipv6_tmp.Ip6InReceives, }, {"Ip6InHdrErrors", &ipv6_tmp.Ip6InHdrErrors, }, {"Ip6InTooBigErrors", &ipv6_tmp.Ip6InTooBigErrors, }, {"Ip6InNoRoutes", &ipv6_tmp.Ip6InNoRoutes, }, {"Ip6InAddrErrors", &ipv6_tmp.Ip6InAddrErrors, }, {"Ip6InUnknownProtos", &ipv6_tmp.Ip6InUnknownProtos, }, {"Ip6InTruncatedPkts", &ipv6_tmp.Ip6InTruncatedPkts, }, {"Ip6InDiscards", &ipv6_tmp.Ip6InDiscards, }, {"Ip6InDelivers", &ipv6_tmp.Ip6InDelivers, }, {"Ip6OutForwDatagrams", &ipv6_tmp.Ip6OutForwDatagrams, }, {"Ip6OutRequests", &ipv6_tmp.Ip6OutRequests, }, {"Ip6OutDiscards", &ipv6_tmp.Ip6OutDiscards, }, {"Ip6OutNoRoutes", &ipv6_tmp.Ip6OutNoRoutes, }, {"Ip6ReasmTimeout", &ipv6_tmp.Ip6ReasmTimeout, }, {"Ip6ReasmReqds", &ipv6_tmp.Ip6ReasmReqds, }, {"Ip6ReasmOKs", &ipv6_tmp.Ip6ReasmOKs, }, {"Ip6ReasmFails", &ipv6_tmp.Ip6ReasmFails, }, {"Ip6FragOKs", &ipv6_tmp.Ip6FragOKs, }, {"Ip6FragFails", &ipv6_tmp.Ip6FragFails, }, {"Ip6FragCreates", &ipv6_tmp.Ip6FragCreates, }, {"Ip6InMcastPkts", &ipv6_tmp.Ip6InMcastPkts, }, {"Ip6OutMcastPkts", &ipv6_tmp.Ip6OutMcastPkts, }, {"Icmp6InMsgs", &icmpv6_tmp.Icmp6InMsgs, }, {"Icmp6InErrors", &icmpv6_tmp.Icmp6InErrors, }, {"Icmp6InDestUnreachs", &icmpv6_tmp.Icmp6InDestUnreachs, }, {"Icmp6InPktTooBigs", &icmpv6_tmp.Icmp6InPktTooBigs, }, {"Icmp6InTimeExcds", &icmpv6_tmp.Icmp6InTimeExcds, }, {"Icmp6InParmProblems", &icmpv6_tmp.Icmp6InParmProblems, }, {"Icmp6InEchos", &icmpv6_tmp.Icmp6InEchos, }, {"Icmp6InEchoReplies", &icmpv6_tmp.Icmp6InEchoReplies, }, {"Icmp6InGroupMembQueries", &icmpv6_tmp.Icmp6InGroupMembQueries, }, {"Icmp6InGroupMembResponses", &icmpv6_tmp.Icmp6InGroupMembResponses, }, {"Icmp6InGroupMembReductions", &icmpv6_tmp.Icmp6InGroupMembReductions, }, {"Icmp6InRouterSolicits", &icmpv6_tmp.Icmp6InRouterSolicits, }, {"Icmp6InRouterAdvertisements", &icmpv6_tmp.Icmp6InRouterAdvertisements, }, {"Icmp6InNeighborSolicits", &icmpv6_tmp.Icmp6InNeighborSolicits, }, {"Icmp6InNeighborAdvertisements", &icmpv6_tmp.Icmp6InNeighborAdvertisements, }, {"Icmp6InRedirects", &icmpv6_tmp.Icmp6InRedirects, }, {"Icmp6OutMsgs", &icmpv6_tmp.Icmp6OutMsgs, }, {"Icmp6OutDestUnreachs", &icmpv6_tmp.Icmp6OutDestUnreachs, }, {"Icmp6OutPktTooBigs", &icmpv6_tmp.Icmp6OutPktTooBigs, }, {"Icmp6OutTimeExcds", &icmpv6_tmp.Icmp6OutTimeExcds, }, {"Icmp6OutParmProblems", &icmpv6_tmp.Icmp6OutParmProblems, }, {"Icmp6OutEchoReplies", &icmpv6_tmp.Icmp6OutEchoReplies, }, {"Icmp6OutRouterSolicits", &icmpv6_tmp.Icmp6OutRouterSolicits, }, {"Icmp6OutNeighborSolicits",&icmpv6_tmp.Icmp6OutNeighborSolicits, }, {"Icmp6OutNeighborAdvertisements", &icmpv6_tmp.Icmp6OutNeighborAdvertisements, }, {"Icmp6OutRedirects", &icmpv6_tmp.Icmp6OutRedirects, }, {"Icmp6OutGroupMembResponses", &icmpv6_tmp.Icmp6OutGroupMembResponses, }, {"Icmp6OutGroupMembReductions", &icmpv6_tmp.Icmp6OutGroupMembReductions, }, {"Udp6InDatagrams", &udpv6_tmp.UdpInDatagrams, }, {"Udp6NoPorts", &udpv6_tmp.UdpNoPorts, }, {"Udp6InErrors", &udpv6_tmp.UdpInErrors, }, {"Udp6OutDatagrams", &udpv6_tmp.UdpOutDatagrams, }, }; int v6tab_entries = sizeof(v6tab)/sizeof(struct v6tab); void netget(struct fetchdef *fdef, struct osrel *osrel, struct netstat *ns) { register int nr, cur=0; FILE *fp; char linebuf[1024]; char itsname[32]; count_t cnts[40]; memset(ns, 0, sizeof(struct netstat)); /* ** Obtain de IP version 4 statistics */ if ( (fp = fopen("/proc/net/snmp", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { nr = sscanf(linebuf, "%s %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld\n", itsname, &cnts[0], &cnts[1], &cnts[2], &cnts[3], &cnts[4], &cnts[5], &cnts[6], &cnts[7], &cnts[8], &cnts[9], &cnts[10], &cnts[11], &cnts[12], &cnts[13], &cnts[14], &cnts[15], &cnts[16], &cnts[17], &cnts[18], &cnts[19], &cnts[20], &cnts[21], &cnts[22], &cnts[23], &cnts[24], &cnts[25], &cnts[26], &cnts[27], &cnts[28], &cnts[29], &cnts[30], &cnts[31], &cnts[32], &cnts[33], &cnts[34], &cnts[35], &cnts[36], &cnts[37], &cnts[38], &cnts[39]); if (nr < 2) /* headerline ? --> skip */ continue; if ( strcmp("Ip:", itsname) == EQ) { memcpy( &ns->ip, cnts, sizeof(struct ip_mib) ); continue; } if ( strcmp("Icmp:", itsname) == EQ) { memcpy( &ns->icmp, cnts, sizeof(struct icmp_mib) ); continue; } if ( strcmp("Tcp:", itsname) == EQ) { memcpy( &ns->tcp, cnts, sizeof(struct tcp_mib) ); continue; } if ( strcmp("Udp:", itsname) == EQ) { memcpy( &ns->udp, cnts, sizeof(struct udp_mib) ); continue; } } fclose(fp); } /* ** Obtain de IP version 6 statistics ** This file has one name-value pair per line. */ if ( (fp = fopen("/proc/net/snmp6", "r")) != NULL) { cur = 0; memset(&ipv6_tmp, 0, sizeof ipv6_tmp); memset(&icmpv6_tmp, 0, sizeof icmpv6_tmp); memset(&udpv6_tmp, 0, sizeof udpv6_tmp); while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { nr = sscanf(linebuf, "%s %lld", itsname, &cnts[0]); if (strcmp(v6tab[cur].nam, itsname) == EQ) { *(v6tab[cur].val) = cnts[0]; } else { for (cur=0; cur < v6tab_entries; cur++) if (strcmp(v6tab[cur].nam, itsname) == EQ) break; if (cur < v6tab_entries) /* found ? */ *(v6tab[cur].val) = cnts[0]; } if (++cur >= v6tab_entries) cur = 0; } memcpy(&ns->ip6, &ipv6_tmp, sizeof ipv6_tmp); memcpy(&ns->icmp6, &icmpv6_tmp, sizeof icmpv6_tmp); memcpy(&ns->udp6, &udpv6_tmp, sizeof udpv6_tmp); fclose(fp); } } /* ** Gather nfs (& rpc) statistics from /proc and store in binary form ** in the proprietary nfsstat structure. */ void nfsget(struct fetchdef *fdef, struct osrel *osrel, struct nfsstat *ns) { register int nr; FILE *fp; char linebuf[1024]; char itsname[32]; count_t cnts[32]; void nfsfill(char *, count_t [], int, struct nfsstat *, int); memset(ns, 0, sizeof(struct nfsstat)); /* ** Get NFS-client statistics */ if ( (fp = fopen("/proc/net/rpc/nfs", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { nr = sscanf(linebuf, "%s %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld\n", itsname, &cnts[0], &cnts[1], &cnts[2], &cnts[3], &cnts[4], &cnts[5], &cnts[6], &cnts[7], &cnts[8], &cnts[9], &cnts[10], &cnts[11], &cnts[12], &cnts[13], &cnts[14], &cnts[15], &cnts[16], &cnts[17], &cnts[18], &cnts[19], &cnts[20], &cnts[21], &cnts[22], &cnts[23], &cnts[24], &cnts[25], &cnts[26], &cnts[27], &cnts[28], &cnts[29], &cnts[30], &cnts[31]); if (nr < 2) continue; nfsfill(itsname, cnts, nr-1, ns, 1); } fclose(fp); } /* ** Get NFS-server statistics */ if ( (fp = fopen("/proc/net/rpc/nfsd", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { nr = sscanf(linebuf, "%s %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld %lld %lld %lld " "%lld %lld %lld %lld %lld %lld\n", itsname, &cnts[0], &cnts[1], &cnts[2], &cnts[3], &cnts[4], &cnts[5], &cnts[6], &cnts[7], &cnts[8], &cnts[9], &cnts[10], &cnts[11], &cnts[12], &cnts[13], &cnts[14], &cnts[15], &cnts[16], &cnts[17], &cnts[18], &cnts[19], &cnts[20], &cnts[21], &cnts[22], &cnts[23], &cnts[24], &cnts[25], &cnts[26], &cnts[27], &cnts[28], &cnts[29], &cnts[30], &cnts[31]); if (nr < 2) continue; nfsfill(itsname, cnts, nr-1, ns, 0); } fclose(fp); } } void nfsfill(char *nam, count_t cnts[], int nc, struct nfsstat *ns, int isclient) { if ( strcmp("net", nam) == EQ) { if (isclient) { ns->cl_netcnt = cnts[0]; ns->cl_netudpcnt = cnts[1]; ns->cl_nettcpcnt = cnts[2]; ns->cl_nettcpconn = cnts[3]; } else { ns->sv_netcnt = cnts[0]; ns->sv_netudpcnt = cnts[1]; ns->sv_nettcpcnt = cnts[2]; ns->sv_nettcpconn = cnts[3]; } return; } if ( strcmp("rpc", nam) == EQ) { if (isclient) { ns->cl_rpccnt = cnts[0]; ns->cl_rpcretrans = cnts[1]; ns->cl_rpcauthrefresh = cnts[2]; } else { ns->sv_rpccnt = cnts[0]; ns->sv_rpcbadtot = cnts[1]; ns->sv_rpcbadfmt = cnts[2]; ns->sv_rpcbadauth = cnts[3]; ns->sv_rpcbadclnt = cnts[4]; } return; } if ( nam[0] == 'p' && nam[1] == 'r' && nam[2] == 'o' && nam[3] == 'c' ) { int version = atoi(nam+4); switch (version) { case 2: if (isclient) memcpy(&ns->cl_proc2, &cnts[1], sizeof(ns->cl_proc2) ); else memcpy(&ns->sv_proc2, &cnts[1], sizeof(ns->sv_proc2) ); break; case 3: if (isclient) memcpy(&ns->cl_proc3, &cnts[1], sizeof(ns->cl_proc3) ); else memcpy(&ns->sv_proc3, &cnts[1], sizeof(ns->sv_proc3) ); break; } return; } if ( strcmp("rc", nam) == EQ) { if (isclient) return; ns->sv_rchits = cnts[0]; ns->sv_rcmisses = cnts[1]; ns->sv_rcnocache = cnts[2]; if (nc == 9) /* kernel 2.2 */ { ns->sv_fhstale = cnts[7]; ns->sv_fhlookup = cnts[6]; ns->sv_fhanon = cnts[5]; } return; } if ( strcmp("fh", nam) == EQ) /* kernel 2.4 */ { if (isclient) return; ns->sv_fhstale = cnts[0]; ns->sv_fhlookup = cnts[1]; ns->sv_fhanon = cnts[2]; ns->sv_fhnocachedir = cnts[3]; ns->sv_fhnocachenondir = cnts[4]; return; } if ( strcmp("io", nam) == EQ) /* kernel 2.4 */ { if (isclient) return; ns->sv_ioread = cnts[0]; ns->sv_iowrite = cnts[1]; return; } if ( strcmp("th", nam) == EQ) /* kernel 2.4 */ { if (isclient) return; ns->sv_thcount = cnts[0]; ns->sv_thlastcnt = cnts[1]; return; } if ( strcmp("ra", nam) == EQ) /* kernel 2.4 */ { if (isclient) return; ns->sv_rasize = cnts[0]; return; } } /* ** Gather statistics about the utilization of parameters from /proc and ** store in binary form. */ void tabget(struct fetchdef *fdef, struct osrel *osrel, struct tabstat *ps) { register int baselen; FILE *fp; char linebuf[1024], firstword[80], basepath[132]; count_t cnt; memset(ps, 0, sizeof(struct tabstat)); /* ** obtain info about number of processes started */ if ( (fp = fopen("/proc/stat", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { sscanf(linebuf, "%s %lld", firstword, &cnt); if ( strcmp(firstword, "processes") == EQ) { ps->totforks = cnt; break; } } fclose(fp); } /* ** obtain info about number of record-locks */ cnt = 0; if ( (fp = fopen("/proc/locks", "r")) != NULL) { /* just count number of lines */ while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) cnt++; fclose(fp); } ps->curlocks = cnt; /* ** obtain info about occupation of disk-quota */ if ( (fp = fopen("/proc/sys/fs/dquot-max", "r")) != NULL) { fscanf(fp, "%lld", &(ps->maxdquot)); fclose(fp); } if ( (fp = fopen("/proc/sys/fs/dquot-nr", "r")) != NULL) { fscanf(fp, "%lld", &(ps->curdquot)); fclose(fp); } /* ** obtain info about occupation of superblocks */ if ( (fp = fopen("/proc/sys/fs/super-max", "r")) != NULL) { fscanf(fp, "%lld", &(ps->maxsuper)); fclose(fp); } if ( (fp = fopen("/proc/sys/fs/super-nr", "r")) != NULL) { fscanf(fp, "%lld", &(ps->cursuper)); fclose(fp); } /* ** Next file-names under /proc are dependent on the release/version ** of this system; they might be stored under /proc/sys/kernel or ** under /proc/sys/fs. General preparation: */ if (osrel->rel == 2 && osrel->vers < 2) strcpy(basepath, "/proc/sys/kernel/"); else strcpy(basepath, "/proc/sys/fs/"); baselen = strlen(basepath); /* ** obtain info about occupation of open files */ strcpy(&basepath[baselen], "file-max"); if ( (fp = fopen(basepath, "r")) != NULL) { fscanf(fp, "%lld", &(ps->maxfiles)); fclose(fp); } strcpy(&basepath[baselen], "file-nr"); if ( (fp = fopen(basepath, "r")) != NULL) { count_t alloctot, allocfree; fscanf(fp, "%lld %lld", &alloctot, &allocfree); fclose(fp); ps->curfiles = alloctot - allocfree; } /* ** obtain info about occupation of inodes */ strcpy(&basepath[baselen], "inode-max"); if ( (fp = fopen(basepath, "r")) != NULL) { fscanf(fp, "%lld", &(ps->maxinode)); fclose(fp); } strcpy(&basepath[baselen], "inode-nr"); if ( (fp = fopen(basepath, "r")) != NULL) { fscanf(fp, "%lld %lld", &(ps->curinode), &(ps->maxinode)); fclose(fp); } } /* ** Gather statistics about the utilization of disk-partitions from /proc and ** store in binary form. */ #define SCANDK "%255s %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld" #define SCANDS "%hu %hu " #define SCANPT "%hu %hu %lld " static char usediskstats; void dkinit(struct fetchdef *fdef, struct osrel *osrel) { int numpart=0, nr=0; FILE *fp; struct dkstat dkstat; char buf[256], diskname[256]; /* ** define number of partitions and define if per-partition stats ** are supported on this system */ if ( (fp = fopen("/proc/partitions", "r")) != NULL) { while ( fgets(buf, sizeof(buf), fp) ) { nr = sscanf(buf, SCANPT SCANDK, &dkstat.major, &dkstat.minor, &dkstat.totsize, diskname, &dkstat.readblocks, &dkstat.readmerges, &dkstat.readsectors, &dkstat.read_msecs, &dkstat.writblocks, &dkstat.writmerges, &dkstat.writsectors, &dkstat.writ_msecs, &dkstat.reqpending, &dkstat.rdwr_msecs, &dkstat.avq); if (nr >= 8 && isrealdisk(diskname, dkstat.name, MAXDKNAME) ) numpart++; } fclose(fp); } if (numpart > 0) /* partition-stats found */ { fdef->cdef.kinst = numpart; return; } /* ** no per-partition statistics found; try /proc/diskstats (>= 2.6) */ if ( (fp = fopen("/proc/diskstats", "r")) != NULL) { while ( fgets(buf, sizeof(buf), fp) ) { nr = sscanf(buf, SCANDS SCANDK, &dkstat.major, &dkstat.minor, diskname, &dkstat.readblocks, &dkstat.readmerges, &dkstat.readsectors, &dkstat.read_msecs, &dkstat.writblocks, &dkstat.writmerges, &dkstat.writsectors, &dkstat.writ_msecs, &dkstat.reqpending, &dkstat.rdwr_msecs, &dkstat.avq); if (nr >= 7 && isrealdisk(diskname, dkstat.name, MAXDKNAME) ) numpart++; } if (numpart > 0) usediskstats++; fclose(fp); } fdef->cdef.kinst = numpart; } void dkget(struct fetchdef *fdef, struct osrel *osrel, struct dkstat *ds) { FILE *fp; int numpart=0, nr=0; char buf[1024], diskname[256]; if (fdef->cdef.kinst == 0) return; memset(ds, 0, sizeof(struct dkstat) * fdef->cdef.kinst); if (usediskstats) { fp = fopen("/proc/diskstats", "r"); while (fgets(buf, sizeof(buf), fp) && numpart< fdef->cdef.kinst) { nr = sscanf(buf, SCANDS SCANDK, &(ds->major), &(ds->minor), diskname, &(ds->readblocks), &(ds->readmerges), &(ds->readsectors), &(ds->read_msecs), &(ds->writblocks), &(ds->writmerges), &(ds->writsectors), &(ds->writ_msecs), &(ds->reqpending), &(ds->rdwr_msecs), &(ds->avq)); if (nr < 7 || !isrealdisk(diskname, ds->name, MAXDKNAME) ) continue; if (nr == 7) /* partition i.s.o. full disk ? */ { ds->writblocks = ds->readsectors; ds->writsectors = ds->read_msecs; ds->readsectors = ds->readmerges; ds->readmerges = 0; ds->read_msecs = 0; ds->writmerges = 0; ds->writ_msecs = 0; ds->reqpending = 0; ds->rdwr_msecs = 0; ds->avq = 0; } numpart++; ds++; } } else { fp = fopen("/proc/partitions", "r"); while (fgets(buf, sizeof(buf), fp) && numpart< fdef->cdef.kinst) { nr = sscanf(buf, SCANPT SCANDK, &(ds->major), &(ds->minor), &(ds->totsize), diskname, &(ds->readblocks), &(ds->readmerges), &(ds->readsectors), &(ds->read_msecs), &(ds->writblocks), &(ds->writmerges), &(ds->writsectors), &(ds->writ_msecs), &(ds->reqpending), &(ds->rdwr_msecs), &(ds->avq)); if (nr >= 8 && isrealdisk(diskname, ds->name,MAXDKNAME)) { numpart++; ds++; } } } fclose(fp); } /* ** set of subroutines to determine which disks should be monitored ** and to translate long name strings into short name strings */ static void nullmodname(char *curname, char *newname, int maxlen) { strncpy(newname, curname, maxlen-1); *(newname+maxlen-1) = 0; } static void abbrevname1(char *curname, char *newname, int maxlen) { char cutype[128]; int hostnum, busnum, targetnum, lunnum, partnum, nr; nr = sscanf(curname, "%[^/]/host%d/bus%d/target%d/lun%d/part%d", cutype, &hostnum, &busnum, &targetnum, &lunnum, &partnum); if (nr == 5) /* full disk */ snprintf(newname, maxlen, "%c-h%db%dt%d", cutype[0], hostnum, busnum, targetnum); else /* partition */ snprintf(newname, maxlen, "%c-h%db%dt%d.%d", cutype[0], hostnum, busnum, targetnum, partnum); } /* ** table contains the names (in regexp format) of valid disks ** to be supported, together a function to modify the name-strings ** (i.e. to abbreviate long strings); ** this table is used in the function isrealdisk() */ static struct { char *regexp; regex_t compreg; void (*modname)(char *, char *, int); } validdisk[] = { { "^sd[a-z][a-z]*", {0}, nullmodname, }, { "^hd[a-z]", {0}, nullmodname, }, { "^rd/c[0-9][0-9]*d[0-9][0-9]*", {0}, nullmodname, }, { "^cciss/c[0-9][0-9]*d[0-9][0-9]*", {0}, nullmodname, }, { "/host.*/bus.*/target.*/lun", {0}, abbrevname1, }, }; static int isrealdisk(char *curname, char *newname, int maxlen) { static int firstcall = 1; register int i; if (firstcall) /* compile the regular expressions */ { for (i=0; i < sizeof validdisk/sizeof validdisk[0]; i++) regcomp(&validdisk[i].compreg, validdisk[i].regexp, REG_NOSUB); firstcall = 0; } /* ** try to recognize one of the compiled regular expressions */ for (i=0; i < sizeof validdisk/sizeof validdisk[0]; i++) { if (regexec(&validdisk[i].compreg, curname, 0, NULL, 0) == 0) { /* ** name-string recognized; modify name-string */ (*validdisk[i].modname)(curname, newname, maxlen); return 1; } } return 0; } /* ** Gather statistics about the utilization of sockets from /proc and ** store in binary form. */ void sockget(struct fetchdef *fdef, struct osrel *osrel, struct sockstat *ss) { FILE *fp; char linebuf[1024]; char itsname[32], notused[64]; count_t nowuse, maxuse; memset(ss, 0, sizeof(struct sockstat)); if ( (fp = fopen("/proc/net/sockstat", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { maxuse = 0; /* 2.4 kernel: no support max usage */ if ( sscanf(linebuf, "%s %s %lld %s %lld\n", itsname, notused, &nowuse, notused, &maxuse)<3) continue; if ( strcmp("TCP:", itsname) == EQ) { ss->tcpnow = nowuse; ss->tcpmax = maxuse; continue; } if ( strcmp("UDP:", itsname) == EQ) { ss->udpnow = nowuse; ss->udpmax = maxuse; continue; } } fclose(fp); } if ( (fp = fopen("/proc/net/sockstat6", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { maxuse = 0; /* 2.4 kernel: no support max usage */ if ( sscanf(linebuf, "%s %s %lld %s %lld\n", itsname, notused, &nowuse, notused, &maxuse)<3) continue; if ( strcmp("TCP6:", itsname) == EQ) { ss->tcp6now = nowuse; ss->tcp6max = maxuse; continue; } if ( strcmp("UDP6:", itsname) == EQ) { ss->udp6now = nowuse; ss->udp6max = maxuse; continue; } } fclose(fp); } } /* ** Gather statistics about the utilization of serial interfaces and ** store in binary form. */ void ttyget(struct fetchdef *fdef, struct osrel *osrel, struct serialstat *ts) { register char *p; FILE *fp; char linebuf[1024]; char nam[9][16], par[9][16]; int ttynum, nr, i, t=0, colons; memset(ts, 0, sizeof(struct serialstat) * fdef->cdef.kinst); if ( (fp = fopen("/proc/tty/driver/serial", "r")) != NULL) { while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) { /* ** replace colons by spaces to ease parsing ** and to determine if this line contains counters */ for (p=linebuf, colons=0; *p; p++) { if (*p != ':') continue; *p = ' '; colons++; } if (colons < 5) /* unused serial line */ continue; /* ** counter available: parse line */ nr = sscanf(linebuf, "%d %s %s %s %s %s %s %s %s" " %s %s %s %s %s %s %s %s" " %s %s\n", &ttynum, nam[0], par[0], nam[1], par[1], nam[2], par[2], nam[3], par[3], nam[4], par[4], nam[5], par[5], nam[6], par[6], nam[7], par[7], nam[8], par[8]); nr = (nr - 1) / 2; /* # name-value pairs */ for (i=1; i < nr; i++) { if ( strcmp("port", nam[i]) == EQ) { ts->port = strtol(par[i], NULL, 16); continue; } if ( strcmp("tx", nam[i]) == EQ) { ts->tx = atoi(par[i]); continue; } if ( strcmp("rx", nam[i]) == EQ) { ts->rx = atoi(par[i]); continue; } if ( strcmp("fe", nam[i]) == EQ) { ts->fe = atoi(par[i]); continue; } if ( strcmp("brk", nam[i]) == EQ) { ts->br = atoi(par[i]); continue; } if ( strcmp("pe", nam[i]) == EQ) { ts->pe = atoi(par[i]); continue; } if ( strcmp("oe", nam[i]) == EQ) { ts->oe = atoi(par[i]); continue; } } if (ts->port == 0) continue; if (++t >= fdef->cdef.kinst) break; ts++; } fclose(fp); } } #ifdef WEBSUPPORT /* ** Gather statistics about the number of FTP-transfers */ void ftpinit(struct fetchdef *fdef, struct osrel *osrel) { FILE *fp; char linebuf[1024]; fdef->cdef.kinst = 0; if ( (fp = fopen("/var/log/atsar/ftpstat", "r")) == NULL) return; while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) fdef->cdef.kinst++; fclose(fp); } void ftpget(struct fetchdef *fdef, struct osrel *osrel, struct ftpstat *fs) { FILE *fp; char linebuf[1024], filename[256], symname[256]; int i; count_t notused; memset(fs, 0, sizeof(struct ftpstat) * fdef->cdef.kinst); if ( (fp = fopen("/var/log/atsar/ftpstat", "r")) == NULL) return; for (i=0; i < fdef->cdef.kinst; i++, fs++) { if ( fgets(linebuf, sizeof(linebuf), fp) == NULL) break; sscanf(linebuf, "%lf %lf %lf %lf %lf %lf %lld %lld %lld %s %s\n", &fs->ocumxfer, &fs->ocumseconds, &fs->ocumkbytes, &fs->icumxfer, &fs->icumseconds, &fs->icumkbytes, ¬used, ¬used, ¬used, filename, symname); strncpy(fs->logname, symname, MAXLOGNAME-1); fs->logname[MAXLOGNAME-1] = '\0'; } fclose(fp); } /* ** Gather HTTP-statistics */ void httpinit(struct fetchdef *fdef, struct osrel *osrel) { FILE *fp; char linebuf[1024]; fdef->cdef.kinst = 0; if ( (fp = fopen("/var/log/atsar/httpstat", "r")) == NULL) return; while ( fgets(linebuf, sizeof(linebuf), fp) != NULL) fdef->cdef.kinst++; fclose(fp); } void httpget(struct fetchdef *fdef, struct osrel *osrel, struct httpstat *hs) { register int i; FILE *fp; char linebuf[1024], filename[256], symname[256]; count_t notused; memset(hs, 0, sizeof(struct httpstat) * fdef->cdef.kinst); if ( (fp = fopen("/var/log/atsar/httpstat", "r")) == NULL) return; for (i=0; i < fdef->cdef.kinst; i++, hs++) { if ( fgets(linebuf, sizeof(linebuf), fp) == NULL) break; sscanf(linebuf, "%lf %lf %lf %lf %lf %lld %lld %lld %s %s\n", &hs->cumhead, &hs->cumgets, &hs->cumputs, &hs->cumpost, &hs->cumdels, ¬used, ¬used, ¬used, filename, symname); strncpy(hs->logname, symname, MAXLOGNAME-1); hs->logname[MAXLOGNAME-1] = '\0'; } fclose(fp); } #endif /*********************************************************************/ /* Counter fetch definition tables. */ /* */ /* The layout of these tables is as follows: */ /* Column 1: */ /* Internal name of counter-set, to be filled by atsadc and */ /* to be printed by atsar. */ /* */ /* Column 2: */ /* Size (number of bytes) per instance of this counter or */ /* counter-structure. */ /* */ /* Column 3: */ /* Number of instances of this counter or counter-structure */ /* (e.g. if this is a table of counters). */ /* */ /* Column 4: */ /* Entry-point (optional) of a function which may initialise */ /* this table-entry before its contents is taken into account.*/ /* If e.g. the number of instances (column 3) can only be */ /* determined at runtime, a special function can be written */ /* to determine this value. */ /* */ /* This function will be called with two arguments, i.e. a */ /* pointer to the relevant fetchdef[] table entry to be */ /* filled or modified, and info about the OS-release. */ /* */ /* The return-value is not relevant. */ /* */ /* Column 5: */ /* Entry-point (mandatory!) of a function which can be called */ /* to read the statistical counters during every sample. */ /* */ /* This function will be called with three arguments, i.e. */ /* a pointer to the relevant fetchdef[] table entry to be */ /* used for information, info about the OS-release and a */ /* pointer to the area in which the counter-data should be */ /* stored. */ /* */ /* The return-value is not relevant. */ /*********************************************************************/ /*******************************************************/ /* counters which are different on every system, but */ /* do not change on-the-fly (only read once). */ /*******************************************************/ struct fetchdef oncedef[] = { }; int oncecnt = sizeof(oncedef)/sizeof(struct fetchdef); /*******************************************************/ /* counters which hold the real statistics which */ /* constantly increase (read every seconds). */ /*******************************************************/ struct fetchdef sampdef[] = { { {"genstat", sizeof(struct genstat), 1}, 0, genget, }, { {"memstat", sizeof(struct memstat), 1}, 0, memget, }, { {"ifstat", sizeof(struct ifstat), 1}, ifinit, ifget, }, { {"netstat", sizeof(struct netstat), 1}, 0, netget, }, { {"nfsstat", sizeof(struct nfsstat), 1}, 0, nfsget, }, { {"tabstat", sizeof(struct tabstat), 1}, 0, tabget, }, { {"partstat", sizeof(struct dkstat), 1}, dkinit, dkget, }, { {"sockstat", sizeof(struct sockstat), 1}, 0, sockget, }, { {"ttystat", sizeof(struct serialstat), 32}, 0, ttyget, }, #ifdef WEBSUPPORT { {"ftpstat", sizeof(struct ftpstat), 1}, ftpinit, ftpget, }, { {"httpstat", sizeof(struct httpstat), 1}, httpinit, httpget,}, #endif }; int sampcnt = sizeof(sampdef)/sizeof(struct fetchdef);