]> granicus.if.org Git - sysstat/commitdiff
First use of git system. Based on a complete sysstat 9.1.5 version. v9.1.5
authorSebastien Godard <sysstat@orange.fr>
Mon, 13 Sep 2010 19:47:33 +0000 (21:47 +0200)
committerSebastien Godard <sysstat@orange.fr>
Mon, 13 Sep 2010 19:47:33 +0000 (21:47 +0200)
119 files changed:
CHANGES [new file with mode: 0644]
COPYING [new file with mode: 0644]
CREDITS [new file with mode: 0644]
FAQ [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
activity.c [new file with mode: 0644]
build/Ask.sh [new file with mode: 0644]
build/clean-sa-dir [new file with mode: 0644]
build/compress-manpg [new file with mode: 0644]
build/compressafter [new file with mode: 0644]
build/conf_dir [new file with mode: 0644]
build/cron_interval [new file with mode: 0644]
build/cron_owner [new file with mode: 0644]
build/debuginfo [new file with mode: 0644]
build/history [new file with mode: 0644]
build/ignore-man-group [new file with mode: 0644]
build/install-cron [new file with mode: 0644]
build/install-doc [new file with mode: 0644]
build/install-isag [new file with mode: 0644]
build/man_group [new file with mode: 0644]
build/nls [new file with mode: 0644]
build/prefix [new file with mode: 0644]
build/rcdir [new file with mode: 0644]
build/sa_dir [new file with mode: 0644]
build/sa_lib_dir [new file with mode: 0644]
build/sensors [new file with mode: 0644]
build/yesterday [new file with mode: 0644]
cifsiostat.c [new file with mode: 0644]
cifsiostat.h [new file with mode: 0644]
common.c [new file with mode: 0644]
common.h [new file with mode: 0644]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
contrib/README-contrib [new file with mode: 0644]
contrib/isag/README-isag [new file with mode: 0644]
contrib/isag/isag.1 [new file with mode: 0644]
contrib/isag/isag.in [new file with mode: 0644]
contrib/sargraph/sargraph [new file with mode: 0755]
crontab.sample [new file with mode: 0644]
iconfig [new file with mode: 0755]
ioconf.c [new file with mode: 0644]
ioconf.h [new file with mode: 0644]
iostat.c [new file with mode: 0644]
iostat.h [new file with mode: 0644]
man/cifsiostat.1 [new file with mode: 0644]
man/iostat.in [new file with mode: 0644]
man/mpstat.1 [new file with mode: 0644]
man/nfsiostat.1 [new file with mode: 0644]
man/pidstat.1 [new file with mode: 0644]
man/sa1.in [new file with mode: 0644]
man/sa2.in [new file with mode: 0644]
man/sadc.in [new file with mode: 0644]
man/sadf.in [new file with mode: 0644]
man/sar.in [new file with mode: 0644]
mpstat.c [new file with mode: 0644]
mpstat.h [new file with mode: 0644]
nfsiostat.c [new file with mode: 0644]
nfsiostat.h [new file with mode: 0644]
nls/README-nls [new file with mode: 0644]
nls/af.po [new file with mode: 0644]
nls/cs.po [new file with mode: 0644]
nls/da.po [new file with mode: 0644]
nls/de.po [new file with mode: 0644]
nls/es.po [new file with mode: 0644]
nls/eu.po [new file with mode: 0644]
nls/fi.po [new file with mode: 0644]
nls/fr.po [new file with mode: 0644]
nls/id.po [new file with mode: 0644]
nls/it.po [new file with mode: 0644]
nls/ja.po [new file with mode: 0644]
nls/ky.po [new file with mode: 0644]
nls/lv.po [new file with mode: 0644]
nls/mt.po [new file with mode: 0644]
nls/nb.po [new file with mode: 0644]
nls/nl.po [new file with mode: 0644]
nls/nn.po [new file with mode: 0644]
nls/pl.po [new file with mode: 0644]
nls/pt.po [new file with mode: 0644]
nls/pt_BR.po [new file with mode: 0644]
nls/ro.po [new file with mode: 0644]
nls/ru.po [new file with mode: 0644]
nls/sk.po [new file with mode: 0644]
nls/sv.po [new file with mode: 0644]
nls/sysstat.pot [new file with mode: 0644]
nls/vi.po [new file with mode: 0644]
nls/zh_CN.po [new file with mode: 0644]
nls/zh_TW.po [new file with mode: 0644]
pidstat.c [new file with mode: 0644]
pidstat.h [new file with mode: 0644]
pr_stats.c [new file with mode: 0644]
pr_stats.h [new file with mode: 0644]
prf_stats.c [new file with mode: 0644]
prf_stats.h [new file with mode: 0644]
rd_stats.c [new file with mode: 0644]
rd_stats.h [new file with mode: 0644]
sa.h [new file with mode: 0644]
sa1.in [new file with mode: 0644]
sa2.in [new file with mode: 0644]
sa_common.c [new file with mode: 0644]
sa_wrap.c [new file with mode: 0644]
sadc.c [new file with mode: 0644]
sadf.c [new file with mode: 0644]
sadf.h [new file with mode: 0644]
sar.c [new file with mode: 0644]
sysconfig.in [new file with mode: 0644]
sysstat-9.1.5.lsm [new file with mode: 0644]
sysstat-9.1.5.spec [new file with mode: 0644]
sysstat.cron.daily.in [new file with mode: 0644]
sysstat.cron.hourly.in [new file with mode: 0644]
sysstat.crond.in [new file with mode: 0644]
sysstat.in [new file with mode: 0644]
sysstat.ioconf [new file with mode: 0644]
sysstat.sysconfig.in [new file with mode: 0644]
version.in [new file with mode: 0644]
xml/sysstat.dtd [new file with mode: 0644]
xml/sysstat.xsd [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
new file mode 100644 (file)
index 0000000..7782e69
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,1539 @@
+Changes:
+
+2010/09/12: Version 9.1.5 - Sebastien Godard (sysstat <at> orange.fr)
+       * Added voltage inputs statistics to sar and sadc.
+       * Added %temp field to device temperature statistics (sar -m TEMP).
+       * Added drpm field to fan speed statistics (sar -m FAN).
+       * XSD and DTD documents updated.
+       * sar manual page updated. Indicate that svctm field should
+         no longer be trusted.
+       * Removed link to isag(1) from man pages.
+       * NLS updated. Czech translation added.
+       * Sample crontabs and sysstat init script: Don't collect disk
+         data by default.
+       * Code cleaned.
+
+2010/07/29: Version 9.1.4 - Sebastien Godard (sysstat <at> orange.fr)
+       * [Jan Kaluza]: Added fan speed and device temperature
+         statistics to sar and sadc.
+       * [Jan Kaluza]: Configure script updated. Now check for
+         lm_sensors library.
+       * Configure script updated: Added --disable-sensors option.
+       * Configure script updated: Removed --enable-smp-race option.
+       * iconfig script updated.
+       * sar manual page updated.
+       * XSD and DTD documents updated.
+       * [Ivana Varekova]: sysstat init script updated.
+       * Default owner for sadc/sar crontab is now root.
+       * Various fixes in cifsiostat and nfsiostat manual pages.
+       * NLS updated.
+
+2010/06/27: Version 9.1.3 - Sebastien Godard (sysstat <at> orange.fr)
+       * [Ivana Varekova]: Move NFS code out from iostat and create
+         the new nfsiostat command.
+       * [Ivana Varekova]: Added cifsiostat command. This command
+         displays CIFS statistics.
+       * [Mario Konrad]: Added regular expressions support to pidstat's
+         option -C.
+       * [Mario Konrad]: Added option -s to pidstat to display stack
+         statistics.
+       * [Ivana Varekova]: Fixed condition used by sar to distinguish
+         betwwen a counter reset by a newly registered device and a
+         counter overflow.
+       * [Jan Kaluza]: Added --debuginfo option to iostat.
+       * [Jan Kaluza]: Added --enable-debuginfo option to configure script.
+       * iconfig configuration script updated.
+       * iostat manual page updated. Indicate that svctm field should
+         no longer be trusted.
+       * pidstat manual page updated.
+       * autoconf script updated.
+       * NLS updated.
+       * README and CREDITS files updated.
+
+2010/05/23: Version 9.1.2 - Sebastien Godard (sysstat <at> orange.fr)
+       * Added r_await and w_await fields to iostat's extended statistics.
+       * Added support for tickless CPUs in sar and mpstat.
+       * NLS was not taken into account when mpstat or sar were displaying
+         some null statistics. This is now fixed.
+       * sadc no longer syncs data with its output file contents. It
+         put a pain on flash devices as it undermined any tuning of
+         the vm's write behavior [DEBIAN Bug#559686].
+       * NLS updated. Basque translation added.
+       * iostat, sar and sa1 manual pages updated.
+       * CREDITS file updated.
+
+2010/02/28: Version 9.1.1 - Sebastien Godard (sysstat <at> orange.fr)
+       * Remove support for kernels older than 2.6.x.
+       * iostat now takes into account POSIXLY_CORRECT environment
+         variable. iostat default output for disk utilization is
+         expressed in kB/s, unless this variable is set (in which case
+         the output is expressed in blocks/s).
+       * mpstat can now display per processor software interrupts
+         statistics. This requires Linux kernel 2.6.31 or later.
+       * Because of a change in /proc/interrupts file format, mpstat
+         was no longer counting the proper number of interrupts. This
+         is now fixed.
+       * Manual pages updated.
+       * NLS updated.
+       * Code cleaned.
+
+2009/11/11: Version 9.0.6 - Sebastien Godard (sysstat <at> orange.fr)
+       * "sadf -x" now takes into account options -s and -e (which
+         specify a starting and ending time) and also interval and
+         count parameters [DEBIAN bug#546259].
+       * Option -C added to sadf. Use it to tell sadf to display comments
+         present in file (also works with XML format).
+       * sar and sadf sometimes didn't handle COMMENT records properly.
+         This is now fixed.
+       * XML output (displayed by sadf -x) modified for kernel tables
+         statistics.
+       * XSD and DTD documents updated.
+       * [Yibin Shen]: HZ variable was not explicitly set in sadc.c. This
+         is now fixed.
+       * [Lans Carstensen]: sargraph added (sargraph is a shell script
+         used to make graphs based on sadf XML output).
+       * sadf manual page updated.
+       * FAQ updated.
+       * NLS updated.
+       * CREDITS file updated.
+
+2009/09/20: Version 9.0.5 - Sebastien Godard (sysstat <at> orange.fr)
+       * sysstat should now be able to pretty print device names whose
+         minor numbers are greater than or equal to 256. (Tests have
+         been made on a large 26TB RHEL5/PP Linux cluster.)
+       * sadc manual page updated.
+       * NLS updated.
+       * FAQ updated.
+
+2009/07/19: Version 9.0.4 - Sebastien Godard (sysstat <at> orange.fr)
+       * [Jonathan Kamens]: Fix double free/memory corruption bug
+         with sadc.
+       * [Jeroen Roovers]: Get entirely rid of implicit rule for
+         libsyscom.a in Makefile to fix a problem with parallel
+         execution.
+       * sysstat.ioconf configuration file updated.
+       * NLS updated.
+       * CREDITS file updated.
+
+2009/05/24: Version 9.0.3 - Sebastien Godard (sysstat <at> orange.fr)
+       * [Michael Blakeley]: Option -z added to iostat. This option
+         tells iostat to omit output for any devices for which there
+         was no activity during the sample period.
+       * [Tomasz Pala]: Fix mpstat where interrupt values should be
+         read as unsigned integers.
+       * sar -n ALL didn't select IPv6 statistics. This is now fixed.
+       * iostat, sar and mpstat manual pages updated.
+       * sadf -x now displays file creation date.
+       * XSD and DTD documents updated.
+       * NLS updated. Latvian translation added.
+       * CREDITS file updated.
+       * Code cleaned.
+
+2009/04/02: Version 9.0.2 - Sebastien Godard (sysstat <at> orange.fr)
+       * sadc can now collect partition statistics in addition to disk ones.
+         Keywords XDISK and XALL have been added to -S option.
+       * Fixed a memory corruption in pidstat and iostat. This corruption
+         could happen when a list of comma-separated values following
+         option -p was entered on the command line.
+       * configure now takes into account a new variable named rcdir.
+         This variable may be used to specify the directory where
+         startup scripts will be installed.
+       * The value of directory for installing documentation files
+         can now be set with configure's --docdir option.
+       * Fixed a small bug in activity.c file, where there was a
+         missing semicolon between two fields.
+       * sar and sadc manual pages updated.
+       * NLS updated.
+       * CREDITS file updated.
+
+2009/03/07: Version 9.0.1 - Sebastien Godard (sysstat <at> orange.fr)
+       * Fix a crash with sar where a pointer was freed twice.
+       * NLS updated.
+       * sar manual page updated.
+       * CREDITS file updated.
+
+2009/03/01: Version 9.0.0 - Sebastien Godard (sysstat <at> orange.fr)
+       * Option -m added to sar. This option is intended to display
+         power management statistics. At the present time, only
+         CPU frequency statistics are available.
+       * sadc updated: Option "-S POWER" tells sadc to collect power
+         management statistics.
+       * sadf command updated to take into account power management
+         statistics.
+       * [Mike Harvey]: No longer truncate the interval of time to
+         32 bits, as this may cause some problems when displaying
+         average values statistics on machines with hundreds of CPU.
+       * read_uptime(): Cast values read from /proc/uptime to
+         unsigned long long.
+       * Fixed a small bug in sar where it didn't parse arguments
+         properly when some options were entered in a specific order.
+       * sadc and sar manual pages updated.
+       * XSD and DTD documents updated.
+       * FAQ updated.
+       * NLS updated.
+       * Code cleaned. Makefile cleaned.
+
+2009/01/11: Version 8.1.8 - Sebastien Godard (sysstat <at> orange.fr)
+       * IPv6 support added. A bunch of new metrics have been added to
+         sar, enabling the user to display statistics for IPv6 protocol
+         family (IPv6, ICMPv6, UDPv6 and network sockets).
+       * sadc updated: Option "-S IPV6" tells sadc to collect IPv6
+         statistics.
+       * sadf command updated to take into account IPv6 statistics.
+       * Options -S (for sadc), -P (for mpstat, sar and sadf), -p (for
+         iostat and pidstat) and -n and -I (for sar) now accept a list of
+         comma-separated arguments.
+       * [Ivana Varekova]: Make iostat display statistics for devices only
+         (and not partitions) when not using its option -d. This was
+         no longer possible with kernels 2.6.25 and later because iostat
+         couldn't distinguish between devices and partitions any more.
+       * iostat's options -x and -p are no longer mutually exclusive:
+         Extended statistics are now available even for partitions with
+         recent kernels.
+       * iostat was unable to read stats from sysfs for devices who had
+         a slash in their names (for example, iostat -p /dev/cciss/c0d0
+         didn't work properly before). This is now fixed.
+       * [Amir Rapson]: Fixed a bug in iostat where %CPU spent
+         servicing hard and soft irq were counted twice. This bug
+         was introduced in 8.1.5.
+       * DTD and XSD files updated.
+       * Manual pages updated.
+       * NLS updated. Maltese translation added.
+       * CREDITS file updated.
+
+2008/11/13: Version 8.1.7 - Sebastien Godard (sysstat <at> orange.fr)
+       * Support for SNMP statistics added to sar. Several keywords
+         have been added to option "-n". The user can now display
+         statistics about IP, ICMP, TCP and UDP network traffic.
+       * sadc updated: Option "-S SNMP" tells sadc to collect SNMP
+         statistics.
+       * sadf command updated to take into account SNMP statistics.
+       * sadf -x now also displays number of CPU.
+       * DTD and XSD files updated.
+       * sar/sadc: Each item (like network interfaces) is now counted
+         once.
+       * [Eduardo Ferro Aldama]: Option -l added to pidstat. This
+         option enables the user to display the whole command line for
+         each process.
+       * Option -h added to sar. This option displays a short help message.
+       * Cosmetic change in sadf -x output for network statistics.
+       * sadf -H now displays the real name of each activity saved in file.
+       * Fixed some memory leaks detected by valgrind.
+       * pidstat, sar and sadc manual pages updated.
+       * FAQ updated.
+       * NLS updated.
+       * CREDITS file updated.
+       * Code cleaned.
+
+2008/09/30: Version 8.1.6 - Sebastien Godard (sysstat <at> orange.fr)
+       * [David Alan Gilbert]: Option -h added to pidstat. This
+         option is used to display all activities horizontally on a
+         single line.
+       * Fixed a bug in pidstat: When pidstat was used to monitor a
+         process and all its threads (with pidstat's option -t), it
+         could display weird values if the thread group leader terminated.
+       * Header line displayed by sar, iostat, mpstat, pidstat and
+         sadf -H now includes the number of CPU.
+       * Use the correct word TGID instead of PID with pidstat -t.
+       * mpstat now displays stats for all interrupts, including NMI,
+         LOC, etc.
+       * sar and sadf now check that CPU activity is available in file.
+       * iostat's option -t now always displays the date and the time.
+       * Added option "--disable-documentation" to ./configure. Using
+         this option prevents documentation files (including manual
+         pages) from being installed.
+       * iconfig script updated. Now ask the user for documentation
+         and isag script installation.
+       * Manual pages updated.
+       * NLS updated. Indonesian and Chinese (traditional) translations
+         added.
+       * README-nls file updated.
+       * Makefile updated: There is now a dedicated target to install
+         or uninstall NLS files
+       * FAQ updated.
+       * CREDITS file updated.
+       * Code cleaned.
+
+2008/07/14: Version 8.1.5 - Sebastien Godard (sysstat <at> orange.fr)
+       * Added virtual machine time accounting to "sar -u ALL" and
+         mpstat (%guest).
+       * pidstat has also been updated to be able to display time
+         spent in virtual machine for a task, and for a task and all
+         its children.
+       * Option -S added to sar: This options tells sar to display
+         swap space utilization. Option -r now only displays memory
+         utilization.
+       * Added %swpcad to sar -S (percentage of cached swap memory
+         in relation to the amount of used swap space).
+       * Added kbcommit and %commit to sar -r (amount and percentage
+         of memory needed for current workload).
+       * sadf -x now distinguishes between options -r and -R.
+       * sadf command updated to take into account new fields
+         (%guest, %swpcad, etc.)
+       * [Ivana Varekova]: iostat now displays the total number of
+         operations per second in the NFS report.
+       * Fixed iostat so that %system (percentage of CPU utilization
+         that occurred while executing at system level) also takes
+         into account time spent to service interrupts and softirqs.
+       * Added a missing header line for activities with multiple
+         outputs displayed by sar (eg. sar -rR ...).
+       * Makefile updated: There is now a dedicated target to install
+         or uninstall manual pages.
+       * Manual pages updated.
+       * Code cleaned.
+       * XSD and DTD documents updated.
+       * isag script updated.
+
+2008/06/22: Version 8.1.4 - Sebastien Godard (sysstat <at> orange.fr)
+       * sar can now collect and display all CPU fields with its new
+         option "-u ALL". sadf has also been updated to be able to
+         display them.
+       * mpstat can now display per-CPU interrupts statistics with its
+         option "-I CPU". This was a feature available in sar that was
+         removed in previous sysstat version.
+       * mpstat uses now a separate option ("-I SUM") to display the
+         total number of interrupts for each processor.
+       * Option -A added to mpstat. This switch tells mpstat to display
+         all possible activities.
+       * NFS v4 support added to sar -n NFS(D). When both NFS v3 and
+         NFS v4 are used, stats from NFS v3 and NFS v4 are added
+         together [DEBIAN bug#434442].
+       * Code cleaned: mpstat, iostat and pidstat now use the common
+         functions from rd_stats.c to read CPU stats from /proc/stat;
+         Computing extended disk statistics (service time, etc.) is now
+         done in one place (common function used by iostat, sar, sadf).
+       * All sysstat commands are made consistent with how parameters
+         are interpreted: "COMMAND <interval>" now generates a report
+         continusouly, "COMMAND <interval> 0" causes an error,
+         "COMMAND 0" displays a report since system startup
+         [DEBIAN bug#475707].
+       * Changed XML output for processes and context switches displayed
+         by sadf -x to be consistent with output from sar.
+       * mpstat and sar manual pages updated.
+       * isag script updated.
+       * FAQ updated.
+       * DTD and XML Schema updated.
+       * NLS updated.
+
+2008/05/25: Version 8.1.3 - Sebastien Godard (sysstat <at> orange.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2170]
+       * sar, sadc and sadf heavily modified. It is now easier to add
+         (or remove) activities since sar and sadc have been rewritten
+         in a non-monolithic way with a generic design architecture.
+       * Option -c removed from sar. Task creation and context switch
+         activities are now merged and available with option -w.
+       * sar no longer displays interrupts per processor statistics.
+         This feature will be included in mpstat in next sysstat version.
+       * Option -S added to sadc. This option replaces previous options
+         -I or -d, and is used to select activities that should be
+         collected and saved in file. It is even possible to
+         select each activity collected by sadc.
+       * Format of data files created by sar/sadc heavily modified.
+         In some cases, it is now possible to add or remove activities
+         while keeping a compatible format that can be read by a previous
+         or future sysstat version.
+       * sadf now only displays activities that have been explicitly
+         selected.
+       * sar now checks that devices displayed by option -d are whole
+         devices (and not partitions) using sysstat.ioconf configuration
+         file. If this file is not found in its default directory, then
+         sysstat looks for it in current directory.
+       * gettextize entire usage() messages so that translators have
+         free scope to act.
+       * DTD and XML Schema updated.
+       * Manual pages updated.
+       * Crontab samples updated.
+       * FAQ updated.
+       * Code cleaned.
+
+2008/03/16: Version 8.1.2 - Sebastien Godard (sysstat <at> orange.fr)
+       * [Ivana Varekova]: iostat now displays read and write operations
+         per second in the NFS report.
+       * [Tomas Mraz]: sadc now retries to write its buffers when the
+         write() call has been interrupted by a signal.
+       * Use setbuf() call instead of fflush() to indicate that data
+         should not be buffered to stdout.
+       * Option -h added to sadf. Used with options -d or -D, it
+         indicates that all activities should be displayed horizontally
+         on a single line of data.
+       * sadf -d and sadf -D now display the list of fields for easier
+         data reading.
+       * sadf and iostat manual pages updated.
+       * NLS updated: Chinese (simplified) translation added, other
+         translations updated.
+
+2008/02/10: Version 8.1.1 - Sebastien Godard (sysstat <at> orange.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x216f]
+       * System activity data files now have extra header data that
+         enable to identify which version of sysstat created them.
+       * sadf -H now displays the version of sysstat used to create
+         a system activity data file.
+       * Machine architecture is now displayed in the reports header.
+         sadf -x also displays machine architecture.
+       * DTD and XML Schema documents updated.
+       * The number of processors was not properly calculated on
+         machines where a directory named cpuidle was present in the
+         /sys/devices/system/cpu directory [GENTOO bug# 207886].
+       * Use __CPU_SETSIZE definition from <sched.h> instead of a
+         static definition for the maximum number of CPUs (NR_CPUS).
+       * Improved error messages displayed by sysstat's commands.
+       * NLS updated: Finnish translation added, Dutch translation
+         updated.
+       * FAQ updated.
+       * Code cleaned and documented. Linux-like style applied to
+         code source. Large functions split into smaller ones.
+
+2008/01/06: Version 8.0.4 - Sebastien Godard (sysstat <at> orange.fr)
+       * Removed a 'packed' attribute in pidstat.h that generated
+         a warning with gcc 4.1.1.
+       * Take account of all memory zone types when calculating
+         pgscank, pgscand and pgsteal displayed by sar -B.
+       * XML Schema added. Useful with sadf option -x.
+       * sadc and sadf manual pages updated.
+       * NLS updated: Dutch translation added.
+       * NLS updated: Brazilian Portuguese translation added.
+       * NLS updated: Vietnamese translation added.
+       * NLS updated: Kirghiz translation added.
+       * NLS updated: Added a PO template file in nls directory.
+         Makefile modified to enable PO files update.
+       * sccsid string now also includes package name and version number.
+       * Makefile updated: Startup links are named S01xxx instead of S03xxx
+         to be consistent with chkconfig values.
+       * Various spelling fixes.
+       * CREDITS file updated.
+
+2007/11/19: Version 8.0.3 - Sebastien Godard (sysstat <at> orange.fr)
+       * mpstat and sar didn't parse /proc/interrupts correctly when
+         some CPUs had been disabled. This is now fixed.
+       * Fixed a bug in pidstat where a confusion between PID and TID
+         could sometimes happen, resulting in erroneous statistics
+         values being displayed.
+       * iconfig script updated: Help for --enable-compress-manpg
+         parameter is now available, help for --enable-install-cron
+         parameter updated, added parameter cron_interval.
+       * sa2 shell script can now compress sar data files using bzip2.
+       * Makefile updated: Now also remove sysstat.crond.sample.in.
+         Documentation is installed in $prefix/share/doc/ instead of
+         $prefix/doc/ directory.
+       * isag updated.
+       * FAQ updated.
+       * CREDITS file updated.
+       * Sysstat's URL updated.
+
+2007/10/26: Version 8.0.2 - Sebastien Godard (sysstat <at> orange.fr)
+       * Option -w added to pidstat. pidstat can now display task
+         switching activity.
+       * Fixed a memory leak in pidstat that was triggered when
+         reading stats for threads.
+       * Fixed a bug where device names were incorrectly displayed by
+         sar -d or sar -dp. Fixed also this bug for sadf.
+       * When using option -o, sar now saves by default all the
+         statistics into the file, including interrupts and disks
+         statistics. Interrupts and disks statistics remain optional
+         when using sadc.
+       * sysstat startup script updated.
+       * sar and pidstat manual pages updated.
+       * isag updated.
+       * NLS updated.
+       * Code cleaned.
+       * CREDITS file updated.
+
+2007/09/30: Version 8.0.1 - Sebastien Godard (sysstat <at> orange.fr)
+       * Option -t added to pistat. pidstat can now display stats for
+         every thread (TID) of a process.
+       * pidstat's option -T CHILD now reports global statistics for
+         selected tasks and all their children (and not only for the
+         children).
+       * pidstat now reads VSZ and RSS values from /proc/#/stat instead
+         of /proc/#/status.
+       * Fixed a rare parallel make issue creating archive libsyscom.a
+         [GENTOO bug #193208].
+       * pidstat manual page updated.
+       * SCCS identification string added to all commands.
+       * NLS updated.
+       * Code cleaned.
+       * CREDITS file updated.
+
+2007/09/02: Version 8.0.0 - Sebastien Godard (sysstat <at> orange.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x216e]
+       * pidstat command improved. It is now able to report CPU and
+         page fault statistics for the child processes of a task.
+       * Option -T added to pidstat. This option tells pidstat if
+         statistics are to be reported for tasks (which is the default)
+         or for their children.
+       * Fixed a security flaw in sysstat startup script (CVE-2007-3852).
+       * Removed super*, dquot* and rtsig* fields from sar -v.
+         They were made obsolete in Linux kernels 2.6.
+       * Fields file-sz and inode-sz from sar -v renamed to file-nr
+         and inode-nr.
+       * Added field pty-nr (number of pseudo-terminals) to sar -v.
+       * Added field tcp-tw (number of sockets in TIME_WAIT state)
+         to sar -n SOCK.
+       * sar and sadf updated so that they can properly extract records
+         (with their options -s and -e) from a file containing data for
+         two consecutive days.
+       * Added option "--enable-install-isag" to "configure" to enable
+         the user to install isag script.
+       * Fixed a typo in iconfig script: The user was unable to specify
+         the crontab owner.
+       * Manual pages updated.
+       * Sysstat DTD file updated.
+       * isag updated.
+       * NLS updated.
+       * FAQ updated.
+       * CREDITS file updated.
+       * Author's email updated.
+
+2007/07/08: Version 7.1.6 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x216d]
+       * New VM paging metrics added to sar (option -B).
+       * Options -x and -X have been removed from sar. Use pidstat(1)
+         command instead.
+       * NR_CPUS increased to 16384 so that sysstat can be used on
+         very large systems.
+       * Fixed a bug in sadc.c where it was using a hardcoded 256 char
+         buffer to store lines read from /proc/interrupts.
+       * sar updated to avoid overflow when computing some average values.
+       * sar and mpstat manual pages updated.
+       * Sysstat DTD file updated.
+       * FAQ updated.
+       * NLS updated.
+       * CREDITS file updated.
+
+2007/06/07: Version 7.1.5 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x216c]
+       * Option -d added to pidstat: This option reports I/O statistics
+         for individual tasks.
+       * Option -C added to sadc: This option enables the user to insert
+         a timestamped comment in the binary data file.
+       * Option -C added to sar: This option tells sar to display
+         comments inserted in the binary data file by sadc.
+       * sadf updated to display comments.
+       * Fixed a bug that could happen while reading /proc/interrupts,
+         where irq numbers can now be 4 digits long in recent kernels.
+       * Fixed a possible buffer overflow in ioconf.c.
+       * Makefile updated: Remove previous manual pages before installing
+         new ones.
+       * pidstat, sar and sadc manual pages updated.
+       * Sysstat DTD file updated.
+       * Fixed DTD version in sadf.h.
+       * NLS updated.
+       * CREDITS file updated.
+
+2007/04/29: Version 7.1.4 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Addition of a new command "pidstat" aimed at displaying
+         per-process statistics.
+       * Option -N added to iostat. This option enables the user to
+         query any device-mapper devices for their registered device name
+         [bugzilla #177540].
+       * Fixed a small memory leak in readp_uptime() function.
+       * Typo fixed in configure.in file
+         (s+INIT_DIR/etc/rc.d/init.d+INIT_DIR=/etc/rc.d/init.d+).
+       * Stricter syntax checking for iostat.
+       * sar -dp now displays the device as "devM-N" (instead of "nodev")
+         when it can't find its real name in sysstat.ioconf file.
+       * iostat -t now also takes into account the value of environment
+         variable S_TIME_FORMAT.
+       * Manual pages now take into account variables defined by
+         "configure".
+       * isag now takes into account variables defined by "configure".
+       * "configure" now determines automatically whether workaround for
+         SMP race is needed. This workaround is for SMP kernels 2.2.x with
+         x <= 15 only.
+       * pidstat manual page added. Other manual pages updated.
+       * Makefile updated.
+       * NLS updated.
+       * FAQ updated.
+       * Code cleaned again and again...
+       * Removed sargon from contrib directory since its features are
+         now included in sysstat by default.
+
+2007/03/27: Version 7.1.3 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x216b]
+       * Hotplug CPU support: Fixed a bug that happened when sar tried
+         to read a datafile created while a least one processor was
+         disabled.
+       * Better support for keeping sar logfiles for more than one month
+         (several bugs fixed in sa1 and sa2 scripts).
+       * Fixed a small bug in sa2 script, where obsolete log files would not
+         be deleted if system activity directory was a symbolic link to
+         some other directory.
+       * The new variable "conf_dir" now enables the user to specify sysstat
+         configuration directory. This variable is used by "configure".
+       * Added option "--enable-compress-manpg" to "configure" to enable the
+         user to compress manual pages during installation.
+       * Removed some 'packed' attributes in sa.h and iostat.h that
+         generated warnings with gcc 4.1.1.
+       * isag (Interactive System Activity Grapher) improved.
+       * CREDITS file updated.
+       * Code cleaned.
+
+2007/03/04: Version 7.1.2 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x216a]
+       * Better hotplug CPU support. Now sysstat no longer assumes that
+         CPU#0 can never be disabled. It uses /proc/uptime file to
+         compute time interval.
+       * Various structures realignment to save memory (and disk space).
+       * Make sar -n display network traffic in kilobytes instead of bytes.
+       * Make sysstat compile cleanly with gcc 4.0.2.
+       * sysstat DTD file updated.
+       * NLS updated: Danish translation added.
+       * Manual pages updated.
+       * CREDITS file updated.
+
+2007/02/21: Version 7.1.1 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Autoconf support added.
+       * iconfig (Interactive Configuration script) added. iconfig is
+         a front-end to ./configure.
+       * spec file updated.
+       * FAQ updated.
+       * sadf manual page updated.
+       * CREDITS file updated.
+
+2007/02/04: Version 7.0.4 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Removed linux/major.h from list of files included in ioconf.c.
+         It was actually not used and also prevented sysstat from being
+         compiled on GNU/kFreeBSD.
+       * Sysstat scripts (sa1, sa2, sysstat) modified to enable the user
+         to keep sar data for more than one month.
+       * New parameter (COMPRESSAFTER) added to /etc/sysconfig/sysstat.
+         It gives the number of days after which sar datafiles must be
+         compressed to save disk space.
+       * Replaced the word "Device" with "Filesystem" for iostat
+         NFS report.
+       * iostat manual page updated.
+       * Makefile updated: don't use a static list of languages to
+         compile NLS files.
+       * "make install" now always install sysstat configuration file
+         (default location is /etc/sysconfig).
+       * FAQ updated.
+       * Added my email address when displaying sysstat version.
+       * NLS updated.
+
+2006/12/03: Version 7.0.3 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * iostat NFS statistics added.
+       * iostat manual page updated.
+       * Columns "r/s" and "w/s" enlarged for iostat -x.
+       * Minor change so that sar -u may fit in 80 columns.
+       * NLS updated.
+       * CREDITS file updated.
+
+2006/10/22: Version 7.0.2 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Hotplug CPU support added to sar and mpstat 
+       * Use /sys to count the number of available processors.
+         /proc/stat is used for that only if /sys is not found.
+       * sysstat DTD updated.
+       * sysstat spec file updated (gettext is now required).
+       * NLS updated: Swedish translation added.
+       * Manual pages updated.
+       * Makefile updated.
+       * CREDITS file updated.
+
+2006/09/17: Version 7.0.1 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Use now sysconf() function to get the size of a memory page
+         instead of using header file <asm/page.h>.
+       * The time specified with sadf options -s and -e is now always
+         considered as given in local time. sadf output is now really
+         consistent with that of sar.
+       * Fixed a bug in the SREALLOC() macro which was causing sar to
+         exit unexpectedly with this message: "realloc: Success".
+       * Try to better guess when a stats title line has to be displayed
+         by sar.
+       * Makefile updated (SMP_RACE definition was no longer taken into
+         account when compiling sadc).
+       * sysstat spec file updated.
+       * sar and sadf manual pages updated.
+       * FAQ updated.
+       * CREDITS file updated.
+
+2006/07/09: Version 7.0.0 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * S_TIME_DEF_TIME environment variable added for sar, sadc and
+         sadf.
+       * Use now sysconf() function to get the number of clock ticks
+         per second (HZ value) instead of using kernel include file
+         <sys/param.h>.
+       * Columns "Device", "rrqm/s" and "wrqm/s" enlarged for iostat -x.
+       * sysstat installation process updated to use chkconfig if
+         available.
+       * Manual pages updated.
+       * Makefile updated.
+       * sysstat web site address updated.
+       * Code cleaned.
+       * CREDITS file updated.
+
+2006/05/24: Version 6.1.3 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2169]
+       * Option -P can now be used with sar even on SMP machines where
+         only one processor is available.
+       * Small bug fixed for mpstat, where explicitly specifying
+         processor 0 ("-P 0") could lead to incorrect output on UP
+         machines.
+       * Option -D added to sadf: this option displays the contents of
+         a data file in a database-friendly format with a timestamp
+         expressed in seconds from the epoch.
+       * sadf manual page updated.
+       * NLS updated.
+       * CREDITS file updated.
+
+2006/04/23: Version 6.1.2 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Fix incorrect NFS client and server statistics for sar.
+       * sar can now display stats for newly created processes when
+         option -x ALL or -X ALL is used.
+       * iostat -x was displaying redundant information. It now
+         displays amount of data read from or written to devices in
+         sectors, kilobytes or megabytes depending on the switch used.
+       * isag updated to keep up with current sar version.
+       * sar and mpstat manual pages updated.
+       * FAQ updated.
+
+2006/02/22: Version 6.1.1 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2168]
+       * New field added to sar: %steal.
+       * The size of a long integer in now saved in the header of the
+         data file created by sar. This size can be displayed with
+         sadf -H.
+       * Replaced the keyword "FULL" by the keyword "ALL" for sar -n
+         to be consistent with remaining options.
+       * Makefile updated (use implicit rules).
+       * sar manual page updated.
+       * CREDITS and FAQ files updated.
+
+2005/11/28: Version 6.0.2 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * New field added to mpstat and iostat: %steal.
+       * sar updated to take into account cpu steal time.
+       * Off-by-one error in ioc_conv which was corrupting device names
+         on 64-bit architecture [Debian bug #334305].
+       * Binary RPM package now installs a sample crontab in /etc/cron.d.
+       * Makefile updated (remove sysstat.cron.* during make clean -
+         new target added: sysstat.crond.sample).
+       * sar now checks exit code from dup2() system calls.
+       * Option -V now only displays sysstat version number.
+       * NLS updated.
+       * FAQ updated.
+       * Manual pages updated.
+
+2005/06/25: Version 6.0.1 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Fixed a memory leak in ioconf parsing functions used by sar
+         and iostat.
+       * sar now displays its statistics to STDOUT in addition to saving
+         them into the file when option -o has been entered on the
+         command line.
+       * sar now recalculates number of system items (network interfaces,
+         disks, serial lines, etc.) when a file rotation happens.
+       * Make sar -b work again when used without option -d.
+       * Small changes so that sysstat can be compiled with gcc-4.0.1.
+       * sysstat updated so that it may be installed on Slackware.
+       * sar manual page updated.
+       * CREDITS file updated.
+       * Code cleaned.
+
+2005/05/14: Version 6.0.0 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2167]
+       * Additional fields added to sar -y (TTY statistics). sar, sadf
+         and DTD updated.
+       * sar -d now only reports for used devices (devices with non zero
+         statistics).
+       * Stricter sadf syntax checking: various output formats are now
+         mutually exclusive.
+       * Stricter iostat syntax checking: -k and -m options are now
+         mutually exclusive.
+       * iostat: option -m is now taken into account even when
+         displaying extended statistics.
+       * Fixed a bug that prevented iostat from displaying stats about
+         devices that were unknown in sysstat.ioconf file.
+       * iostat might display bogus sectors values when the corresponding
+         kernel counters had overflown. This is now fixed.
+       * "sadf datafile -- -A" should also display individual interrupts
+         if available in datafile.
+       * Fixed a bug that prevented sar -x from displaying stats about a
+         process if it was after the first 256 processes in the process
+         list.
+       * Manual pages updated.
+       * sa1 script always uses option -d in crontab.
+       * sysstat.ioconf device configuration file updated.
+       * NLS updated.
+       * FAQ and CREDITS files updated.
+       * Code cleaned.
+
+2005/02/25: Version 5.1.5 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * -x option added to sadf: it is now able to display the contents of
+         a sar datafile in XML. The corresponding DTD (Document Type
+         Definition) is included in the sysstat package.
+       * Small code change so that sysstat may be compiled with gcc-4.0.
+       * A few typos fixed in formulas used by sadf to display stats 
+         on machines where HZ<>100 (typos appeared in sysstat 5.1.4).
+       * Fixed a bug in the stats displayed by sar -d.
+       * Removed a false workaround in iostat: better show that the kernel
+         is buggy rather than display a value that seems correct but which
+         is actually not...
+       * Fixed sar -i option which might not select records at the specified
+         interval on machines with multiple processors.
+       * NLS updated and cleaned. Do no longer translate fields names (sar,
+         iostat, etc.). Changed nb_NO.po and nn_NO.po files to nb.po and
+         nn.po.
+       * Bug fixed in spec file: when installing sysstat i586 RPM package,
+         sa1 and sa2 scripts were pointing to the wrong sadc location.
+       * Now sar and sadc display the magic number when they meet an
+         invalid system activity file.
+       * sadf manual page updated.
+       * sysstat RPM spec file is now included in source package.
+       * Code cleaned.
+       * FAQ, Makefile and CREDITS files updated.
+
+2005/01/02: Version 5.1.4 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2166]
+       * NFS client and server statistics added to sar.
+       * sar -d now only reads stats for devices (and not partitions)
+         from /proc/partitions. (This is what it was already doing with
+         /proc/diskstats).
+       * Display routines from sadf merged, so that -ppc and -db
+         always output the same values.
+       * sadf updated to handle NFS statistics.
+       * sadf can now display the header of a data file (option -H).
+       * Define MAX_BLKDEV in ioconf.h if non-existent in <linux/major.h>.
+       * sar now looks for sadc in one directory only, specified at
+         compile time. Moreover it is now possible to have two different
+         sysstat versions installed: sar knows where its sadc counterpart
+         is located.
+       * sapath.in removed. SADC_PATH is defined in CONFIG file.
+       * sar and sadf manual pages updated.
+       * sysstat.ioconf file updated.
+       * Fixed a bug in i386 RPM package, where sadc location was not
+         consistent with that of sar. Spec file updated.
+       * Makefile updated.
+       * NLS updated.
+       * Various cosmetic changes (code and manual pages). Code cleaned.
+       * FAQ and CREDITS files updated.
+
+2004/11/22: Version 5.1.3 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2165]
+       * Option -p added to sar: It enables sar (and also sadf) to
+         display device names as they appear in /dev.
+       * sysstat.ioconf support added.
+       * New fields added to sar -d (more disk activities displayed):
+         avgrq-sz, avgqu-sz, await, svctm, %util.
+       * sadf updated to handle new disk activities.
+       * I/O and transfer rate statistics as displayed by sar -b are
+         available whatever the version of the kernel is (i.e. even on
+         recent kernels).
+       * Disk stats are read by sadc from /proc/stat only if they cannot
+         be read from /proc/{partitions,diskstats}.
+       * sadc: Some variables declarations moved around.
+       * sar manual page updated.
+       * Added workaround for EMC PowerPath driver bug to enable iostat
+         to display proper device name.
+       * Makefile updated: Use $@ and $< everywhere; 'make {iostat,mpstat}'
+         work again; Create object files before linking; Removed unused
+         IOS_DFLAGS variable; Use DESTDIR variable everywhere; Create
+         libsysioc.a; Install sysstat.ioconf.
+       * NLS updated.
+       * README and CREDITS files updated.
+
+2004/11/05: Version 5.1.2 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * sar -d now also uses /proc/partitions to get its data.
+         From now on sar -d looks in the following files in that order:
+         /proc/diskstats, /proc/partitions, /proc/stat.
+       * sadc writes disks data to file only if -d option is explicitly
+         set on the command line.
+       * sadc now reads individual interrupts data from /proc/stat only
+         if -I option was entered on the command line.
+       * 'sar -A' is now equivalent to 'sar -bBcdqrRuvwWy -I SUM -I XALL
+         -n FULL -P ALL' (i.e. individual interrupts are also included
+         in activities).
+       * Option -m now tells iostat to display statistics in megabytes
+         per second instead of blocks per second.
+       * Make history (number of days to keep log files) configurable
+         in /etc/sysconfig/sysstat file, which is used by sa2 script.
+       * Now use Vixie cron to launch sadc when possible.
+       * sadc, sa1 and sa2 may now be installed in another directory
+         than ${PREFIX}/lib/sa. This is useful on 64-bit systems where
+         the proper directory should be ${PREFIX}/lib64/sa.
+       * When uninstalling sysstat, always delete sysstat script,
+         config file and links in /etc tree. Also always delete
+         Vixie cron entry.
+       * sysstat script now returns real exit code.
+       * sar/sadc: Stricter syntax checking for -x and -X options use.
+       * sysstat "*.sh" files renamed in "*.in".
+       * Makefile updated.
+       * sadc and sar manual pages updated.
+       * NLS updated.
+       * FAQ updated.
+       * CREDITS and README files updated.
+
+2004/10/09: Version 5.1.1 - Sebastien Godard (sysstat <at> wanadoo.fr)
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2164]
+       * sar now reads CPU data, number of context switches, number
+         of sectors and total number of interrupts as 64-bit unsigned
+         values. It also reads the number of running processes as
+         unsigned long instead of unsigned int.
+       * sadf - System activity data formatter command added.
+       * Options -h and -H removed from sar. "sar -h" is replaced by
+         "sadf -p", and "sar -H" is replaced by "sadf -d". Read sadf
+         manual page, as its syntax is a bit different from that of sar.
+       * Common code for sar and sadf moved to sa_common.c file.
+       * pid_stats members don't need to be aligned since these stats
+         are not written to daily data files. Packing them saves some
+         memory on 32-bit architectures.
+       * No longer indicate that -x and -X are possible options for sadc.
+         They are only useful when used as options for sar, not sadc.
+       * Minor buffer overrun fixed in iostat.
+       * Updated CPU header for iostat and mpstat: CPU used while executing
+         at the system level is displayed as '%system' by iostat (like sar)
+         and as '%sys' by mpstat.
+       * sadf manual page added. Other manual pages updated.
+       * Updated the GPL notices (the address of the FSF was wrong).
+       * Makefile updated.
+       * NLS updated.
+       * README, FAQ and CREDITS files updated.
+
+2004/08/09: Version 5.0.6 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * The value for file-sz reported by sar -v was a number of free
+         handles, and not a number of used ones! This is now fixed (and
+         this is really now a number of _used_ file handles).
+       * Now ask during config stage for the directory where sadc will
+         be located. This may be useful for some systems where sadc
+         needs to be installed in a specific location (e.g. on 64 bit
+         s390 systems, the proper directory should be /usr/lib64/sa).
+       * sa1 script updated: Use '-' to specify current daily data file
+         instead of guessing its name using current date.
+       * NLS updated: be consistent with GNU gettext standards.
+       * iostat manual page updated.
+       * FAQ updated.
+       * Makefile updated.
+       * CREDITS file updated.
+
+2004/06/08: Version 5.0.5 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * Timestamp is no longer limited to 11 characters. This should
+         avoid problems with somes locales (for example Japanese locale,
+         where 'mojibake' used to be displayed by sar and mpstat sometimes).
+       * Fixed a bug in sysstat RPM spec file (symlinks to sysstat
+         script were wrong in /etc/rc.d directories).
+       * sar now checks parameters for options -n, -s and -e more
+         aggressively.
+       * NLS updated: Japanese translation added.
+       * Various typos fixed in several files (manual pages, README, etc.)
+       * CREDITS file updated.
+
+2004/05/20: Version 5.0.4 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * When trying to lock file, sadc now checks for both EWOULDBLOCK
+         and EAGAIN error codes to be portable.
+       * sar could sometimes display a line whose time stamp was greater
+         than the limit set by -e option. This is no longer possible.
+       * The sadc command in sysstat.sh script had to be enclosed in
+         quotes to work when called via 'su -c'.
+       * The sysstat.sh script was sending the output of sadc command
+         to stdout instead of the standard system activity file. This
+         is now fixed.
+       * Outfile must now be explicitly set to "-" for sadc to use the
+         standard system activity file.
+       * FAQ updated.
+       * iostat manual page updated. Typo fixed in sadc manual page.
+       * Fixed the "Save picture" option of isag script.
+
+2004/04/07: Version 5.0.3 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * iostat now reads the number of sectors in /proc/diskstats or
+         from sysfs as 64-bit unsigned values.
+       * iostat and mpstat now read CPU data and the number of
+         interrupts in /proc/stat as 64-bit unsigned values.
+       * sar uses "%u" instead of "%d" to read unsigned integer
+         values _everywhere_.
+       * sar and sadc are now a little bit more verbose when dealing
+         with invalid activity files.
+       * Network interface name size is now read from include file
+         <net/if.h>.
+       * FAQ polished up.
+       * Slovak translation added. NLS updated.
+       * Typo fixed in iostat manual page.
+       * Makefile and CREDITS file updated.
+       * isag upgraded to version 1.26 (isag package release 0.81.0).
+
+2004/03/10: Version 5.0.2 - Sebastien Godard (sysstat <at> wanadoo.fr)
+       * iostat will _again_ look for statistics in /proc/partitions if
+         available. Too many production servers are still using 2.2.x or
+         2.4.x kernels and iostat must be able to display extended stats
+         also for them (/proc/partitions support was removed in sysstat
+         version 4.1.3). So now, iostat gets its statistics from the
+         following sources in that order: /proc/diskstats, sysfs,
+         /proc/partitions and then /proc/stat.
+       * statistics are now read by iostat and mpstat as unsigned long
+         instead of int to avoid integer overflow.
+       * iostat should now handle properly the case when the 'weighted
+         number of milliseconds spent doing I/Os' (read in sysfs or
+         /proc/{partitions,diskstats}) decreases with time.
+       * iostat manual page updated.
+       * Minor temporary file vulnerability fixed in isag command.
+       * README, FAQ and CREDITS files updated.
+       * Author's email changed.
+
+2004/02/02: Version 5.0.1 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * -L option added to sadc. Enable sadc to lock its output file
+         to prevent multiple instances from writing to it at once.
+       * sa1 and sysstat scripts updated to take advantage of -L option.
+       * Handle the case where, under very special circumstances, STDOUT
+         may become unavailable, and sar, iostat and mpstat are no longer
+         able to display anything.
+       * sadc as called in sysstat script also uses -F option to force
+         the creation of daily data file.
+       * sar, sadc and mpstat manual pages updated.
+       * Code cleaned.
+       * FAQ and CREDITS files updated.
+
+2003/11/09: Version 5.0.0 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * New fields added to mpstat: %irq (%time spent servicing
+         interrupts) and %soft (%time spent servicing softirqs).
+       * sar and iostat updated to take into account time spent servicing
+         interrupts and softirqs when displaying percentage of time
+         in system mode.
+       * By default iostat now displays only statistics information for
+         devices that are used by the system. You should now use the ALL
+         keyword to tell iostat to display statistics for every device
+         including those that have never been used.
+       * The file version.h is now dynamically created. sysstat's version
+         number is now only recorded in the Makefile.
+       * sar manual page updated: beginning with kernels 2.4 and later,
+         pgpgin and pgpgout statistics are in kilobytes and not in
+         blocks (see linux-2.4/fs/proc/proc_misc.c and
+         linux-2.6/mm/page_alloc.c).
+       * iostat and mpstat manual pages updated.
+       * Makefile updated: don't process NLS files if they are up-to-date.
+       * sysstat's RPM spec file updated to enable clean, non-root builds.
+       * NLS updated.
+       * FAQ and CREDITS files updated.
+
+2003/09/28: Version 4.1.7 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2163]
+       * /proc/diskstats is now the preferred source for iostat to get its
+         statistics. If non-existent, iostat falls back on sysfs then
+         on /proc/stat.
+       * In addition to devices, partitions can also be entered on the
+         command line for iostat providing that option -x is not used.
+       * /dev prefix has been removed from device name displayed by iostat -x.
+       * sar -d now looks for disks statistics in /proc/diskstats with
+         post 2.5 kernels.
+       * sar uses /proc/vmstat file with post 2.5 kernels to find paging
+         and swapping statistics.
+       * activepg, inadtypg, inaclnpg and inatarpg stats removed from
+         sar -B report (they were not really useful).
+       * sar -B now displays the number of page faults made by the system
+         (pgfault/s and pgmajflt/s).
+       * Stat on shared memory removed from sar -r and sar -R (this stat
+         was no longer maintained by the kernel since 2.4 because of
+         performance problems).
+       * Cached swap statistic information added to sar -r.
+       * sar -d now displays separate statistics for sectors that are
+         read from or written to devices.
+       * %file-sz (percentage of used file handles) is no longer displayed
+         by sar -v, since the upper limit for the number of open files
+         will self-scale with 2.6 kernels.
+       * sar now looks more aggressively for network devices in /proc/net/dev.
+       * Heading spaces in network interface names removed (sar -n).
+       * Fixed a problem reading /proc/interrupts when there are a lot
+         of CPUs (mpstat, sadc).
+       * NR_IRQS value increased to 256, since IA64 supports 256 irqs
+         per CPU.
+       * Some stats counters are now read as unsigned long instead of
+         unsigned int (pgpgin, pgpgout, pswpin, pswpout, irq_sum).
+       * sar and iostat manual pages updated.
+       * FAQ, README and CREDITS files updated.
+       * NLS updated.
+
+2003/08/20: Version 4.1.6 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! [0x2162]
+       * Machine uptime calculation is now optimized on SMP machines
+         to minimize the consequences if an overflow condition happens.
+         Especially useful when asking for stats since system boot.
+       * -F option added to sadc. Useful to force the creation of the
+         daily data file: an already existing file with a wrong format
+         will be truncated by sadc if this option is used.
+       * sa1 script now calls sadc with -F option.
+       * The processor number to which the process is attached was no
+         longer displayed by sar -x. Make it appear again.
+       * CPU usage for processes, as displayed by sar -x and sar -X, should
+         now be correct on machines where HZ <> 100 (e.g. IA64 architecture).
+       * iostat still assumed that jiffies were 100ths of a second in some
+         places. Now use Linux HZ definition *everywhere*.
+       * The average I/O requests queue length as displayed by iostat -x was
+         wrongly calculated. This is now fixed.
+       * Manual pages updated.
+       * NLS updated.
+       * Cosmetic changes in various parts of the code.
+       * FAQ, README and CREDITS files updated.
+
+2003/07/21: Version 4.1.5 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! Delete existing data files
+         in /var/log/sa directory! [0x2161]
+       * 'sar -x <pid>' and 'sar -X <pid>' work again.
+       * sar had a longstanding bug that prevented option -P from
+         working properly if the machine had more than 32 processors.
+         This is now fixed.
+       * Fixed a bug introduced in 4.1.2, which made some LINUX RESTART
+         messages to not be displayed by sar.
+       * sar now uses bitmap of char instead of int to avoid endianness
+         problems.
+       * sar can now handle a huge number of processors, serial lines and
+         network interfaces.
+       * FAQ updated.
+
+2003/07/01: Version 4.1.4 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! Delete existing data files
+         in /var/log/sa directory! [0x2160]
+       * Fixed the way overflow conditions were handled by sar for
+         interfaces counters.
+       * On really big machines with 100 GB of memory or more, the values
+         read by sadc in /proc/meminfo would get truncated and cause havoc
+         in the calculations. This is now fixed.
+       * iostat and sar can now read many more disk entries in /proc/stat if
+         necessary.
+       * Option "-x SUM" removed for sar. It was used to tell sar to display
+         the total number of minor and major faults made by the system.
+         Unfortunately, the calculation was tricky, and the results were
+         uncertain...
+       * NLS updated. Polish translation added. Also proper charset and
+         encoding declarations added to fix msgfmt warnings and allow
+         gettext to recode between various charsets (e.g. German
+         translation will be shown properly both with
+         LANG=de_DE.ISO-8859-1, and LANG=de_DE.UTF-8)
+       * Code 'sanitization'.
+       * Manual pages updated.
+       * README and FAQ files updated.
+
+2003/05/08: Version 4.1.3 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * iostat should now be fully 2.5/2.6 kernel compliant.
+       * Disks arrays in iostat are now dynamically sized.
+       * iostat: sysfs is now used in preference to /proc/stat if available.
+       * iostat will no longer look for statistics in /proc/partitions.
+         sysfs filesystem must now be available for iostat to get its
+         extended stats (post 2.5 kernels).
+       * iostat: Devices for which statistics are requested can now be entered
+         on the command line even if option -x is not used.
+       * Usage messages updated.
+       * Manual pages updated.
+       * Code cleaned (dk_drive_sum removed in iostat, long lines folded,
+         functions split in smaller parts, etc.)
+       * NLS updated. Romanian translation added.
+       * isag upgraded to version 1.22.
+
+2003/01/24: Version 4.1.2 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! Delete existing data files
+         in /var/log/sa directory! [0x215f]
+       * sar -q now also displays load average for the past 15 minutes.
+       * -P option added to sar. This option enables sar to display
+         stats on a per processor basis. Options -U and '-I PROC' are
+         deprecated. 'sar -U ALL' is replaced by 'sar -u -P ALL', and
+         'sar -I PROC' by 'sar -I SUM -P ALL'.
+       * Fixed iowait value displayed by sar on SMP machines with pre 2.5
+         kernels.
+       * When displaying CPU utilization on SMP machines, sar now
+         recalculates the interval based on current CPU's tick count.
+       * Always check that the number of CPUs has not increased when
+         reading /proc/stat (sadc, mpstat).
+       * sadc: Don't assume that the first line in /proc/net/sockstat
+         concerns sockets. Check it!
+       * Serial lines are ignored by sadc for every kind of kernels
+         (UP, SMP...) if SMP_RACE is defined.
+         SMP_RACE is no longer defined by default in RPM packages.
+       * Code cleaned: Dead code removed in iostat.c, some lines longer
+         than 80 chars folded, etc.
+       * sar manual page updated.
+       * FAQ updated.
+       * NLS updated.
+
+2003/01/02: Version 4.1.1 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! Delete existing data files
+         in /var/log/sa directory! [0x215e]
+       * sar -u/-U, iostat and mpstat can now display time spent in
+         I/O wait mode (with 2.5 kernels and above).
+       * Values like -1 and -2 are no longer aliases for keywords
+         ALL and XALL (sar -U, sar -I, mpstat -P).
+       * Buglet fixed in iostat.h.
+       * LC_CTYPE needs to be set, or it will emit messages with ?????? only
+         on some locales, especially ja_JP.eucJP
+       * sar, mpstat and iostat manual pages updated.
+       * NLS updated.
+       * CREDITS file updated.
+       * Typo removed in FAQ file.
+
+2002/11/13: Version 4.0.7 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Make data for timestamp 00:00:00 appear in one of the daily data
+         files when sar/sadc rotates its output file.
+       * Take out check for non SMP configuration when asking for
+         mpstat -P.
+       * sargon script updated.
+       * FAQ updated.
+
+2002/08/04: Version 4.0.6 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * mpstat now uses a bitmap of char instead of int to avoid endianness
+         problems. As a consequence, mpstat should now work on PowerMac
+         architectures.
+       * CPU activity as displayed by mpstat -P for a given processor was
+         in a wrong range on SMP machines (e.g. 0-50% for a dual processor
+         box).
+       * Missing bitmap initialization fixed in mpstat.c.
+       * Configuration script updated.
+       * FAQ updated.
+
+2002/05/12: Version 4.0.5 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Average wait times and service times as displayed by iostat -x
+         were wrong by a factor of 10. This is now fixed.
+       * Linux RESTART messages must now be in the interval specified by
+         -s/-e options to be displayed by sar.
+       * Fixed a small bug that affected the timestamp for RESTART messages
+         displayed by sar -h when option -t was used.
+       * sar -H now displays its data in local time instead of UTC when
+         option -t is used.
+       * sargon shell script added.
+       * Created a contrib directory, including sargon and isag commands.
+       * NLS updated.
+       * FAQ updated.
+       * Makefile updated.
+       * sar manual page updated.
+
+2002/04/07: Version 4.0.4 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * iostat is now able to display I/O activity in kB/s with 2.4.x
+         kernels (option -k).
+       * Fixed a typo in 'sar -W -h' output.
+       * Try to handle the case when some parameters in /proc/net/dev
+         may overflow ULONG_MAX.
+       * 'sar -d' now displays sectors per second instead of blocks
+         per second.
+       * iostat and sar manual pages updated.
+       * Added a FAQ.
+       * NLS updated: Russian translation added.
+
+2002/01/27: Version 4.0.3 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * iostat now displays statistics in kB/s when option -x is used.
+       * Configuration script updated.
+       * sar and iostat manual pages updated.
+       * umask also set in sa1 shell script.
+       * Various sanity checks added.
+       * Fixed potential segmentation faults that could happen with some
+         locales.
+       * KB (standing for kilobytes) replaced with kB in various places.
+       * NLS updated: Italian translation added.
+
+2001/09/22: Version 4.0.2 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * CPU usage, as displayed by iostat, mpstat and sar, should now
+         be OK on machines where HZ <> 100 (e.g. IA64 architecture).
+       * MAX_PART constant set to 256 in iostat.h.
+       * "-H" database friendly option added to sar.
+       * Better disks and network interfaces management (both may be
+         registered dynamically).
+       * Made options "-s" and "-e" work when option "-h" is used.
+       * isag upgraded to version 1.17.
+       * isag installation is now optional and can be chosen at config stage.
+       * Now try to install man pages in ${PREFIX}/share/man instead of
+         ${PREFIX}/man.
+       * sa2 shell script updated.
+       * Configuration script updated.
+       * sar manual page updated.
+       * NLS updated: Norwegian translation added.
+
+2001/06/24: Version 4.0.1 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Files created by sa2 shell script were world writable. This is
+         now fixed.
+       * sa2.sh shell script updated: only remove sa?? and sar?? files.
+       * Don't use PAGE_SHIFT since it no longer necessarily exists in
+         <asm/page.h>. Compute it using page size instead.
+       * Cosmetic changes for iostat.
+       * NLS updated: Afrikaans translation added.
+
+2001/04/08: Version 4.0.0 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Better network interfaces handling. Now take into account the
+         fact that they may be registered/unregistered dynamically.
+       * Changed formula used to display statistics in order to avoid
+         overflow conditions.
+       * Fixed a bug in iostat, where the %util value scaled incorrectly.
+       * Better long file names management by iostat.
+       * mpstat and sar no longer periodically display the title line when
+         stdout has been redirected to a pipe or a file.
+       * sa2.sh shell script updated: Now exec sadc.
+       * Configuration script updated.
+       * NLS updated.
+       * Makefile updated.
+       * Manual pages updated.
+       * isag command updated.
+
+2001/03/04: Version 3.3.6 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! Delete existing data files
+         in /var/log/sa directory! [0x215d]
+       * New paging statistics added (sar -B). Kernel 2.4 only.
+       * Load averages and queue length statistics added (option -q for sar).
+       * Per device statistics added (option -d for sar). Kernel 2.4 only.
+       * Better accuracy when computing average for some statistics.
+       * Display all the contents of a daily data file when the count
+         parameter is not given on the command line.
+       * Check sar command line options more aggressively.
+       * iostat no longer freezes if -c and -d options are used together.
+       * Fixed a bug that prevented iostat from displaying more than an
+         average of three devices with 2.4 kernels (a buffer was too small).
+       * Check added to ensure that sar and sadc commands are consistent.
+       * sar manual page updated.
+       * NLS updated.
+       * Code cleaned (use smaller subroutines).
+       * Makefile updated.
+       * isag command updates.
+
+2001/02/11: Version 3.3.5 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * iostat command improved. Take now full advantage of Stephen
+         Tweedie's I/O accounting patch to display extended statistics
+         (option -x).
+       * The default value for the count parameter of the sar command is
+         now 1 (this is how sar works with other Un*xes...). A value of
+         0 will indicate that reports are to be generated continuously.
+       * Code cleaned: Now always use 'double' numbers instead of the
+         INT_PART, INT_VAL, DEC_PART and DEC_VAL macros.
+       * Don't assume that jiffies are 100ths of a second. Use Linux
+         HZ definition instead.
+       * NLS updated (small fix).
+       * sar and iostat manual pages updated.
+       * isag (Interactive System Activity Graph) command added.
+       * Makefile updated.
+
+2001/01/26: Version 3.3.4 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Disk I/O statistics for the last device were counted twice when
+         reading /proc/stat file with 2.4 kernels (sar -b). This is now
+         fixed.
+       * iostat command is no longer able to save its data to a file.
+         In fact, iostat has never been supposed to work that way, and I
+         have never really maintained this option.
+       * iostat now also works with 2.4 kernels. It can handle the format
+         of the /proc/stat file for both 2.2 and 2.4 kernels.
+       * sar now reports statistics on allocated disk quotas entries
+         instead of on used ones (sar -v).
+       * Manual pages updated for sar and iostat.
+
+2000/12/31: Version 3.3.3 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one! Delete existing data files
+         in /var/log/sa directory!
+       * Disk usage displayed by iostat on SMP machines was wrong. This
+         is now fixed.
+       * iostat command cleaned: All the statistics not implemented in
+         the standard Linux kernel have been removed (tty, iowait...).
+       * sar can now handle I/O and transfer rate statistics with both
+         2.2.x and 2.4.x Linux kernels (-b option).
+       * Removed %inode-sz that was displayed by sar -v, since the file
+         inode-max in /proc/sys/fs no longer exists in Linux 2.4.
+         The new 2.4.x kernels now seem to be able to allocate inode
+         structures dynamically, and to free them when necessary (see
+         linux/fs/inode.c).
+       * Removed statistics on highest in-used sockets. Relevant
+         counters have disappeared from sockstat file in /proc/net
+         for 2.4 kernels (sar -n SOCK).
+       * Added statistics on IP datagram fragments (sar -n SOCK).
+         Only available for 2.4 kernels.
+
+2000/11/19: Version 3.3.2 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * sar now saves timestamps in its daily data files both in UST
+         and in the user's timezone formats.
+         WARNING: Daily data files format has changed, and is *not*
+         compatible with the previous one!
+       * sar now displays timestamps in locale time when reading data
+         from its daily data files. -t option has been added to sar,
+         to enable it to display timestamps in the original locale
+         time of the data file creator.
+       * Size of various buffers made larger.
+       * Number of interrupts per second for 'all' CPU displayed by the
+         mpstat command was wrong. This is now fixed.
+       * Makefile updated.
+       * Usage message updated.
+
+2000/09/17: Version 3.3.1 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * mpstat command added.
+       * Manual page added for mpstat.
+       * Option -h added, enabling sar to display data from a daily data
+         file in a format that can easily be handled with pattern
+         processing commands like awk.
+       * Manual page updated for sar.
+       * iostat now writes KB (for kilobytes) instead of Kb, which could
+         have been interpreted as kilobits...
+       * Disk accounting patch for iostat removed.
+       * NLS updated.
+
+2000/08/06: Version 3.2.4 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Fixed a bug that prevented sar from reading its daily data files
+         when they had been created using -I option.
+       * Network statistics averages were sometimes wrong when reading
+         data from a file. This is now fixed.
+       * README-patch file updated.
+       * Configuration script updated to deal with Debian directories.
+
+2000/06/25: Version 3.2.3 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Configuration scripts updated. Can now print a help message.
+       * Workaround for SMP race in Linux serial driver added.
+         This workaround is enabled by default in RPM binary packages.
+       * sar manual page updated.
+       * Added iostat disk accounting patch against 2.2.16 linux kernel.
+       * Removed a few typos in the comments of the source code.
+
+2000/06/11: Version 3.2.2 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Now handle interrupts per processor better. Output improved.
+       * Makefile modified to comply with redhat good packaging.
+       * sysstat initialization script updated (don't su to root when
+         we are already root).
+       * sar now looks for sadc data collector in more places.
+       * NLS is now enabled by default.
+       * Silly bug in iostat disk accounting patch fixed.
+       * Added iostat disk accounting patch against 2.2.15 linux kernel.
+
+2000/04/02: Version 3.2 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * sadc no longer complains when daily data files have a null length.
+       * Configuration script added (make config).
+       * Statistics on sockets in use added.
+       * Got rid of various limits (maximum number of serial lines,
+         maximum number of network interfaces).
+       * Better management of dynamic files contents.
+       * Cosmetic change for timestamp display.
+       * Manual pages updated.
+       * Documentation added in ${PREFIX}/doc/sysstat-x.y.
+
+2000/02/20: Version 3.1 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Fixed a bug that made average numbers wrong for some statistics
+         when reading them from a system activity file.
+       * Fixed a bug that prevented the user from retrieving some
+         statistics when reading them from a system activity file.
+       * sadc no longer core-dumps on UP machines with SMP support enabled
+         in the kernel.
+       * System activity files are now readable by everybody.
+       * Average statistics since boot time are now printed when interval
+         parameter is set to 0. If interval and count parameters are not
+         set on the command line, sar selects requested activities from
+         the current system activity daily data file.
+       * sadc, sa1 and sa2 manual pages moved to chapter 8 instead of 1m.
+       * iostat disk accounting patch modified to work with md drivers.
+
+2000/01/30: Version 3.0 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * sadc - system activity data collector added.
+       * sa1, sa2 and sysstat.sh shell scripts added.
+       * Manual pages added for sadc, sa1, sa2.
+       * sar heavily modified to use stats sent by sadc.
+       * System activity data file now records system restarts.
+       * Every records in the iostat and system activity data files have
+         their own timestamp now.
+       * sar and iostat largely modified to use structures when reading or
+         writing data files.
+       * Per-process statistics added.
+       * System minor and major fault statistics added.
+       * TTY device statistics added.
+       * Memory and swap space utilization statistics added.
+       * Per-processor interrupt statistics added.
+       * Statistics for kernel parameters (dcache, inodes, superblocks, etc.) 
+         added.
+       * Network device statistics added.
+       * S_TIME_FORMAT environment variable added.
+       * Meaning of -i option has changed for sar.
+       * -d option removed for sar since it is no longer needed (we have
+         sadc now).
+       * sar now uses keywords such as ALL, SUM, etc. instead of numerical
+         parameters.
+       * iostat disk accounting patch improved.
+       * 'page' field in /proc/stat is no longer used by iostat (was
+         unreliable).
+       * Workaround for buggy RTC (or kernels?) added. Used when the number
+         of jiffies spent by the system in the idle task is decreasing in
+         /proc/stat.
+       * Manual pages updated.
+       * NLS updated: Portuguese translation added.
+       * Makefile updated.
+
+1999/11/28: Version 2.2 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Option -d added to sar to enable it to be started as a daemon.
+       * sar initialization script updated to use -d option.
+       * Option -V added to sar and iostat (print version number and usage).
+       * Fixed a bug that made CPU utilization displayed by iostat wrong on
+         SMP machines.
+       * Manual pages updated and moved to chapter 1 instead of 8.
+       * sar '-m' option renamed to '-r'.
+       * Display improved for iostat.
+       * NLS updated: Spanish translation added.
+       * Patch against kernel 2.2.13 added for iostat.
+
+1999/10/24: Version 2.1 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * The sar and iostat commands can now work on non SMP-machines even
+         if the kernel is compiled with SMP support enabled.
+       * Fixed a bug that made the time displayed by iostat wrong when
+         reading stats back from a file.
+       * Added memory statistics: free/shared/buffer/cached pages (sar -m).
+       * Option -h added to sar to print its header periodically.
+       * Set unavailable fields to zero when writing iostat file.
+       * sar now displays 'proc/s' instead of 'fork/s' since exec'ed
+         processes are also taken into account.
+       * Manual pages updated.
+       * sysstat is now available in RPM format.
+       * Code cleaned up and made safer.
+
+1999/09/19: Version 2.0 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * iostat now displays logical block I/O stats for each IDE device, or
+         global Kb/s rate for all the block devices. Stats in Kb/s for each
+         block device are not available for standard kernels due to Linux
+         poor disk accounting... Anyway a patch is provided in this version
+         of 'sysstat' in the 'patch' directory to fix that.
+       * System uptime is no longer read in /proc/uptime but computed from
+         the cpu line in /proc/stat.
+       * When stats are read from a file (option -f of iostat and sar),
+         values are now computed in accordance with the interval given by
+         the user on the command line.
+       * Old '-o' option for iostat removed. Now iostat can save data
+         into a file in a binary format and re-read them later (options
+         '-o' and '-f') in the same way sar does.
+       * Number of available processors now taken into account when
+         retrieving CPU usage from /proc/stat.
+       * Removed a bug that prevented 'sar -U' to work on SMP machines.
+       * Fixed a bug that made per-CPU average usage wrong on SMP machines.
+       * Use of option -U is now possible for sar when reading from a file
+         even if the machine is not an SMP one.
+       * Fixed a bug that prevented sar from re-reading stats saved in a file
+         when -I or -U option had been used.
+       * iostat modified to work on SMP machines.
+       * Changed the formula used to display stats in order not to get
+         numbers greater than UINT_MAX.
+       * System name, release number and hostname are now saved in 
+         system activity files.
+       * iostat now displays system name, release number and hostname
+         when invoked.
+       * Daily system activity file rotation added for sar.
+       * Improved 64-bit system support.
+       * CREDITS file added.
+       * NLS updated: German translation added.
+       * Manual pages updated.
+       * Makefile updated: Do not call msgfmt if NLS is not enabled.
+
+1999/06/25: Version 1.2 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * Better NLS support (date, time and numerical values, NLS enabled
+         for sar, etc.).
+       * System activity daily file structure changed: Is now independent of
+         the locale and is more compact.
+       * sar updated to support SMP machines (per CPU accounting).
+       * Code cleaned, man pages updated...
+
+1999/05/28: Version 1.1 - Sebastien Godard <sebastien.godard@wanadoo.fr>
+       * NLS support added. French translation started but needs to be
+         completed.
+       * sar updated to support more than 16 interrupts (potential APIC
+         interrupt sources).
+       * A few typos removed (man pages, etc.).
+       * Author email address updated :-)
+       * Tested on kernel 2.2.5.
+
+1999/03/06: Version 1.0 - Sebastien Godard <sebastien.godard@gazdefrance.com>
+       * Initial Revision. Tested on kernel 2.0.36.
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..a43ea21
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+       Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    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 of the License, 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.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/CREDITS b/CREDITS
new file mode 100644 (file)
index 0000000..37a20d0
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,217 @@
+The following people have contributed to 'sysstat' in one way or another:
+
+       First I would like to thank Michael <michael [at] roka.net>: He is the
+       very first person to have given me feedback about sysstat, and to
+       point out to me that certain fields in /proc/stat didn't have the
+       meaning I thought they had. This was in 1999!
+
+       Many thanks to the translators involved in sysstat:
+
+         * Birko Bergt <birko.bergt [at] gmx.de> for his translation into
+           German,
+         * Fernando Félix Redondo <fernando.felix [at] rediris.es> for his
+           translation into Spanish (now maintained by Muralito
+           <muralito [at] montevideo.com.uy>),
+         * Frederic L. W. Meunier <0 [at] pervalidus.net> for the
+           Portuguese translation.
+         * Gert Brits <gbrits [at] techconcepts.co.za> for the translation
+           into Afrikaans.
+         * Roy Sigurd Karlsbakk <roy [at] karlsbakk.net> for the Norwegian
+           translation.
+         * Stefano Barni <barninga [at] interfree.it> for the translation
+           into Italian.
+         * Dennis Selsky <selsky [at] siberia.net> for the Russian translation.
+         * Eugen Hoanca <eugenh [at] urban-grafx.ro> for the Romanian
+           translation.
+         * Robert Luberda <robert [at] debian.org> for the translation into
+           Polish.
+         * Miroslav David <md20128 [at] decef.elf.stuba.sk> for the Slovak
+           translation.
+         * Hideki Yamane <henrich [at] samba.gr.jp> for the translation into
+           Japanese.
+         * Daniel Nylander <po [at] danielnylander.se> for the Swedish
+           translation.
+         * John Damm Sørensen <john [at] hovedpuden.dk> for the Danish
+           translation.
+         * Bram Schoenmakers <bramschoenmakers [at] kde.nl> for the Dutch
+           translation.
+
+       Carl-Christian Weber <ccweber [at] itz-koeln.de> helped me to make sar
+       work on SMP machines.
+
+       Stefan Majer <smajer [at] advance-bank.de> provided me with a patch to
+       rotate daily system activity files.
+
+       Klaus Franken <klaus.franken [at] fth2.siemens.de> created the RPM
+       packages. He also included a short initialization script for sar
+       to start it as a daemon on boot.
+
+       Jason (Jay) R. Fink <jay_rf [at] exis.net> set up and maintained the
+       first web site for sysstat.
+
+       Preston Brown <pbrown [at] redhat.com> sent me the RedHat patch to
+       enable good packaging.
+
+       David Doubrava <linux_monitor [at] volny.cz> created the isag
+       command (Interactive System Activity Graph).
+
+       Rik van Riel <riel [at] conectiva.com.br> explained me the meaning
+       of several fields that were added in Linux kernel 2.4
+       /proc/meminfo file.
+
+       Hubert Nueckel <hubert.nueckel [at] oracle.com> sent me a patch to
+       fix CPU utilization displayed by sar, iostat and mpstat commands
+       on IA64 machines.
+
+       Victor Hazlewood <victor [at] sdsc.edu> sent me a patch to implement
+       a database friendly option for sar (option -H).
+
+       Christopher Blizzard <blizzard [at] redhat.com> added the ability to
+       display kB/s transfers to devices in iostat reporting when
+       option -x is used.
+
+       John Caruso <caruso [at] paradiso.umuc.edu> wrote the sargon script
+       shell as a replacement for sa1/sa2 files.
+
+       Wilhelm Nuesser <wilhelm.nuesser [at] sap.com> sent me a patch to
+       fix average wait times and service times displayed by iostat -x.
+
+       Rick Lindsley <ricklind [at] us.ibm.com> has played a great part in
+       making sysstat work on kernels 2.5 and above.
+
+       John Salmon <John.Salmon [at] cw.com> wrote a patch to enable file
+       locking for sadc (option -L).
+
+       Jim W. Jaszewski <grok [at] sprint.ca> fixed several typos in
+       sysstat FAQ!
+
+       Charlie Bennett <ccb [at] redhat.com> sent me several patches to
+       fix known problems with sysstat. He also added the sysstat.ioconf
+       file support, and the -p option to sar.
+
+       Thomas Polliard <thomas [at] polliard.com> helped me define the XML
+       output format for sadf. He also wrote the corresponding DTD.
+
+       Dwight Tovey <dtovey [at] emergecore.com> updated sysstat so that
+       it may be installed on Slackware.
+
+       Bryce Harrington <bryce [at] osdl.org> helped me to add support for
+       hotplug CPU to sysstat.
+
+       Ivana Varekova <varekova [at] redhat.com> added support for iostat
+       NFS statistics. Ivana also added support for autoconf, and created
+       cifsiostat command.
+
+       Nils Philippsen <nphilipp [at] redhat.com> made history configurable.
+
+       Robert Luberda <robert [at] debian.org> brought a few improvements
+       to sysstat's code, and also reported several bugs.
+
+       Jeroen Roovers <jer [at] gentoo.org> sent me a patch to fix a rare
+       parallel make issue creating archive libsyscom.a.
+
+       Livio Soares <livio [at] eecg.toronto.edu> sent me a patch to fix
+       a bug where mpstat didn't parse /proc/interrupts correctly when
+       some CPUs had been set offline.
+
+       Emil Glatz <Emil.Glatz [at] wescoglobal.com> wrote the XML Schema
+       to be used with sadf option -x.
+
+       Eduardo Ferro Aldama <eduardo.ferro.aldama [at] gmail.com> added
+       option -l to pidstat to display the process command name and
+       arguments.
+
+       Mario Konrad <Mario.Konrad [at] gmx.net> added regular expressions
+       support to pidstat'x option -C. He also added option -s to pidstat
+       to display task stack statistics.
+
+       Jan Kaluza <jkaluza [at] redhat.com> contributed several patches
+       to sysstat. Among them, he added some more power management
+       statistics to sar.
+
+I would also thank the following people for their hints or bug reports
+(in alphabetical order):
+
+       Des Atkinson <Des.Atkinson@met[...].uk>
+       Sravan Bhamidipati <bsravanin@gma[...].com>
+       Chuck Blake <cb@mit[...].edu>
+       Michael Blakeley <mike@bla[...].com>
+       Pascal Bleser <pbleser@ato[...].com>
+       Jesse Brandeburg <jesse.brandeburg@int[...].com>
+       Xavier Bru <xavier.bru@bul[...].net>
+       Jason Burnett <jason@jnj[...].org>
+       Mark J. Cox <mjc@red[...].com>
+       Jean Dagenais <jean.dagenais@int[...].com>
+       Nicolas Denis <denisn@wan[...].fr>
+       Andrew Donkin <ard@wai[...].nz>
+       Greg Edwards <edwardsg@sgi[...].com>
+       Tony Ernst <tee@sgi[...].com>
+       Chris Evans <chris@sca[...].org>
+       Damien Faure <damien-jn.faure@bul[...].net>
+       Dr. David Alan Gilbert <dave@tre[...].org>
+       David Gesswein <djg@drs[...].com>
+       Ladislav Hagara <ladislav.hagara@uno[...].cz>
+       Don Harrop <don@swb[...].com>
+       Tatsuo Ito <tito@mir[...].com>
+       David S. Jackson <dsj@syl[...].net>
+       Erik Jacobson <erikj@sub[...].com>      
+       Jordan <ledzep37@hom[...].com>  
+       Jurriaan <thunder7@xs4[...].nl>
+       Jonathan Kamens <jik@kam[...].us>
+       Ilya Katsnelson <ilya.katsnelson@mot[...].com>
+       Mike Kobler <mkobler@gma[...].com>
+       Byeong-taek Lee <btlee@psy[...].kr>
+       Ivo Letzas <letzas@for[...].nu> 
+       Neculai Macarie <macarie.neculai@nex[...].com>
+       Robert Macaulay <Robert_Macaulay@Del[...].com>
+       Pierre Machard <pmachard@deb[...].org>
+       Jérôme Marchand <jmarchan@red[...].com>
+       Alan Matsuoka <alanm@red[...].com>
+       Rodney J. Mertz <rjm@elv[...].com>
+       Roy Millar <100044.14@com[...].com>
+       Chris Minshull <CMinshull@nyx[...].com>
+       Pascal Monschein <ext.astek.monschein@snc[...].fr>
+       Chris Morrow <cmorrow@ver[...].com>
+       David J. Morse <David_J_Morse@Del[...].com>
+       Hariprasad Nellitheertha <hari@in.[...].com>
+       Giulio Orsero <giulioo@pob[...].com>
+       Edouard G. Parmelan <edouard.parmelan@qua[...].fr>
+       Oliver Paukstadt <oliver.paukstadt@mil[...].com>        
+       Plattner(?) <Plattner.external@inf[...].com>
+       Gerardo Exequiel Pozzi <vmlinuz386@yah[...].ar>
+       ReDragon <redragon@vns[...].net>
+       Amir Rapson <amir.rapson@gma[...].com>
+       Paul Rivoli <paul@kbs[...].au>
+       Scott Rochford <Scott_Rochford@DEL[...].com>
+       Rolphin <rolphin@fre[...].fr>
+       Pavol Rusnak <prusnak@sus[...].cz>
+       Joseph E. Sacco <jsacco@ear[...].net>
+       Sachin Sant <sachinp@in.[...].com>
+       Eivind Sarto <ivan@kas[...].com>
+       Danilo Sartori <d.sartori@res[...].it>
+       Tan Shao Yi <tansy@tan[...].org>
+       Yibin Shen <zituan@taobao.com>
+       Lee Schermerhorn <lee.schermerhorn@hp.[...].com>
+       Benno Schulenberg <bensberg@jus[...].net>
+       Michel Simoni <m_simoni@clu[...].fr>
+       Gabrielle Singleton <gelle@umi[...].edu>
+       Rod Skinner <rod.skinner@int[...].com>  
+       Kevin C. Smallwood <kcs@lin[...].com>
+       Dick Snippe <Dick.Snippe@tec[...].nl>
+       Graham Swallow <gps@tri[...].uk>
+       Mike Sweger <mikesw@whi[...].net>
+       Don Totten <dontotten@ibm[...].net>
+       Stephen Tweedie <sct@red[...].com>
+       Thomas Weber <TWEBER@de.[...].com>
+       Yongjun Wei <yjwei@nan[...].com>
+       Stefan Wild <SWILD@de.[...].com>
+       Thomas Winn <tcwinn@gma[...].com>
+       Holger Wolf <Holger.Wolf@de.[...].com>
+       Urban Widmark <urban@sve[...].se>
+       Yu Yongcong <yuyc@cn.[...].com>
+       Peter Zaitsev <pz@spy[...].ru>
+
+--     
+Sebastien Godard (sysstat <at> orange.fr) is the author and the current
+maintainer of this package.
+
diff --git a/FAQ b/FAQ
new file mode 100644 (file)
index 0000000..197f6bf
--- /dev/null
+++ b/FAQ
@@ -0,0 +1,663 @@
+This is sysstat's Frequently Asked Questions!
+Be sure to read this carefully before asking for help...
+If you don't find the solution to your problem here then send me an email
+(please remember to include sysstat's version number, a sample output
+showing the bug, and the contents of the /proc/stat file for your system.
+Also tell me what version your kernel is).
+
+
+1. GENERAL QUESTIONS
+
+1.1. When I compile sysstat, it fails with the following message:
+     "make: msgfmt: Command not found".
+1.2. When I try to compile sysstat, it fails and says it cannot find some
+     include files.
+1.3. I don't understand why sysstat displays the time sometimes as HH:MM:SS
+     and sometimes as HH:MM:SS AM/PM...
+     
+2. QUESTIONS RELATING TO SAR/SADC/SADF
+
+2.1. The sar command complains with the following message:
+     "Invalid system activity file: ...".
+2.2. The sar command complains with the following message:
+     "Cannot append data to that file (...)".
+2.3. The sar command complains with the following message:
+     "Invalid data format".
+2.4. I get the following error message when I try to run sar:
+     "Cannot open /var/log/sa/sa30: No such file or directory".
+2.5. Are sar daily data files fully compatible with Sun Solaris format
+     sar files?
+2.6. I have some trouble running sar on my SMP box. My server crashes
+     with a kernel oops.
+2.7. The "Average:" results from the sar command are just rubbish...
+2.8. My database (e.g. MySQL) doesn't appear to understand the time zone
+     displayed by 'sadf -d'...
+2.9. I tried to use the -p option of the sadf command, together with the
+     options -s and -e. Unfortunately, I have nothing displayed at all.
+2.10. I cannot see all my disks when I use the sar -d command...
+2.11. Do you know a tool which can graphically plot the data collected by sar?
+2.12. When I launch sadc, I get the error message:
+      "flock: Resource temporarily unavailable".
+2.13. How should I run sysstat / sar so that I get a reading for 00:00:00?
+2.14. The sar command complains with the following message:
+      "Requested activities not available in file ...".
+2.15. Does sar need a lot of resources to run?
+2.16. Are the measurements gathered by sadc cumulative or instantaneous?
+2.17. Some fields are always displayed as 0.00 when I use the sar -d
+      command.
+2.18. The sar command complains with the following message:
+      "Requested activities not available".
+2.19. How can I keep sar data for more than one month?
+2.20. How can I load sar data into an Oracle database for performance
+      analysis and capacity planning?
+2.21. The sar command displays some weird output values...
+2.22. What happened to sar's options -h, -H, -x and -X?
+2.23. What is the exact meaning of the <count> parameter for sar and sadc?
+
+3. QUESTIONS RELATING TO IOSTAT
+
+3.1. I can't see all my disks when I use the iostat command...
+3.2. iostat -x doesn't report disk I/O statistics...
+3.3. Why can't iostat display extended statistics for partitions with
+     2.6.x kernels?
+3.4. I don't understand the output of iostat. It doesn't match what I expect
+     it to be...
+3.5. Why values displayed by iostat are so different in the first report
+     from those displayed in subsequent ones?
+3.6. iostat -x displays huge numbers for some fields...
+
+4. QUESTIONS RELATING TO PIDSTAT
+
+4.1. pidstat -d doesn't report task I/O statistics...
+4.2. The pidstat command complains with the following message:
+      "Requested activities not available".
+4.3. pidstat doesn't display statistics for process (task) xyz...
+
+
+1. GENERAL QUESTIONS
+####################
+
+1.1. When I compile sysstat, it fails with the following message:
+make: msgfmt: Command not found
+make: ***[locales] Error 127
+
+The msgfmt command belongs to the GNU gettext package.
+If you don't have it on your system, just configure sysstat with
+NLS disabled like this:
+
+$ ./configure --disable-nls
+
+or answer 'y' (for "yes") to the question
+"Disable National Language Support (NLS)? (y/n) [--disable-nls]"
+if you use the Interactive Configuration script (iconfig),
+then compile sysstat as usual (make ; make install).
+Please read the README-nls file included in sysstat source package to learn
+some more about National Language Support.
+
+~~~
+
+1.2. When I try to compile sysstat, it fails and says it cannot find some
+include files:
+In file included from /usr/include/bits/errno.h:25,
+                 from /usr/include/errno.h:36,
+                 from common.c:26:
+/usr/include/linux/errno.h:4: asm/errno.h: No such file or directory
+<SNIP>
+common.c: In function `get_kb_shift':
+common.c:180: `PAGE_SIZE' undeclared (first use in this function)
+common.c:178: warning: `size' might be used uninitialized in this function
+make: *** [common.o] Error 1
+
+Make sure that you have the Linux kernel sources installed in
+/usr/src/linux. Also make sure that the symbolic link exists in the
+/usr/src/linux/include directory and points to the right architecture, e.g.:
+
+# ll /usr/src/linux/include/asm
+lrwxrwxrwx   1 root     root            8 May  5 18:31 /usr/src/linux/include/asm -> asm-i386
+
+In fact, only the Linux kernel headers should be necessary to be able
+to compile sysstat.
+
+~~~
+
+1.3. I don't understand why sysstat displays the time sometimes as HH:MM:SS
+and sometimes as HH:MM:SS AM/PM...
+
+The time format used by sysstat tools depends on the locale of your system.
+The locale is defined by several environment variables, among which the LANG
+variable is perhaps the most widely used. See the following example:
+
+$ export LANG=en_US
+$ sar
+Linux 2.4.9 (brooks.seringas.fr)        07/20/04
+
+04:32:11 PM       LINUX RESTART
+
+05:00:00 PM       CPU     %user     %nice   %system   %iowait     %idle
+05:10:00 PM       all      0.24      0.00     89.64      0.00     10.12
+Average:          all      0.24      0.00     89.64      0.00     10.12
+
+$ export LANG=fr_FR
+$ sar
+Linux 2.4.9 (brooks.seringas.fr)        20.07.2004
+
+16:32:11          LINUX RESTART
+
+17:00:00          CPU     %user     %nice   %system   %iowait     %idle
+17:10:00          all      0,24      0,00     89,64      0,00     10,12
+Moyenne:          all      0,24      0,00     89,64      0,00     10,12
+
+As you can notice, the time format but also the date, the decimal point, and
+even some words (like "Average") have changed according to the specified
+locale.
+
+
+2. QUESTIONS RELATING TO SAR/SADC/SADF
+######################################
+
+2.1. The sar command complains with the following message:
+Invalid system activity file: ...
+
+You are trying to use a file which is not a system activity file, or
+whose format is no longer compatible with that of files created by
+current version of sar.
+If you were trying to use the standard system activity files located in the
+/var/log/sa directory then the solution is easy: just log in as root and
+remove by hand all the files located in the /var/log/sa directory:
+
+# rm /var/log/sa/sa??
+
+With recent versions of sysstat (8.1.1 and later), it is now possible to
+know which version of sar or sadc has been used to create a data file.
+Just enter the following command:
+
+$ sadf -H /your/datafile | grep sysstat
+File created using sar/sadc from sysstat version 8.1.7
+
+~~~
+
+2.2. The sar command complains with the following message:
+Cannot append data to that file (...)
+
+The internal structure of the data file does not allow sar to append
+data to it. The data file may come from another machine, or the components
+of the current box, such as the number of processors, may have changed.
+Use another data file, or delete the current daily data file, and try again.
+
+~~~
+
+2.3. The sar command complains with the following message:
+Invalid data format
+
+This error message means that sadc (the system activity data collector that
+sar is using) is not consistent with the sar command. In most cases this is
+because the sar and sadc commands do not belong to the same release of the
+sysstat package. Remember that sar may search for sadc in predefined
+directories (/usr/local/lib/sa, /usr/lib/sa, ...) before looking in the
+current directory!
+
+~~~
+
+2.4. I get the following error message when I try to run sar:
+Cannot open /var/log/sa/sa30: No such file or directory
+
+Please read the sar(1) manual page! Daily data files are created in the
+/var/log/sa directory using the data collector (sadc) or using option
+-o with sar. Once they are created, sar can display statistics saved
+in those files.
+But sar can also display statistics collected "on the fly": just enter
+the proper option on the command line to indicate which statistics are
+to be displayed, and also specify an <interval> and <count> number.
+E.g.:
+
+# sar 2 5  --> will report CPU utilization every two seconds, five times.
+# sar -n DEV 3 0  --> will report network device utilization every
+3 seconds, in an infinite loop.
+
+~~~
+
+2.5. Are sar daily data files fully compatible with Sun Solaris format
+sar files?
+
+No, the format of the binary data files created by sysstat's sar command
+is not compatible with formats from other Unixes, because it contains
+data which are closely linked to Linux.
+For the same reason, sysstat cannot work on platforms other than Linux...
+
+~~~
+
+2.6. I have some trouble running sar on my SMP box. My server crashes
+with a kernel oops:
+Feb 17 04:05:00 bolums1 kernel: Unable to handle kernel paging request
+at virtual address fffffc1c
+Feb 17 04:05:00 bolums1 kernel: current->tss.cr3 = 19293000, %cr3 = 19293000
+Feb 17 04:05:00 bolums1 kernel: *pde = 0026b067
+Feb 17 04:05:00 bolums1 kernel: *pte = 00000000
+Feb 17 04:05:00 bolums1 kernel: Oops: 0000
+Feb 17 04:05:00 bolums1 kernel: CPU:    0
+Feb 17 04:05:00 bolums1 kernel: EIP:
+<...>
+
+The trouble you have is triggered by a *Linux* kernel bug, not a sysstat
+one... The best solution is to upgrade your kernel to the latest stable
+release.
+Also, if you cannot upgrade your box, try to configure sysstat with the
+SMP race workaround:
+
+$ ./configure --enable-smp-race
+
+or answer 'y' to the question:
+"Linux SMP race in serial driver workaround? (y/n) [--enable-smp-race]"
+if you use the Interactive Configuration script (iconfig).
+Indeed, we found that 2.2.x kernels (with x <= 15) have an SMP race
+condition, which the sar command may trigger when it reads the
+/proc/tty/driver/serial file.
+
+~~~
+
+2.7. The "Average:" results from the sar command are just rubbish...
+E.g.:
+ 11:00:00 AM       CPU     %user     %nice   %system     %idle
+ 11:10:00 AM       all      0.54      0.00      0.89     98.57
+ 11:20:01 AM       all      3.02      8.05     22.85     66.08
+ 11:30:01 AM       all      8.15      0.00      2.31     89.54
+ 11:40:01 AM       all      8.03      0.00      2.42     89.55
+ 11:50:01 AM       all     16.04      0.00      2.81     81.16
+ 12:00:00 PM       all     21.11      0.00      3.23     75.66
+ 03:40:01 PM       all    100.01    100.01    100.01      0.00
+ 04:40:00 PM       all    100.00      0.00    100.00      0.00
+ 04:50:00 PM       all      5.87      0.00      1.26     92.87
+ 05:00:00 PM       all      4.70      0.00      1.48     93.82
+ 05:10:00 PM       all      4.93      0.00      1.29     93.78
+ Average:          all    100.22    100.20    100.13      0.00
+
+Your sar command was not installed properly. Whenever your computer
+is restarted (as it is the case here between 12:00:00 PM and 03:40:01 PM),
+the 'sysstat' shell script must be called by the system, so that the
+LINUX RESTART message can be inserted into the daily data file, indicating
+that the relevant kernel counters have been reinitialized...
+You can install the 'sysstat' script by hand in the relevant startup
+directory, or you can ask sysstat to do it for you during configuration
+stage by entering:
+
+$ ./configure --enable-install-cron
+
+Or you can answer 'y' to the question:
+"Set crontab to start sar automatically? (y/n) [--enable-install-cron]"
+if you use the Interactive Configuration script (iconfig).
+Then compile sysstat as usual and run 'make install' as the last stage.
+
+~~~
+
+2.8. My database (e.g. MySQL) doesn't appear to understand the time zone
+displayed by 'sadf -d'...
+
+The format includes the timezone detail in the output. This is to make
+sure it is communicated clearly that UTC is how the data is always
+converted and printed. Moreover we don't depend on the TZ environment
+variable and we don't have some data converted to a different timezone
+for any reason, known or unknown.
+When you deal with raw accounting data you always want it in UTC.
+Of course, you want it to all be the same when loading into a database.
+If your database can't deal with timezones, you should write a short script
+to strip the "UTC" characters from the data being loaded into the database.
+
+~~~
+
+2.9. I tried to use the -p option of the sadf command, together with the
+options -s and -e. Unfortunately, I have nothing displayed at all.
+
+This is because no data belong to the specified time interval!
+With versions older than 7.0.1, the time specified by options -s or -e
+may be considered as given in UTC (Coordinated Universal Time) or local
+time depending on whether sadf displays its output in UTC or local time.
+Option -p makes sadf display its timestamp in UTC, as indicated in the
+manual page. The UTC value may be different from the value that sar
+(or sadf without option -p) displays. The same remark applies to the
+use of -d option.
+
+~~~
+
+2.10. I cannot see all my disks when I use the sar -d command...
+
+See question 3.1 below.
+
+~~~
+
+2.11. Do you know a tool which can graphically plot the data collected by sar?
+
+Several such tools are lying around on the internet. I haven't tested all of
+them and there must still be some way for improvement...
+First, some tools are included in the sysstat package: isag (a Perl script)
+or sargraph (a shell script).
+You can also find: kSar, sarvant, sar2gp, loadgraph, SysStat Charts, sarplot...
+rrd.cgi (http://haroon.sis.utoronto.ca/rrd/scripts/) is a perl front-end for
+rrdtool and can be used to make some graphs (see a demo at
+http://haroon.sis.utoronto.ca/perl/rrd.cgi/sar_stats/).
+I've also heard of commercial tools which use sysstat: PerfMan comes to mind,
+among others.
+If you find others which you think are of real interest, please let me know
+so that I can update this list.
+
+~~~
+
+2.12. When I launch sadc, I get the error message:
+flock: Resource temporarily unavailable
+
+You are launching sadc using -L option. With this option, sadc tries to
+get an exclusive lock on the output file. The above error message indicates
+that another sadc process was running and had already locked the same output
+file. Stop all sadc instances and try again.
+
+~~~
+
+2.13. I have sysstat setup to run via cron:
+0 * * * * /usr/local/lib/sa/sa1 600 6 &
+so that I get an activity report every 10 minutes.
+When I use sar to get my output, there is no reading for 00:00:00. This
+means that at midnight every night there is a spike, or dip, in the graphs.
+How should I run sysstat / sar so that I get a reading for 00:00:00?
+
+Sysstat does get its data at midnight, but two data samples are needed to
+display the values.
+When there is a "file rotation" (beginning of a new day), sadc writes its data
+at the end of the previous daily data file (/var/log/sa/sa<DD>) *and* at the
+beginning of the new one (/var/log/sa/sa<DD+1>). Please note that '-' must be
+used to specify the output file for sadc to be able to detect such a file
+rotation. So a crontab like the following one should enable you to get the
+data for midnight at the end of each daily data file:
+
+# Activity reports every 10 minutes from 01:00:00 to 22:50:00
+0 1-22 * * * /usr/local/lib/sa/sa1 600 6 &
+# Activity reports every 10 minutes from 23:00:00 to 00:00:00
+# Reporting until 00:00:00 ensures that a file rotation will be detected
+# by sadc
+0 23 * * * /usr/local/lib/sa/sa1 600 7 &
+# Activity reports every 10 minutes from 00:10:00 to 00:50:00
+10 0 * * * /usr/local/lib/sa/sa1 600 5 &
+
+Another possible crontab would be:
+
+*/10 1-22 * * * /usr/lib/sa/sa1 -d 1 1
+0,10,20,30,40 23 * * * /usr/lib/sa/sa1 -d 1 1
+50 23 * * * /usr/lib/sa/sa1 -d 600 2
+10,20,30,40,50 0 * * * /usr/lib/sa/sa1 -d 1 1
+
+~~~
+
+2.14. The sar command complains with the following message:
+Requested activities not available in file ...
+
+This error message means that you are trying to extract non-existent activities
+from the data file. Usually sadc reads all the available activities from the
+system and stores them in the data file. However, to prevent data files from
+taking too much space on disk, some activities must be explicitly set on the
+command line to be read by sadc.
+To tell sadc that an optional activity should be collected, use switch -S
+followed by the keyword corresponding to that activity (see sadc(8) manual page).
+As of this writing, optional activities are: interrupts, disks, SNMP, IPv6 and
+power management statistics.
+IMPORTANT NOTE: The list of activities that are saved in a file can no longer
+be modified once the file has been created. So it is important to use the proper
+options the first time sadc is called (whether via a crontab, a script like
+sa1 or even the script used to insert a RESTART message when the machine is
+rebooted).
+NB: If the sar command complains with the error message:
+"Requested activities not available" (without mentioning "in file"),
+then see question 2.18 below.
+
+~~~
+
+2.15. Does sar need a lot of resources to run?
+
+No, sar doesn't need a lot of CPU to run, nor does it make your system slow,
+contrary to what some people think. In the first place, it only runs every ten
+minutes by default. Secondly, when it does run, it is over and done very
+quickly. Try:
+
+$ time /usr/lib/sa/sa1
+
+to verify that for yourself.
+Nor do you have to be concerned about using up all your disk space.
+sar will use a few hundred kilobytes for a whole day's worth of data, and it
+normally only stores one week worth (this can be configured via the HISTORY
+variable in the /etc/sysconfig/sysstat file). It is entirely self limiting.
+Moreover, you can ask sar to compress its datafiles older than a certain
+number of days: see the COMPRESSAFTER parameter in the /etc/sysconfig/sysstat
+configuration file.
+
+~~~
+
+2.16. Are the measurements gathered by sadc cumulative or instantaneous values?
+
+Each counter maintained by the kernel is cumulative since system boot. As a
+consequence the measurements gathered by sadc are cumulative values.
+Moreover all per-second statistics displayed by sar are average values on the
+given time interval. So the value for counter foo at time T is calculated as:
+foo/s = [foo(T) - foo(T-dt)] / dt
+where dt is the interval given on the command line.
+
+~~~
+
+2.17. Some fields are always displayed as 0.00 when I use the sar -d
+command.
+
+See question 3.2 below.
+
+~~~
+
+2.18. The sar command complains with the following message:
+Requested activities not available
+
+This error message means that you are trying to display activities that the
+kernel itself is unable to provide.
+When this error message is displayed while trying to save the data into an
+existing file ("sar -o datafile ..."), this may also be because the target
+file cannot accept the requested activities. In this case, just try to use
+another file or create a new one. See also question 2.14 above.
+
+~~~
+
+2.19. How can I keep sar data for more than one month?
+
+By default sar saves its data in the standard system activity data file,
+the /var/log/sa/sa<DD> file, where <DD> is the current day in the month.
+To prevent sar from overwriting any existing files, just set the variable
+HISTORY in /etc/sysconfig/sysstat to the number of days during which data
+must be kept. When this variable has a value greater than 28, sa1 script
+uses a month-by-month directory structure; datafiles are named YYYYMM/saDD
+and the script maintains links to these datafiles to mimic the standard
+sar datafile structure.
+However please note that pre-existing datafiles will be deleted as links
+will be created and replace them.
+
+~~~
+
+2.20. How can I load sar data into an Oracle database for performance
+analysis and capacity planning?
+
+The simplest way for that is to use sadf (a command included in sysstat
+package) with its option -d. It displays sar data in a format that can
+easily be ingested by a relational database system (fields are separated
+by a semicolon). It should then be easy for a tool like SQL*Loader to
+load the data into the Oracle database.
+
+~~~
+
+2.21. The sar command displays some weird CPU values...
+E.g.:
+10:50:01 AM       CPU     %user     %nice   %system   %iowait     %idle
+11:00:01 AM       all     90.90      0.00      5.17      3.93      0.00
+11:00:01 AM         0     39.40      0.00      2.37      2.07     56.17
+11:00:01 AM         1     29.71      0.00      1.73      1.17     67.39
+11:00:01 AM         2     42.69      0.00      2.34      1.11     53.85
+11:00:01 AM         3     26.24      0.00      1.41      1.61     70.74
+...
+
+Sysstat may have met an overflow condition while reading CPU usage from
+your /proc/stat file. This condition is all the more likely to happen as
+your machine uptime is high and/or there are many processors.
+Sysstat up to version 5.0.6 uses 32-bit integer variables to store CPU usage.
+Then, beginning with version 5.1.1, sysstat has shifted to 64-bit variables,
+which has fixed the problem. So try to upgrade your version of sysstat to
+the latest stable release and check that the problem has gone.
+
+~~
+
+2.22. What happened to sar's options -h, -H, -x and -X?
+
+These old options have been removed from sar because new commands have been
+made available. You should now use the sadf command instead of sar -h or
+sar -H, and the pidstat command instead of sar -x or sar -X. Please read
+their manual page to learn some more about their respective options.
+
+~~
+
+2.23. What is the exact meaning of the <count> parameter for sar and sadc?
+
+For sadc, <count> is the number of data samples collected.
+For sar, <count> is the number of records to display (a record contains
+the average values for counters over the given time interval - See 2.16).
+
+Starting with an empty file <file>:
+
+sadc <file> 1 6        will write 6 data samples to file.
+sar -f <file> 1 6      6 is invalid because there are only 5 intervals.
+
+Based on the <count> value entered for sadc the "valid" <count> values for
+sar are 1 through 5. Any value greater than 5 for sar will give the
+same output as 5 in this example. So entering sar -f <file> 1 2000
+for a file populated with the output of sadc 1 6 <file> will give the
+same output as sar -f <file> 1 5. Note that it all depends on the number
+of data samples pre-existing in the data file. If the file is empty
+when first running sadc then the above is true.
+
+3. QUESTIONS RELATING TO IOSTAT
+###############################
+
+3.1. I can't see all my disks when I use the iostat command...
+
+Yes. This is a kernel limit. Old kernels (2.2.x for instance) used to
+maintain stats for the first four devices.
+The accounting code has changed in 2.4 kernels, and the result may (or
+may not) be better for your system. Indeed, Linux 2.4 maintains the stats
+in a two dimensional array, with a maximum of 16 devices (DK_MAX_DISK
+in the kernel sources). Moreover, if the device major number exceeds
+DK_MAX_MAJOR (whose value also defaults to 16 in the kernel sources),
+then stats for this device will not be collected.
+So, a solution may be simply to change the values of these limits in 
+linux/include/linux/kernel_stat.h and recompile your kernel.
+You should no longer have any problem with post 2.5 kernels, since
+statistics are maintained by the kernel for all the devices.
+In the particular case of iostat, also be sure to use the ALL keyword
+on the command line to display statistical information relating to
+every device, including those that are defined but have never been used
+by the system.
+
+~~~
+
+3.2. iostat -x doesn't report disk I/O statistics...
+
+For 'iostat -x' to be able to report extended disk I/O statistics,
+it is better to use a recent version of the Linux kernel (2.6.x).
+Indeed, iostat tries to read data from the /proc/diskstats file or
+from the sysfs filesystem for that.
+But iostat may also be able to display extended statistics with
+older kernels (e.g. 2.4.x) providing that all the necessary
+statistical information is available in the /proc/partitions file,
+which requires that a patch be applied to the kernel (this is
+often done on kernels included in various distros). In recent 2.4.x
+kernels, the /proc/partitions file has all the necessary data
+providing that the kernel has been compiled with CONFIG_BLK_STATS=y.
+
+~~~
+
+3.3. Why can't iostat display extended statistics for partitions with
+     some 2.6.x kernels?
+
+Because the kernel maintains these stats only for devices, and not for
+partitions! Here is an excerpt from the document iostats.txt written by
+Rick Lindsley (ricklind@us.ibm.com) and included in the kernel source
+documentation:
+"There were significant changes between 2.4 and 2.6 in the I/O subsystem.
+As a result, some statistic information disappeared. The translation from
+a disk address relative to a partition to the disk address relative to
+the host disk happens much earlier.  All merges and timings now happen
+at the disk level rather than at both the disk and partition level as
+in 2.4.  Consequently, you'll see a different statistics output on 2.6 for
+partitions from that for disks."
+Extended I/O statistics for partitions are available again with kernels
+2.6.25 and later.
+
+~~~
+
+3.4. I don't understand the output of iostat. It doesn't match what I expect it
+to be...
+
+By default iostat displays I/O activity in blocks per second. With old
+kernels (i.e. older than 2.4.x) a block is of indeterminate size and therefore
+the displayed values are not useful.
+With recent kernels (kernels 2.4 and later), iostat is now able to get disk
+activities from the kernel expressed in a number of sectors. If you take a
+look at the kernel code, the sector size is actually allowed to vary although
+I have never seen anything other than 512 bytes.
+
+~~~
+
+3.5. Why values displayed by iostat are so different in the first report
+     from those displayed in subsequent ones?
+
+Probably because, as written in the manual page, the first report generated
+by iostat concerns the time since system startup, whereas subsequent ones
+cover only the time since the previous report (that is to say, the interval
+of time entered on the command line).
+
+~~~
+
+3.6. iostat -x displays huge numbers for some fields...
+
+Because of a Linux kernel bug, iostat -x may display huge I/O response times 
+(svctm) and a bandwidth utilization (%util) of 100% for some devices. Indeed
+these devices have a value for the field #9 (beginning after the device name)
+in /proc/{partitions,diskstats} which is always different from 0, and even
+negative sometimes. Yet this field should go to zero, since it gives the
+number of I/Os currently in progress (it is incremented as requests are
+submitted, and decremented as they finish).
+To (temporarily) fix the problem, you should reboot your system to reset the
+counters in /proc/{partitions,diskstats}.
+
+
+4. QUESTIONS RELATING TO PIDSTAT
+################################
+
+4.1. pidstat -d doesn't report task I/O statistics...
+
+For pidstat -d to be able to report I/O statistics for tasks, you need
+a recent Linux kernel (2.6.20 or later) with the option
+CONFIG_TASK_IO_ACCOUNTING compiled in.
+
+~~~
+
+4.2. The pidstat command complains with the following message:
+      "Requested activities not available".
+
+This message is displayed when the pidstat command is unable to display
+the statistics you have requested. This may happen when you try to display
+statistics for child processes (option -T CHILD) because all options of
+pidstat don't necessarily work for child processes. Read the manual page
+to know which statistics are available for child processes.
+
+~~~
+
+4.3. pidstat doesn't display statistics for process (task) xyz...
+
+This must be because pidstat only displays statistics for active tasks
+by default. If you don't use option -p on the command line, then pidstat
+will display only tasks with non-zero statistics. For example, "pidstat -u"
+will display only tasks that have actually used some CPU resources since
+system startup. You should enter "pidstat -u -p ALL" to make sure that all
+the processes are listed in the report.
+
+--     
+Sebastien Godard (sysstat <at> orange.fr) is the author and the current
+maintainer of this package.
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..54caf7c
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,229 @@
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..5dac5c7
--- /dev/null
@@ -0,0 +1,599 @@
+# Makefile to build sysstat commands
+# # (C) 1999-2009 Sebastien GODARD (sysstat <at> orange.fr)
+
+# Version and package name
+VERSION = @PACKAGE_VERSION@
+PACKAGE = @PACKAGE_NAME@
+# Needed by docdir
+PACKAGE_TARNAME = $(PACKAGE)-$(VERSION)
+
+# Compiler to use
+CC = @CC@
+
+# Other commands
+CHMOD = @CHMOD@
+CHOWN = @CHOWN@
+LN_S = @LN_S@
+AR = @AR@
+# Full path to prevent from using aliases
+CP = @PATH_CP@
+
+CHKCONFIG = @PATH_CHKCONFIG@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_BIN = @INSTALL_BIN@
+
+# Directories
+ifndef PREFIX
+PREFIX = @prefix@
+endif
+ifndef DESTDIR
+DESTDIR = $(RPM_BUILD_ROOT)
+endif
+# These two variables are needed by other ones (eg bindir)
+prefix = $(PREFIX)
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+
+ifndef SA_LIB_DIR
+SA_LIB_DIR = @SA_LIB_DIR@
+endif
+SADC_PATH = $(SA_LIB_DIR)/sadc
+ifndef SA_DIR
+SA_DIR = @SA_DIR@
+endif
+BIN_DIR = @bindir@
+
+ifndef MAN_DIR
+# With recent versions of autoconf, mandir defaults to ${datarootdir}/man
+# (i.e. $prefix/share/man) which is not necessarily in man path!
+# MAN_DIR = @mandir@
+MAN_DIR = @AuxMandir@
+endif
+MAN1_DIR = $(MAN_DIR)/man1
+MAN8_DIR = $(MAN_DIR)/man8
+
+ifndef DOC_DIR
+DOC_DIR = @docdir@
+endif
+
+NLS_DIR = $(PREFIX)/share/locale
+SYSCONFIG_DIR = @SYSCONFIG_DIR@
+
+# Compiler flags
+CFLAGS = @CFLAGS@ -Wall -Wstrict-prototypes -pipe -O2
+DFLAGS = @DFLAGS@
+LFLAGS =  -s
+DFLAGS += -DSA_DIR=\"$(SA_DIR)\" -DSADC_PATH=\"$(SADC_PATH)\"
+
+# Commands
+ifndef MSGFMT
+MSGFMT = @MSGFMT@
+endif
+ifndef XGETTEXT
+XGETTEXT = @XGETTEXT@
+endif
+ifndef MSGMERGE
+MSGMERGE = @MSGMERGE@
+endif
+ifndef ZIP
+ZIP = @ZIP@
+endif
+
+# Settings 
+NLS = @NLS@
+ifeq ($(NLS),y)
+REQUIRE_NLS = -DUSE_NLS -DPACKAGE=\"$(PACKAGE)\" -DLOCALEDIR=\"$(NLS_DIR)\"
+endif
+ifdef REQUIRE_NLS
+   DFLAGS += $(REQUIRE_NLS)
+endif
+INSTALL_CRON = @INSTALL_CRON@
+CRON_OWNER = @CRON_OWNER@
+
+MAN_GROUP = @MAN_GROUP@
+ifndef IGNORE_MAN_GROUP
+IGNORE_MAN_GROUP = @IGNORE_MAN_GROUP@
+endif
+ifeq ($(IGNORE_MAN_GROUP),y)
+MANGRPARG =
+else
+MANGRPARG = -g $(MAN_GROUP)
+endif
+ifndef CLEAN_SA_DIR
+CLEAN_SA_DIR = @CLEAN_SA_DIR@
+endif
+ifndef COMPRESS_MANPG
+COMPRESS_MANPG = @COMPRESS_MANPG@
+endif
+ifndef INSTALL_ISAG
+INSTALL_ISAG = @INSTALL_ISAG@
+endif
+ifndef INSTALL_DOC
+INSTALL_DOC = @INSTALL_DOC@
+endif
+
+# Run-command directories
+ifndef RC_DIR
+RC_DIR = @RC_DIR@
+endif
+RC0_DIR = $(RC_DIR)/rc0.d
+RC1_DIR = $(RC_DIR)/rc1.d
+RC2_DIR = $(RC_DIR)/rc2.d
+RC3_DIR = $(RC_DIR)/rc3.d
+RC4_DIR = $(RC_DIR)/rc4.d
+RC5_DIR = $(RC_DIR)/rc5.d
+RC6_DIR = $(RC_DIR)/rc6.d
+ifndef INIT_DIR
+INIT_DIR = @INIT_DIR@
+endif
+ifndef INITD_DIR
+INITD_DIR = @INITD_DIR@
+endif
+
+NLSPO= $(wildcard nls/*.po)
+NLSGMO= $(NLSPO:.po=.gmo)
+NLSPOT= $(NLSPO:.po=.pot)
+
+%.gmo: %.po
+       $(MSGFMT) -o $@ $<
+
+%.pot: %.po
+       $(MSGMERGE) -U $< nls/sysstat.pot
+
+%.o: %.c
+       $(CC) -o $@ -c $(CFLAGS) $(DFLAGS) $<
+
+% : %.o
+       $(CC) -o $@ $(CFLAGS) $^ $(LFLAGS)
+
+all: sadc sar sadf iostat mpstat pidstat nfsiostat cifsiostat locales
+
+common.o: common.c version.h common.h ioconf.h sysconfig.h
+
+sa_common.o: sa_common.c sa.h common.h ioconf.h sysconfig.h rd_stats.h
+
+ioconf.o: ioconf.c ioconf.h common.h sysconfig.h
+
+act_sadc.o: activity.c sa.h rd_stats.h
+       $(CC) -o $@ -c $(CFLAGS) -DSOURCE_SADC $(DFLAGS) $<
+
+act_sar.o: activity.c sa.h pr_stats.h
+       $(CC) -o $@ -c $(CFLAGS) -DSOURCE_SAR $(DFLAGS) $<
+
+act_sadf.o: activity.c sa.h prf_stats.h
+       $(CC) -o $@ -c $(CFLAGS) -DSOURCE_SADF $(DFLAGS) $<
+
+rd_stats.o: rd_stats.c common.h rd_stats.h ioconf.h sysconfig.h
+
+pr_stats.o: pr_stats.c sa.h ioconf.h sysconfig.h pr_stats.h
+
+prf_stats.o: prf_stats.c sa.h ioconf.h sysconfig.h prf_stats.h
+
+sa_wrap.o: sa_wrap.c sa.h rd_stats.h
+
+# Explicit rules needed to prevent possible file corruption
+# when using parallel execution.
+libsyscom.a: common.o ioconf.o
+       $(AR) rvs $@ $?
+
+librdstats.a: librdstats.a(rd_stats.o)
+
+sadc.o: sadc.c sa.h version.h common.h ioconf.h sysconfig.h rd_stats.h
+
+sadc: sadc.o act_sadc.o sa_wrap.o sa_common.o librdstats.a libsyscom.a
+
+sar.o: sar.c sa.h version.h common.h ioconf.h pr_stats.h sysconfig.h
+
+sar: sar.o act_sar.o sa_common.o pr_stats.o libsyscom.a
+
+sadf.o: sadf.c sadf.h version.h sa.h common.h ioconf.h sysconfig.h prf_stats.h
+
+sadf: sadf.o act_sadf.o prf_stats.o sa_common.o libsyscom.a
+
+iostat.o: iostat.c iostat.h version.h common.h ioconf.h sysconfig.h rd_stats.h
+
+iostat: iostat.o librdstats.a libsyscom.a
+
+pidstat.o: pidstat.c pidstat.h version.h common.h rd_stats.h
+
+pidstat: pidstat.o librdstats.a libsyscom.a
+
+mpstat.o: mpstat.c mpstat.h version.h common.h rd_stats.h
+
+mpstat: mpstat.o librdstats.a libsyscom.a
+
+nfsiostat.o: nfsiostat.c nfsiostat.h version.h common.h
+
+nfsiostat: nfsiostat.o librdstats.a libsyscom.a
+
+cifsiostat.o: cifsiostat.c cifsiostat.h version.h common.h
+
+cifsiostat: cifsiostat.o librdstats.a libsyscom.a
+
+ifdef REQUIRE_NLS
+locales: $(NLSGMO)
+else
+locales:
+endif
+
+nls/sysstat.pot: $(wildcard *.c)
+       $(XGETTEXT) -o $@ -k_ --msgid-bugs-address="sysstat <at> orange.fr" $^
+
+# Phony targets
+.PHONY: clean distclean install install_base install_all uninstall \
+       uninstall_base uninstall_all dist bdist
+
+install_man: man/sadc.8 man/sar.1 man/sadf.1 man/sa1.8 man/sa2.8
+ifeq ($(INSTALL_DOC),y)
+       mkdir -p $(DESTDIR)$(MAN1_DIR)
+       mkdir -p $(DESTDIR)$(MAN8_DIR)
+       rm -f $(DESTDIR)$(MAN8_DIR)/sa1.8*
+       $(INSTALL_DATA) $(MANGRPARG) man/sa1.8 $(DESTDIR)$(MAN8_DIR)
+       rm -f $(DESTDIR)$(MAN8_DIR)/sa2.8*
+       $(INSTALL_DATA) $(MANGRPARG) man/sa2.8 $(DESTDIR)$(MAN8_DIR)
+       rm -f $(DESTDIR)$(MAN8_DIR)/sadc.8*
+       $(INSTALL_DATA) $(MANGRPARG) man/sadc.8 $(DESTDIR)$(MAN8_DIR)
+       rm -f $(DESTDIR)$(MAN1_DIR)/sar.1*
+       $(INSTALL_DATA) $(MANGRPARG) man/sar.1 $(DESTDIR)$(MAN1_DIR)
+       rm -f $(DESTDIR)$(MAN1_DIR)/sadf.1*
+       $(INSTALL_DATA) $(MANGRPARG) man/sadf.1 $(DESTDIR)$(MAN1_DIR)
+       rm -f $(DESTDIR)$(MAN1_DIR)/iostat.1*
+       $(INSTALL_DATA) $(MANGRPARG) man/iostat.1 $(DESTDIR)$(MAN1_DIR)
+       rm -f $(DESTDIR)$(MAN1_DIR)/mpstat.1*
+       $(INSTALL_DATA) $(MANGRPARG) man/mpstat.1 $(DESTDIR)$(MAN1_DIR)
+       rm -f $(DESTDIR)$(MAN1_DIR)/pidstat.1*
+       $(INSTALL_DATA) $(MANGRPARG) man/pidstat.1 $(DESTDIR)$(MAN1_DIR)
+       rm -f $(DESTDIR)$(MAN1_DIR)/nfsiostat.1*
+       $(INSTALL_DATA) $(MANGRPARG) man/nfsiostat.1 $(DESTDIR)$(MAN1_DIR)
+       rm -f $(DESTDIR)$(MAN1_DIR)/cifsiostat.1*
+       $(INSTALL_DATA) $(MANGRPARG) man/cifsiostat.1 $(DESTDIR)$(MAN1_DIR)
+ifeq ($(INSTALL_ISAG),y)
+       $(INSTALL_DATA) $(MANGRPARG) contrib/isag/isag.1 $(DESTDIR)$(MAN1_DIR)
+endif
+ifeq ($(COMPRESS_MANPG),y)
+       $(ZIP) $(DESTDIR)$(MAN8_DIR)/sa1.8
+       $(ZIP) $(DESTDIR)$(MAN8_DIR)/sa2.8
+       $(ZIP) $(DESTDIR)$(MAN8_DIR)/sadc.8
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/sar.1
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/sadf.1
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/iostat.1
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/mpstat.1
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/pidstat.1
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/nfsiostat.1
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/cifsiostat.1
+ifeq ($(INSTALL_ISAG),y)
+       $(ZIP) $(DESTDIR)$(MAN1_DIR)/isag.1
+endif
+endif
+endif
+
+install_nls: locales
+ifdef REQUIRE_NLS
+       mkdir -p $(DESTDIR)$(NLS_DIR)/af/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/cs/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/da/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/de/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/es/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/eu/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/fi/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/fr/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/id/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/it/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/ja/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/ky/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/lv/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/mt/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/nb/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/nl/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/nn/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/pl/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/pt/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/pt_BR/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/ro/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/ru/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/sk/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/sv/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/vi/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/zh_CN/LC_MESSAGES
+       mkdir -p $(DESTDIR)$(NLS_DIR)/zh_TW/LC_MESSAGES
+       $(INSTALL_DATA) nls/af.gmo $(DESTDIR)$(NLS_DIR)/af/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/cs.gmo $(DESTDIR)$(NLS_DIR)/cs/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/da.gmo $(DESTDIR)$(NLS_DIR)/da/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/de.gmo $(DESTDIR)$(NLS_DIR)/de/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/es.gmo $(DESTDIR)$(NLS_DIR)/es/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/eu.gmo $(DESTDIR)$(NLS_DIR)/eu/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/fi.gmo $(DESTDIR)$(NLS_DIR)/fi/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/fr.gmo $(DESTDIR)$(NLS_DIR)/fr/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/id.gmo $(DESTDIR)$(NLS_DIR)/id/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/it.gmo $(DESTDIR)$(NLS_DIR)/it/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/ja.gmo $(DESTDIR)$(NLS_DIR)/ja/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/ky.gmo $(DESTDIR)$(NLS_DIR)/ky/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/lv.gmo $(DESTDIR)$(NLS_DIR)/lv/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/mt.gmo $(DESTDIR)$(NLS_DIR)/mt/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/nb.gmo $(DESTDIR)$(NLS_DIR)/nb/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/nl.gmo $(DESTDIR)$(NLS_DIR)/nl/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/nn.gmo $(DESTDIR)$(NLS_DIR)/nn/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/pl.gmo $(DESTDIR)$(NLS_DIR)/pl/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/pt.gmo $(DESTDIR)$(NLS_DIR)/pt/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/pt_BR.gmo $(DESTDIR)$(NLS_DIR)/pt_BR/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/ro.gmo $(DESTDIR)$(NLS_DIR)/ro/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/ru.gmo $(DESTDIR)$(NLS_DIR)/ru/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/sk.gmo $(DESTDIR)$(NLS_DIR)/sk/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/sv.gmo $(DESTDIR)$(NLS_DIR)/sv/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/vi.gmo $(DESTDIR)$(NLS_DIR)/vi/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/zh_CN.gmo $(DESTDIR)$(NLS_DIR)/zh_CN/LC_MESSAGES/$(PACKAGE).mo
+       $(INSTALL_DATA) nls/zh_TW.gmo $(DESTDIR)$(NLS_DIR)/zh_TW/LC_MESSAGES/$(PACKAGE).mo
+endif
+
+install_base: all sa1 sa2 sysstat.sysconfig install_man install_nls \
+       contrib/isag/isag
+       mkdir -p $(DESTDIR)$(SA_LIB_DIR)
+       mkdir -p $(DESTDIR)$(SA_DIR)
+ifeq ($(CLEAN_SA_DIR),y)
+       find $(DESTDIR)$(SA_DIR) \( -name 'sar??' -o -name 'sa??' -o -name 'sar??.gz' -o -name 'sa??.gz' \) \
+               -exec rm -f {} \;
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(SA_DIR)/[0-9]?????
+endif
+       mkdir -p $(DESTDIR)$(BIN_DIR)
+       mkdir -p $(DESTDIR)$(DOC_DIR)
+       mkdir -p $(DESTDIR)$(SYSCONFIG_DIR)
+       $(INSTALL_BIN) sa1 $(DESTDIR)$(SA_LIB_DIR)
+       $(INSTALL_BIN) sa2 $(DESTDIR)$(SA_LIB_DIR)
+       $(INSTALL_BIN) sadc $(DESTDIR)$(SA_LIB_DIR)
+       $(INSTALL_BIN) sar $(DESTDIR)$(BIN_DIR)
+       $(INSTALL_BIN) sadf $(DESTDIR)$(BIN_DIR)
+       $(INSTALL_BIN) iostat $(DESTDIR)$(BIN_DIR)
+       $(INSTALL_BIN) mpstat $(DESTDIR)$(BIN_DIR)
+       $(INSTALL_BIN) pidstat $(DESTDIR)$(BIN_DIR)
+       $(INSTALL_BIN) nfsiostat $(DESTDIR)$(BIN_DIR)
+       $(INSTALL_BIN) cifsiostat $(DESTDIR)$(BIN_DIR)
+ifeq ($(INSTALL_ISAG),y)
+       $(INSTALL_BIN) contrib/isag/isag $(DESTDIR)$(BIN_DIR)
+endif
+       $(INSTALL_DATA) sysstat.ioconf $(DESTDIR)$(SYSCONFIG_DIR)
+       $(INSTALL_DATA) sysstat.sysconfig $(DESTDIR)$(SYSCONFIG_DIR)/sysstat
+ifeq ($(INSTALL_DOC),y)
+       $(INSTALL_DATA) CHANGES $(DESTDIR)$(DOC_DIR)
+       $(INSTALL_DATA) COPYING $(DESTDIR)$(DOC_DIR)
+       $(INSTALL_DATA) CREDITS $(DESTDIR)$(DOC_DIR)
+       $(INSTALL_DATA) README $(DESTDIR)$(DOC_DIR)
+       $(INSTALL_DATA) FAQ $(DESTDIR)$(DOC_DIR)
+       $(INSTALL_DATA) *.lsm $(DESTDIR)$(DOC_DIR)
+endif
+
+install_all: install_base crontab sysstat \
+       sysstat.crond sysstat.cron.daily sysstat.cron.hourly
+       $(CHOWN) $(CRON_OWNER) $(DESTDIR)$(SA_DIR)
+       if [ -d $(DESTDIR)/etc/cron.d ]; then \
+          $(INSTALL_DATA) sysstat.crond $(DESTDIR)/etc/cron.d/sysstat; \
+       elif [ -d $(DESTDIR)/etc/cron.hourly -a -d $(DESTDIR)/etc/cron.daily ]; then \
+          $(INSTALL_BIN) sysstat.cron.hourly $(DESTDIR)/etc/cron.hourly/sysstat; \
+          $(INSTALL_BIN) sysstat.cron.daily $(DESTDIR)/etc/cron.daily/sysstat; \
+       else \
+          su $(CRON_OWNER) -c "crontab -l > /tmp/crontab-$(CRON_OWNER).save"; \
+          $(CP) -a /tmp/crontab-$(CRON_OWNER).save ./crontab-$(CRON_OWNER).`date '+%Y%m%d.%H%M%S'`.save; \
+          echo "USER'S PREVIOUS CRONTAB SAVED IN CURRENT DIRECTORY (USING .save SUFFIX)."; \
+          su $(CRON_OWNER) -c "crontab crontab"; \
+       fi
+       if [ -d $(DESTDIR)$(INIT_DIR) ]; then \
+          $(INSTALL_BIN) sysstat $(DESTDIR)$(INIT_DIR)/sysstat; \
+          if [ -x $(CHKCONFIG) ]; then \
+             cd $(DESTDIR)$(INIT_DIR) && $(CHKCONFIG) --add sysstat; \
+          else \
+             cd $(DESTDIR)$(RC2_DIR) && $(LN_S) -f ../$(INITD_DIR)/sysstat S01sysstat; \
+             cd $(DESTDIR)$(RC3_DIR) && $(LN_S) -f ../$(INITD_DIR)/sysstat S01sysstat; \
+             cd $(DESTDIR)$(RC5_DIR) && $(LN_S) -f ../$(INITD_DIR)/sysstat S01sysstat; \
+          fi \
+       elif [ -d $(DESTDIR)$(RC_DIR) ]; then \
+          $(INSTALL_BIN) sysstat $(DESTDIR)$(RC_DIR)/rc.sysstat; \
+          if [ -x $(CHKCONFIG) ]; then \
+             cd $(DESTDIR)$(RC_DIR) && $(CHKCONFIG) --add sysstat; \
+          else \
+             [ -d $(DESTDIR)$(RC2_DIR) ] || mkdir -p $(DESTDIR)$(RC2_DIR); \
+             [ -d $(DESTDIR)$(RC3_DIR) ] || mkdir -p $(DESTDIR)$(RC3_DIR); \
+             [ -d $(DESTDIR)$(RC5_DIR) ] || mkdir -p $(DESTDIR)$(RC5_DIR); \
+             cd $(DESTDIR)$(RC2_DIR) && $(LN_S) -f ../rc.sysstat S01sysstat; \
+             cd $(DESTDIR)$(RC3_DIR) && $(LN_S) -f ../rc.sysstat S01sysstat; \
+             cd $(DESTDIR)$(RC5_DIR) && $(LN_S) -f ../rc.sysstat S01sysstat; \
+          fi \
+       fi
+
+uninstall_man:
+ifeq ($(INSTALL_DOC),y)
+       rm -f $(DESTDIR)$(MAN8_DIR)/sadc.8*
+       rm -f $(DESTDIR)$(MAN8_DIR)/sa1.8*
+       rm -f $(DESTDIR)$(MAN8_DIR)/sa2.8*
+       rm -f $(DESTDIR)$(MAN1_DIR)/sar.1*
+       rm -f $(DESTDIR)$(MAN1_DIR)/sadf.1*
+       rm -f $(DESTDIR)$(MAN1_DIR)/iostat.1*
+       rm -f $(DESTDIR)$(MAN1_DIR)/mpstat.1*
+       rm -f $(DESTDIR)$(MAN1_DIR)/pidstat.1*
+       rm -f $(DESTDIR)$(MAN1_DIR)/nfsiostat.1*
+       rm -f $(DESTDIR)$(MAN1_DIR)/cifsiostat.1*
+ifeq ($(INSTALL_ISAG),y)
+       rm -f $(DESTDIR)$(MAN1_DIR)/isag.1
+endif
+endif
+
+uninstall_nls:
+ifdef REQUIRE_NLS
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/af/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/cs/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/da/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/de/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/es/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/eu/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/fi/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/fr/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/id/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/it/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/ja/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/ky/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/lv/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/mt/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/nb/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/nl/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/nn/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/pl/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/pt/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/pt_BR/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/ro/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/ru/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/sk/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/sv/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/vi/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/zh_CN/LC_MESSAGES/$(PACKAGE).mo
+       rm -f $(DESTDIR)$(PREFIX)/share/locale/zh_TW/LC_MESSAGES/$(PACKAGE).mo
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/af/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/cs/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/da/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/de/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/es/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/eu/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/fi/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/fr/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/id/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/it/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ja/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ky/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/lv/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/mt/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/nb/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/nl/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/nn/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/pl/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/pt/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/pt_BR/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ro/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ru/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/sk/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/sv/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/vi/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/zh_CN/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/zh_TW/LC_MESSAGES
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/af
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/cs
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/da
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/de
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/es
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/eu
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/fi
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/fr
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/id
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/it
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ja
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ky
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/lv
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/mt
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/nb
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/nl
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/nn
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/pl
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/pt
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/pt_BR
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ro
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/ru
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/sk
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/sv
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/vi
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/zh_CN
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/locale/zh_TW
+endif
+
+uninstall_base: uninstall_man uninstall_nls
+       rm -f $(DESTDIR)$(SA_LIB_DIR)/sadc
+       rm -f $(DESTDIR)$(SA_LIB_DIR)/sa1
+       rm -f $(DESTDIR)$(SA_LIB_DIR)/sa2
+       rm -f $(DESTDIR)$(BIN_DIR)/sar
+       rm -f $(DESTDIR)$(BIN_DIR)/sadf
+       rm -f $(DESTDIR)$(BIN_DIR)/iostat
+       rm -f $(DESTDIR)$(BIN_DIR)/mpstat
+       rm -f $(DESTDIR)$(BIN_DIR)/pidstat
+       rm -f $(DESTDIR)$(BIN_DIR)/nfsiostat
+       rm -f $(DESTDIR)$(BIN_DIR)/cifsiostat
+ifeq ($(INSTALL_ISAG),y)
+       rm -f $(DESTDIR)$(BIN_DIR)/isag
+endif
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(SA_LIB_DIR)
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(SA_DIR)/[0-9]?????
+       -rmdir --ignore-fail-on-non-empty $(DESTDIR)$(SA_DIR)
+#       No need to keep sysstat scripts, config files and links since
+#       the binaries have been deleted.
+       rm -f $(DESTDIR)$(INIT_DIR)/sysstat
+       rm -f $(DESTDIR)$(RC_DIR)/rc.sysstat
+       rm -f $(DESTDIR)$(SYSCONFIG_DIR)/sysstat
+       rm -f $(DESTDIR)$(SYSCONFIG_DIR)/sysstat.ioconf
+       rm -f $(DESTDIR)$(RC2_DIR)/S??sysstat
+       rm -f $(DESTDIR)$(RC3_DIR)/S??sysstat
+       rm -f $(DESTDIR)$(RC5_DIR)/S??sysstat
+#       Delete possible kill entries installed by chkconfig
+       rm -f $(DESTDIR)$(RC0_DIR)/K??sysstat
+       rm -f $(DESTDIR)$(RC1_DIR)/K??sysstat
+       rm -f $(DESTDIR)$(RC4_DIR)/K??sysstat
+       rm -f $(DESTDIR)$(RC6_DIR)/K??sysstat
+#       Vixie cron entries also can be safely deleted here
+       rm -f $(DESTDIR)/etc/cron.d/sysstat
+#       Id. for Slackware cron entries
+       rm -f $(DESTDIR)/etc/cron.hourly/sysstat
+       rm -f $(DESTDIR)/etc/cron.daily/sysstat
+ifeq ($(INSTALL_DOC),y)
+       rm -f $(DESTDIR)$(DOC_DIR)/*
+       -rmdir $(DESTDIR)$(DOC_DIR)
+endif
+       @echo "Please ignore the errors above, if any."
+
+uninstall_all: uninstall_base
+       -su $(CRON_OWNER) -c "crontab -l > /tmp/crontab-$(CRON_OWNER).old"
+       -$(CP) -a /tmp/crontab-$(CRON_OWNER).old ./crontab-$(CRON_OWNER).`date '+%Y%m%d.%H%M%S'`.old
+       @echo "USER CRONTAB SAVED IN CURRENT DIRECTORY (WITH .old SUFFIX)."
+       -su $(CRON_OWNER) -c "crontab -r"
+
+ifeq ($(INSTALL_CRON),y)
+uninstall: uninstall_all
+else
+uninstall: uninstall_base
+endif
+
+ifeq ($(INSTALL_CRON),y)
+install: install_all
+else
+install: install_base
+endif
+
+ifdef REQUIRE_NLS
+po-files: nls/sysstat.pot $(NLSPOT)
+else
+po-files:
+endif
+
+clean:
+       rm -f sadc sar sadf iostat mpstat pidstat nfsiostat cifsiostat *.o *.a core TAGS
+       find nls -name "*.gmo" -exec rm -f {} \;
+
+almost-distclean: clean nls/sysstat.pot
+       rm -f sa1 sa2 sysstat crontab version.h sysconfig.h
+       rm -f sysstat.sysconfig sysstat.crond sysstat.cron.daily
+       rm -f sysstat.cron.hourly sysstat.crond.sample sysstat.crond.sample.in
+       rm -f contrib/isag/isag
+       rm -f man/sa1.8 man/sa2.8 man/sadc.8 man/sadf.1 man/sar.1 man/iostat.1
+       rm -f *.log config.status
+       rm -rf autom4te.cache
+       rm -f *.save *.old .*.swp data
+       find . -name "*~" -exec rm -f {} \;
+
+distclean: almost-distclean
+       rm -f Makefile
+
+maintainer-clean: distclean
+       rm -f configure
+
+dist: almost-distclean
+       cd .. && (tar --exclude=Makefile -cvf - sysstat-$(VERSION) | gzip -v9 > sysstat-$(VERSION).tar.gz)
+
+bdist: almost-distclean
+       cd .. && (tar --exclude=Makefile -cvf - sysstat-$(VERSION) | bzip2 > sysstat-$(VERSION).tar.bz2)
+
+tags:
+       etags ./*.[hc]
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..550a681
--- /dev/null
+++ b/README
@@ -0,0 +1,131 @@
+sysstat: System performance tools for the Linux operating system...
+--
+(C) 1999-2010 Sebastien Godard (sysstat <at> orange.fr)
+
+The latest version of sysstat can always be found on my web site at:
+
+http://pagesperso-orange.fr/sebastien.godard/
+
+sysstat package is also available at ibiblio's Linux archive
+in the following directory:
+
+ftp://ibiblio.org/pub/Linux/system/status/
+
+See the CHANGES file to know the new features/improvements/bug fixes added
+in this release of sysstat.
+
+
+INSTALLATION
+------------
+
+The sysstat utilities are a collection of performance monitoring tools for
+Linux. These include mpstat, iostat, nfsiostat, cifsiostat, pidstat, sar,
+sadc, sadf and sa tools. 
+
+The first stage is to configure sysstat for your system:
+
+       ./configure
+
+You can set several variables and parameters on the command line.
+Please enter "./configure --help" to display them.
+There is another way to configure sysstat instead of entering "./configure":
+this is the Interactive Configuration script (iconfig) which will ask you
+for the value of the main sysstat variables and parameters.
+Enter "./iconfig" then answer the questions or enter Return to accept
+the (sane) default values. For yes/no questions, please answer 'y' or 'n'
+(without the quotes): It is case sensitive! You can also enter '?' to get
+a help message that will explain the meaning of each variable or parameter.
+
+The next stage is to build the various binary files. Enter:
+
+       make
+
+Then log in as root and enter:
+
+       make install
+
+(see next section to know the files that are installed).
+That's all!
+
+Of course tell me if there are any problems. This is the only way I can improve
+'sysstat'. Please also remember to read the FAQ included in this package.
+
+Patches and suggestions for improvements are always welcome!
+Send them to (sysstat <at> orange.fr).
+
+
+FILES THAT ARE INSTALLED
+------------------------
+
+I _hate_ when packages install files everywhere on my disk and I don't know
+where...
+So here is the list of files installed by sysstat, when you ask for a
+complete installation.
+${PREFIX} is the value of the PREFIX variable defined in the Makefile
+(usually set to /usr/local or /usr).
+
+${PREFIX}/lib/sa/sadc
+${PREFIX}/lib/sa/sa1
+${PREFIX}/lib/sa/sa2
+${PREFIX}/bin/sar
+${PREFIX}/bin/sadf
+${PREFIX}/bin/iostat
+${PREFIX}/bin/mpstat
+${PREFIX}/bin/pidstat
+${PREFIX}/bin/nfsiostat
+${PREFIX}/bin/cifsiostat
+${PREFIX}(/share)/man/man8/sadc.8
+${PREFIX}(/share)/man/man8/sa1.8
+${PREFIX}(/share)/man/man8/sa2.8
+${PREFIX}(/share)/man/man1/sar.1
+${PREFIX}(/share)/man/man1/sadf.1
+${PREFIX}(/share)/man/man1/iostat.1
+${PREFIX}(/share)/man/man1/mpstat.1
+${PREFIX}(/share)/man/man1/pidstat.1
+${PREFIX}(/share)/man/man1/nfsiostat.1
+${PREFIX}(/share)/man/man1/cifsiostat.1
+${PREFIX}/share/locale/*/LC_MESSAGES/sysstat.mo
+${PREFIX}/share/doc/sysstat-x.y.z/*
+/var/log/sa
+${INIT_DIR}/sysstat
+/etc/sysconfig/sysstat
+/etc/sysconfig/sysstat.ioconf
+/etc/cron.d/sysstat
+/etc/rc.d/rc.sysstat           for [SLACKWARE]
+${RC_DIR}/rc2.d/S03sysstat
+${RC_DIR}/rc3.d/S03sysstat
+${RC_DIR}/rc5.d/S03sysstat
+
+with:
+
+${INIT_DIR}=/etc/rc.d/init.d/  for [REDHAT] [CALDERA] [MANDRIVA] [TURBOLINUX] [KONDARA]
+${INIT_DIR}=/sbin/init.d/      for [SUSE <= 7.0]
+${INIT_DIR}=/etc/init.d/       for [SUSE >= 7.1] [DEBIAN]
+${RC_DIR}=/etc/rc.d/           for [REDHAT] [CALDERA] [MANDRIVA] [TURBOLINUX] [KONDARA] [SLACKWARE]
+${RC_DIR}=/sbin/init.d/                for [SUSE <= 7.0]
+${RC_DIR}=/etc/init.d/         for [SUSE >= 7.1]
+${RC_DIR}=/etc/                        for [DEBIAN]
+
+sysstat may also install some links in ${RC_DIR}/rc[0146].d/ directory
+if chkconfig is used.
+
+MISCELLANEOUS
+-------------
+
+The sysstat commands are only front-ends to the kernel proc filesystem...
+They cannot display statistics that Linux does not
+provide, nor can they be more accurate than Linux is.
+The sysstat package now only supports 2.6.x kernels.
+Note that all kernels do not necessarily have all the statistics that
+sysstat commands can display, depending on their version or their
+configuration options.
+
+It has been designed with National Language Support (NLS) in mind, using
+the GNU gettext package (available at http://www.gnu.org).
+sysstat has been translated into several languages.
+Anyway you are welcome if you want to make other translations available ;-)
+Please read the README-nls file in the nls directory before.
+
+--
+Sebastien Godard (sysstat <at> orange.fr)
+
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..b173052
--- /dev/null
+++ b/TODO
@@ -0,0 +1,14 @@
+Here are the things I would like (or I should) do for the next releases:
+
+* Add more power management statistics (CPU temperature, fan speed, etc.). I need help
+  for this!
+
+* Add more statistics to sar and mpstat (and iostat) when available in Linux
+  kernels.
+
+* Add a real web-based graphical front-end to sar. I need help for this!
+
+* Add support for hotplug memory?
+
+* Dynamically allocate structures for IRQs (just like for CPUs).
+
diff --git a/activity.c b/activity.c
new file mode 100644 (file)
index 0000000..a1ee28e
--- /dev/null
@@ -0,0 +1,974 @@
+/*
+ * activity.c: Define system activities available for sar/sadc.
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include "sa.h"
+
+#ifdef SOURCE_SADC
+#include "rd_stats.h"
+#endif
+
+#ifdef SOURCE_SAR
+#include "pr_stats.h"
+#endif
+
+#ifdef SOURCE_SADF
+#include "prf_stats.h"
+#endif
+
+/*
+ ***************************************************************************
+ * Definitions of system activities.
+ * See sa.h file for activity structure definition.
+ ***************************************************************************
+ */
+
+/*
+ * Bitmaps needed by activities.
+ * Remember to allocate them before use!
+ */
+
+/* CPU bitmap */
+struct act_bitmap cpu_bitmap = {
+       .b_array        = NULL,
+       .b_size         = NR_CPUS
+};
+
+/* Interrupts bitmap */
+struct act_bitmap irq_bitmap = {
+       .b_array        = NULL,
+       .b_size         = NR_IRQS
+};
+
+
+/*
+ * CPU statistics.
+ * This is the only activity which *must* be collected by sadc
+ * so that uptime can be filled.
+ */
+struct activity cpu_act = {
+       .id             = A_CPU,
+       .options        = AO_COLLECTED + AO_REMANENT + AO_GLOBAL_ITV + AO_MULTIPLE_OUTPUTS,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_cpu_nr,
+       .f_read         = wrap_read_stat_cpu,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_cpu_stats,
+       .f_print_avg    = print_cpu_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_cpu_stats,
+       .f_xml_print    = xml_print_cpu_stats,
+       .hdr_line       = "CPU;%user;%nice;%system;%iowait;%steal;%idle|"
+                         "CPU;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%idle",
+       .name           = "A_CPU",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_CPU_SIZE,
+       .msize          = STATS_CPU_SIZE,
+       .opt_flags      = AO_F_CPU_DEF,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = &cpu_bitmap
+};
+
+/* Process (task) creation and context switch activity */
+struct activity pcsw_act = {
+       .id             = A_PCSW,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_stat_pcsw,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_pcsw_stats,
+       .f_print_avg    = print_pcsw_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_pcsw_stats,
+       .f_xml_print    = xml_print_pcsw_stats,
+       .hdr_line       = "proc/s;cswch/s",
+       .name           = "A_PCSW",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_PCSW_SIZE,
+       .msize          = STATS_PCSW_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Interrupts statistics */
+struct activity irq_act = {
+       .id             = A_IRQ,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_irq_nr,
+       .f_read         = wrap_read_stat_irq,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_irq_stats,
+       .f_print_avg    = print_irq_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_irq_stats,
+       .f_xml_print    = xml_print_irq_stats,
+       .hdr_line       = "INTR;intr/s",
+       .name           = "A_IRQ",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_IRQ_SIZE,
+       .msize          = STATS_IRQ_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = &irq_bitmap
+};
+
+/* Swapping activity */
+struct activity swap_act = {
+       .id             = A_SWAP,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_swap,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_swap_stats,
+       .f_print_avg    = print_swap_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_swap_stats,
+       .f_xml_print    = xml_print_swap_stats,
+       .hdr_line       = "pswpin/s;pswpout/s",
+       .name           = "A_SWAP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_SWAP_SIZE,
+       .msize          = STATS_SWAP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Paging activity */
+struct activity paging_act = {
+       .id             = A_PAGE,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_paging,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_paging_stats,
+       .f_print_avg    = print_paging_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_paging_stats,
+       .f_xml_print    = xml_print_paging_stats,
+       .hdr_line       = "pgpgin/s;pgpgout/s;fault/s;majflt/s;"
+                         "pgfree/s;pgscank/s;pgscand/s;pgsteal/s;%vmeff",
+       .name           = "A_PAGE",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_PAGING_SIZE,
+       .msize          = STATS_PAGING_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* I/O and transfer rate activity */
+struct activity io_act = {
+       .id             = A_IO,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_io,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_io_stats,
+       .f_print_avg    = print_io_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_io_stats,
+       .f_xml_print    = xml_print_io_stats,
+       .hdr_line       = "tps;rtps;wtps;bread/s;bwrtn/s",
+       .name           = "A_IO",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_IO_SIZE,
+       .msize          = STATS_IO_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Memory and swap space utilization activity */
+struct activity memory_act = {
+       .id             = A_MEMORY,
+       .options        = AO_COLLECTED + AO_MULTIPLE_OUTPUTS,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_meminfo,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_memory_stats,
+       .f_print_avg    = print_avg_memory_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_memory_stats,
+       .f_xml_print    = xml_print_memory_stats,
+       .hdr_line       = "frmpg/s;bufpg/s;campg/s|"
+                         "kbmemfree;kbmemused;%memused;kbbuffers;kbcached;kbcommit;%commit|"
+                         "kbswpfree;kbswpused;%swpused;kbswpcad;%swpcad",
+       .name           = "A_MEMORY",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_MEMORY_SIZE,
+       .msize          = STATS_MEMORY_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Kernel tables activity */
+struct activity ktables_act = {
+       .id             = A_KTABLES,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_kernel_tables,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_ktables_stats,
+       .f_print_avg    = print_avg_ktables_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_ktables_stats,
+       .f_xml_print    = xml_print_ktables_stats,
+       .hdr_line       = "dentunusd;file-nr;inode-nr;pty-nr",
+       .name           = "A_KTABLES",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_KTABLES_SIZE,
+       .msize          = STATS_KTABLES_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Queue and load activity */
+struct activity queue_act = {
+       .id             = A_QUEUE,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_loadavg,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_queue_stats,
+       .f_print_avg    = print_avg_queue_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_queue_stats,
+       .f_xml_print    = xml_print_queue_stats,
+       .hdr_line       = "runq-sz;plist-sz;ldavg-1;ldavg-5;ldavg-15",
+       .name           = "A_QUEUE",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_QUEUE_SIZE,
+       .msize          = STATS_QUEUE_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Serial lines activity */
+struct activity serial_act = {
+       .id             = A_SERIAL,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_serial_nr,
+       .f_read         = wrap_read_tty_driver_serial,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_serial_stats,
+       .f_print_avg    = print_serial_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_serial_stats,
+       .f_xml_print    = xml_print_serial_stats,
+       .hdr_line       = "TTY;rcvin/s;txmtin/s;framerr/s;prtyerr/s;brk/s;ovrun/s",
+       .name           = "A_SERIAL",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_SERIAL_SIZE,
+       .msize          = STATS_SERIAL_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Block devices activity */
+struct activity disk_act = {
+       .id             = A_DISK,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_disk_nr,
+       .f_read         = wrap_read_disk,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_disk_stats,
+       .f_print_avg    = print_disk_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_disk_stats,
+       .f_xml_print    = xml_print_disk_stats,
+       .hdr_line       = "DEV;tps;rd_sec/s;wr_sec/s;avgrq-sz;avgqu-sz;await;svctm;%util",
+       .name           = "A_DISK",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_DISK_SIZE,
+       .msize          = STATS_DISK_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Network interfaces activity */
+struct activity net_dev_act = {
+       .id             = A_NET_DEV,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_iface_nr,
+       .f_read         = wrap_read_net_dev,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_dev_stats,
+       .f_print_avg    = print_net_dev_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_dev_stats,
+       .f_xml_print    = xml_print_net_dev_stats,
+       .hdr_line       = "IFACE;rxpck/s;txpck/s;rxkB/s;txkB/s;rxcmp/s;txcmp/s;rxmcst/s",
+       .name           = "A_NET_DEV",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_NET_DEV_SIZE,
+       .msize          = STATS_NET_DEV_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Network interfaces activity */
+struct activity net_edev_act = {
+       .id             = A_NET_EDEV,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_iface_nr,
+       .f_read         = wrap_read_net_edev,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_edev_stats,
+       .f_print_avg    = print_net_edev_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_edev_stats,
+       .f_xml_print    = xml_print_net_edev_stats,
+       .hdr_line       = "IFACE;rxerr/s;txerr/s;coll/s;rxdrop/s;txdrop/s;"
+                         "txcarr/s;rxfram/s;rxfifo/s;txfifo/s",
+       .name           = "A_NET_EDEV",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_NET_EDEV_SIZE,
+       .msize          = STATS_NET_EDEV_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* NFS client activity */
+struct activity net_nfs_act = {
+       .id             = A_NET_NFS,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_nfs,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_nfs_stats,
+       .f_print_avg    = print_net_nfs_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_nfs_stats,
+       .f_xml_print    = xml_print_net_nfs_stats,
+       .hdr_line       = "call/s;retrans/s;read/s;write/s;access/s;getatt/s",
+       .name           = "A_NET_NFS",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_NFS_SIZE,
+       .msize          = STATS_NET_NFS_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* NFS server activity */
+struct activity net_nfsd_act = {
+       .id             = A_NET_NFSD,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_nfsd,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_nfsd_stats,
+       .f_print_avg    = print_net_nfsd_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_nfsd_stats,
+       .f_xml_print    = xml_print_net_nfsd_stats,
+       .hdr_line       = "scall/s;badcall/s;packet/s;udp/s;tcp/s;hit/s;miss/s;"
+                         "sread/s;swrite/s;saccess/s;sgetatt/s",
+       .name           = "A_NET_NFSD",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_NFSD_SIZE,
+       .msize          = STATS_NET_NFSD_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Network sockets activity */
+struct activity net_sock_act = {
+       .id             = A_NET_SOCK,
+       .options        = AO_COLLECTED,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_sock,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_sock_stats,
+       .f_print_avg    = print_avg_net_sock_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_sock_stats,
+       .f_xml_print    = xml_print_net_sock_stats,
+       .hdr_line       = "totsck;tcpsck;udpsck;rawsck;ip-frag;tcp-tw",
+       .name           = "A_NET_SOCK",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_SOCK_SIZE,
+       .msize          = STATS_NET_SOCK_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* IP network traffic activity */
+struct activity net_ip_act = {
+       .id             = A_NET_IP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_ip,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_ip_stats,
+       .f_print_avg    = print_net_ip_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_ip_stats,
+       .f_xml_print    = xml_print_net_ip_stats,
+       .hdr_line       = "irec/s;fwddgm/s;idel/s;orq/s;asmrq/s;asmok/s;fragok/s;fragcrt/s",
+       .name           = "A_NET_IP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_IP_SIZE,
+       .msize          = STATS_NET_IP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* IP network traffic (errors) activity */
+struct activity net_eip_act = {
+       .id             = A_NET_EIP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_eip,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_eip_stats,
+       .f_print_avg    = print_net_eip_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_eip_stats,
+       .f_xml_print    = xml_print_net_eip_stats,
+       .hdr_line       = "ihdrerr/s;iadrerr/s;iukwnpr/s;idisc/s;odisc/s;onort/s;asmf/s;fragf/s",
+       .name           = "A_NET_EIP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_EIP_SIZE,
+       .msize          = STATS_NET_EIP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* ICMP network traffic activity */
+struct activity net_icmp_act = {
+       .id             = A_NET_ICMP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_icmp,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_icmp_stats,
+       .f_print_avg    = print_net_icmp_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_icmp_stats,
+       .f_xml_print    = xml_print_net_icmp_stats,
+       .hdr_line       = "imsg/s;omsg/s;iech/s;iechr/s;oech/s;oechr/s;itm/s;itmr/s;otm/s;"
+                         "otmr/s;iadrmk/s;iadrmkr/s;oadrmk/s;oadrmkr/s",
+       .name           = "A_NET_ICMP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_ICMP_SIZE,
+       .msize          = STATS_NET_ICMP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* ICMP network traffic (errors) activity */
+struct activity net_eicmp_act = {
+       .id             = A_NET_EICMP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_eicmp,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_eicmp_stats,
+       .f_print_avg    = print_net_eicmp_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_eicmp_stats,
+       .f_xml_print    = xml_print_net_eicmp_stats,
+       .hdr_line       = "ierr/s;oerr/s;idstunr/s;odstunr/s;itmex/s;otmex/s;"
+                         "iparmpb/s;oparmpb/s;isrcq/s;osrcq/s;iredir/s;oredir/s",
+       .name           = "A_NET_EICMP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_EICMP_SIZE,
+       .msize          = STATS_NET_EICMP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* TCP network traffic activity */
+struct activity net_tcp_act = {
+       .id             = A_NET_TCP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_tcp,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_tcp_stats,
+       .f_print_avg    = print_net_tcp_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_tcp_stats,
+       .f_xml_print    = xml_print_net_tcp_stats,
+       .hdr_line       = "active/s;passive/s;iseg/s;oseg/s",
+       .name           = "A_NET_TCP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_TCP_SIZE,
+       .msize          = STATS_NET_TCP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* TCP network traffic (errors) activity */
+struct activity net_etcp_act = {
+       .id             = A_NET_ETCP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_etcp,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_etcp_stats,
+       .f_print_avg    = print_net_etcp_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_etcp_stats,
+       .f_xml_print    = xml_print_net_etcp_stats,
+       .hdr_line       = "atmptf/s;estres/s;retrans/s;isegerr/s;orsts/s",
+       .name           = "A_NET_ETCP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_ETCP_SIZE,
+       .msize          = STATS_NET_ETCP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* UDP network traffic activity */
+struct activity net_udp_act = {
+       .id             = A_NET_UDP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_udp,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_udp_stats,
+       .f_print_avg    = print_net_udp_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_udp_stats,
+       .f_xml_print    = xml_print_net_udp_stats,
+       .hdr_line       = "idgm/s;odgm/s;noport/s;idgmerr/s",
+       .name           = "A_NET_UDP",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_UDP_SIZE,
+       .msize          = STATS_NET_UDP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* IPv6 sockets activity */
+struct activity net_sock6_act = {
+       .id             = A_NET_SOCK6,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_sock6,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_sock6_stats,
+       .f_print_avg    = print_avg_net_sock6_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_sock6_stats,
+       .f_xml_print    = xml_print_net_sock6_stats,
+       .hdr_line       = "tcp6sck;udp6sck;raw6sck;ip6-frag",
+       .name           = "A_NET_SOCK6",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_SOCK6_SIZE,
+       .msize          = STATS_NET_SOCK6_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* IPv6 network traffic activity */
+struct activity net_ip6_act = {
+       .id             = A_NET_IP6,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_ip6,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_ip6_stats,
+       .f_print_avg    = print_net_ip6_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_ip6_stats,
+       .f_xml_print    = xml_print_net_ip6_stats,
+       .hdr_line       = "irec6/s;fwddgm6/s;idel6/s;orq6/s;asmrq6/s;asmok6/s;"
+                         "imcpck6/s;omcpck6/s;fragok6/s;fragcr6/s",
+       .name           = "A_NET_IP6",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_IP6_SIZE,
+       .msize          = STATS_NET_IP6_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* IPv6 network traffic (errors) activity */
+struct activity net_eip6_act = {
+       .id             = A_NET_EIP6,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_eip6,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_eip6_stats,
+       .f_print_avg    = print_net_eip6_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_eip6_stats,
+       .f_xml_print    = xml_print_net_eip6_stats,
+       .hdr_line       = "ihdrer6/s;iadrer6/s;iukwnp6/s;i2big6/s;idisc6/s;odisc6/s;"
+                         "inort6/s;onort6/s;asmf6/s;fragf6/s;itrpck6/s",
+       .name           = "A_NET_EIP6",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_EIP6_SIZE,
+       .msize          = STATS_NET_EIP6_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* ICMPv6 network traffic activity */
+struct activity net_icmp6_act = {
+       .id             = A_NET_ICMP6,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_icmp6,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_icmp6_stats,
+       .f_print_avg    = print_net_icmp6_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_icmp6_stats,
+       .f_xml_print    = xml_print_net_icmp6_stats,
+       .hdr_line       = "imsg6/s;omsg6/s;iech6/s;iechr6/s;oechr6/s;igmbq6/s;igmbr6/s;ogmbr6/s;"
+                         "igmbrd6/s;ogmbrd6/s;irtsol6/s;ortsol6/s;irtad6/s;inbsol6/s;onbsol6/s;"
+                         "inbad6/s;onbad6/s",
+       .name           = "A_NET_ICMP6",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_ICMP6_SIZE,
+       .msize          = STATS_NET_ICMP6_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* ICMPv6 network traffic (errors) activity */
+struct activity net_eicmp6_act = {
+       .id             = A_NET_EICMP6,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_eicmp6,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_eicmp6_stats,
+       .f_print_avg    = print_net_eicmp6_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_eicmp6_stats,
+       .f_xml_print    = xml_print_net_eicmp6_stats,
+       .hdr_line       = "ierr6/s;idtunr6/s;odtunr6/s;itmex6/s;otmex6/s;"
+                         "iprmpb6/s;oprmpb6/s;iredir6/s;oredir6/s;ipck2b6/s;opck2b6/s",
+       .name           = "A_NET_EICMP6",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_EICMP6_SIZE,
+       .msize          = STATS_NET_EICMP6_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* UDPv6 network traffic activity */
+struct activity net_udp6_act = {
+       .id             = A_NET_UDP6,
+       .options        = AO_CLOSE_MARKUP,
+#ifdef SOURCE_SADC
+       .f_count        = NULL,
+       .f_read         = wrap_read_net_udp6,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_net_udp6_stats,
+       .f_print_avg    = print_net_udp6_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_net_udp6_stats,
+       .f_xml_print    = xml_print_net_udp6_stats,
+       .hdr_line       = "idgm6/s;odgm6/s;noport6/s;idgmer6/s",
+       .name           = "A_NET_UDP6",
+#endif
+       .nr             = 1,
+       .fsize          = STATS_NET_UDP6_SIZE,
+       .msize          = STATS_NET_UDP6_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* CPU frequency */
+struct activity pwr_cpufreq_act = {
+       .id             = A_PWR_CPUFREQ,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_cpu_nr,
+       .f_read         = wrap_read_cpuinfo,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_pwr_cpufreq_stats,
+       .f_print_avg    = print_avg_pwr_cpufreq_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_pwr_cpufreq_stats,
+       .f_xml_print    = xml_print_pwr_cpufreq_stats,
+       .hdr_line       = "CPU;MHz",
+       .name           = "A_PWR_CPUFREQ",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_PWR_CPUFREQ_SIZE,
+       .msize          = STATS_PWR_CPUFREQ_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = &cpu_bitmap
+};
+
+/* Fan */
+struct activity pwr_fan_act = {
+       .id             = A_PWR_FAN,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_fan_nr,
+       .f_read         = wrap_read_fan,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_pwr_fan_stats,
+       .f_print_avg    = print_avg_pwr_fan_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_pwr_fan_stats,
+       .f_xml_print    = xml_print_pwr_fan_stats,
+       .hdr_line       = "device;FAN;rpm;drpm",
+       .name           = "A_PWR_FAN",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_PWR_FAN_SIZE,
+       .msize          = STATS_PWR_FAN_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Temperature */
+struct activity pwr_temp_act = {
+       .id             = A_PWR_TEMP,
+       .options        = AO_NULL,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_temp_nr,
+       .f_read         = wrap_read_temp,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_pwr_temp_stats,
+       .f_print_avg    = print_avg_pwr_temp_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_pwr_temp_stats,
+       .f_xml_print    = xml_print_pwr_temp_stats,
+       .hdr_line       = "device;TEMP;degC;%temp",
+       .name           = "A_PWR_TEMP",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_PWR_TEMP_SIZE,
+       .msize          = STATS_PWR_TEMP_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+/* Voltage inputs */
+struct activity pwr_in_act = {
+       .id             = A_PWR_IN,
+       .options        = AO_CLOSE_MARKUP,
+#ifdef SOURCE_SADC
+       .f_count        = wrap_get_in_nr,
+       .f_read         = wrap_read_in,
+#endif
+#ifdef SOURCE_SAR
+       .f_print        = print_pwr_in_stats,
+       .f_print_avg    = print_avg_pwr_in_stats,
+#endif
+#ifdef SOURCE_SADF
+       .f_render       = render_pwr_in_stats,
+       .f_xml_print    = xml_print_pwr_in_stats,
+       .hdr_line       = "device;IN;inV;%in",
+       .name           = "A_PWR_IN",
+#endif
+       .nr             = -1,
+       .fsize          = STATS_PWR_IN_SIZE,
+       .msize          = STATS_PWR_IN_SIZE,
+       .opt_flags      = 0,
+       .buf            = {NULL, NULL, NULL},
+       .bitmap         = NULL
+};
+
+
+/*
+ * Array of activities.
+ */
+struct activity *act[NR_ACT] = {
+       &cpu_act,
+       &pcsw_act,
+       &irq_act,
+       &swap_act,
+       &paging_act,
+       &io_act,
+       &memory_act,
+       &ktables_act,
+       &queue_act,
+       &serial_act,
+       &disk_act,
+       &net_dev_act,
+       &net_edev_act,
+       &net_nfs_act,
+       &net_nfsd_act,
+       &net_sock_act,
+       &net_ip_act,
+       &net_eip_act,
+       &net_icmp_act,
+       &net_eicmp_act,
+       &net_tcp_act,
+       &net_etcp_act,
+       &net_udp_act,
+       &net_sock6_act,
+       &net_ip6_act,
+       &net_eip6_act,
+       &net_icmp6_act,
+       &net_eicmp6_act,
+       &net_udp6_act,
+       &pwr_cpufreq_act,
+       &pwr_fan_act,
+       &pwr_temp_act,
+       &pwr_in_act
+};
diff --git a/build/Ask.sh b/build/Ask.sh
new file mode 100644 (file)
index 0000000..2abc314
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# Ask a question and return the answer
+
+QUESTION=$1
+PARM=$2
+TEXT_FILE=$3
+while :; do
+       echo -n "${QUESTION} [${PARM}] " >/dev/tty
+       read ANSWER
+       if [ "${ANSWER}" = "" ]; then
+               break
+       elif [ "${ANSWER}" = "?" ]; then
+               cat build/${TEXT_FILE} >/dev/tty
+       else
+               echo ${ANSWER}
+               break
+       fi
+done
+
diff --git a/build/clean-sa-dir b/build/clean-sa-dir
new file mode 100644 (file)
index 0000000..e02b644
--- /dev/null
@@ -0,0 +1,11 @@
+
+Answer y if you want to remove existing daily data files from
+system activity directory that were created by a previous
+version of sysstat.
+Removing those files may be compulsory if they have been created
+with a format which is no longer compatible with that of current
+sysstat version.
+Default answer is n (files are not deleted).
+You can still remove them by hand afterwards if sar yields the
+following error: "Invalid system activity file".
+
diff --git a/build/compress-manpg b/build/compress-manpg
new file mode 100644 (file)
index 0000000..aa77171
--- /dev/null
@@ -0,0 +1,5 @@
+
+Answer y if you want sysstat manual pages to be compressed (using bzip2 or
+gzip) when they are installed.
+Default answer is n here.
+
diff --git a/build/compressafter b/build/compressafter
new file mode 100644 (file)
index 0000000..6904c3d
--- /dev/null
@@ -0,0 +1,8 @@
+
+To prevent sar daily datafiles from taking to much space on disk, you can
+ask the sa2 shell script to compress them (using gzip or bzip2) after a
+certain amount of time.
+Answer here the number of days after which datafiles are to be compressed
+(default value is 10 days).
+Note that this parameter is saved in the /etc/sysconfig/sysstat file.
+
diff --git a/build/conf_dir b/build/conf_dir
new file mode 100644 (file)
index 0000000..0e79e02
--- /dev/null
@@ -0,0 +1,6 @@
+
+This is the directory where sysstat configuration files will
+be installed. Default location is /etc/sysconfig. The directory
+will be automatically created during installation stage if
+necessary. Press Enter to accept this default location.
+
diff --git a/build/cron_interval b/build/cron_interval
new file mode 100644 (file)
index 0000000..9330c78
--- /dev/null
@@ -0,0 +1,7 @@
+
+You may enter here the sampling interval (in minutes) that the configuration
+script will use to customize the crontab.
+Defaut value is 10. This means that sadc (the system activity data collector
+called by sar) will take a snapshot of the system counters every 10 minutes.
+Other reasonable values could be 5, 15 or 20 minutes.
+
diff --git a/build/cron_owner b/build/cron_owner
new file mode 100644 (file)
index 0000000..0b9a359
--- /dev/null
@@ -0,0 +1,7 @@
+
+This is the user the crontab will belong to. Be careful that sysstat may
+need to replace his original crontab (after having saved it in sysstat
+directory) if you use an old version of cron (i.e. if /etc/cron.d directory
+doesn't exist).
+Default user is root here.
+
diff --git a/build/debuginfo b/build/debuginfo
new file mode 100644 (file)
index 0000000..c905177
--- /dev/null
@@ -0,0 +1,3 @@
+Answer y to include debug information in some sysstat's commands.
+This is usually unneeded, so you can safely answer n.
+
diff --git a/build/history b/build/history
new file mode 100644 (file)
index 0000000..99e6b2a
--- /dev/null
@@ -0,0 +1,9 @@
+
+The sa2 shell script creates daily reports, saved in /var/log/sa directory
+(default location).
+It also removes daily data files and reports which are older than a number
+of days. This number defaults to 7 (one week of data history).
+Answer here the number of days during which a daily data file or a report
+should be kept.
+Note that this parameter is saved in the /etc/sysconfig/sysstat file.
+
diff --git a/build/ignore-man-group b/build/ignore-man-group
new file mode 100644 (file)
index 0000000..03dfbbd
--- /dev/null
@@ -0,0 +1,6 @@
+
+Here again, don't bother too much with that. When set, this parameter tells
+the configuration process not to take into account the contents of the
+man_group variable.
+This parameter is only used by some distros to package sysstat.
+
diff --git a/build/install-cron b/build/install-cron
new file mode 100644 (file)
index 0000000..a155928
--- /dev/null
@@ -0,0 +1,9 @@
+
+Answer y if you want to automate sar reporting. In this case, a crontab will
+be created to periodically start the data collector. System activity daily
+data files will then be created in the /var/log/sa directory.
+You can find various crontab templates in sysstat directory. By default
+sysstat will try to use sysstat.crond template and install it in the
+/etc/cron.d directory.
+Default answer is n here.
+
diff --git a/build/install-doc b/build/install-doc
new file mode 100644 (file)
index 0000000..1bb296c
--- /dev/null
@@ -0,0 +1,6 @@
+
+Answer y if you don't want to install sysstat's documentation files.
+Those are primarily manual pages for sysstat's commands. They also
+include a few other files like the FAQ or README files.
+Default answer is n here (documentation files ARE installed).
+
diff --git a/build/install-isag b/build/install-isag
new file mode 100644 (file)
index 0000000..43e2747
--- /dev/null
@@ -0,0 +1,8 @@
+
+Answer y if you want to install the isag command.
+isag, the Interactive System Activity Grapher, is a graphical frontend
+to sar. It graphically displays the system activity data stored
+in a binary data file by a previous sar run.
+Although included in the sysstat package (in the contrib directory), isag is
+not necessarily kept in sync with sar. That's why it is not installed by default.
+
diff --git a/build/man_group b/build/man_group
new file mode 100644 (file)
index 0000000..f8465cb
--- /dev/null
@@ -0,0 +1,6 @@
+
+This is the group name that will be used for each manual page file saved on
+your disk.
+Don't bother too much with this. The default answer ("man" if it exists)
+should be OK.
+
diff --git a/build/nls b/build/nls
new file mode 100644 (file)
index 0000000..88458d7
--- /dev/null
+++ b/build/nls
@@ -0,0 +1,9 @@
+
+NLS stands for National Language Support.
+With NLS enabled, the sysstat utilities will behave in accordance with your
+current locale. Sysstat messages will be translated into the language specified
+by the LANG environment variable, among other.
+Read the nls/README-nls file for more information.
+So you should not disable NLS support by default.
+Note that NLS needs the GNU gettext package to work.
+
diff --git a/build/prefix b/build/prefix
new file mode 100644 (file)
index 0000000..fc7d02a
--- /dev/null
@@ -0,0 +1,7 @@
+
+This is the base directory used for installation.
+System administrators would rather install softwares that are added to
+an already existing system into /usr/local, since /usr is sometimes
+mounted read-only.
+/usr/local is the default answer here.
+
diff --git a/build/rcdir b/build/rcdir
new file mode 100644 (file)
index 0000000..abdd6a4
--- /dev/null
@@ -0,0 +1,7 @@
+
+This is the directory where sysstat's startup scripts and links
+will be installed. The usual location is /etc/rc.d.
+Note that if this directory doesn't exist, startup scripts and
+links won't be installed.
+Just press Enter to let configure guess the proper value.
+
diff --git a/build/sa_dir b/build/sa_dir
new file mode 100644 (file)
index 0000000..309d4ae
--- /dev/null
@@ -0,0 +1,7 @@
+
+This is the directory where daily data files will be stored.
+Those files contain statistics reported by the sar command.
+The usual location is /var/log/sa. The directory will be
+automatically created during installation stage if necessary.
+Just press Enter to accept this usual location.
+
diff --git a/build/sa_lib_dir b/build/sa_lib_dir
new file mode 100644 (file)
index 0000000..b941583
--- /dev/null
@@ -0,0 +1,6 @@
+
+This is the directory where sadc, the system activity data
+collector called by sar, will be located (usually PREFIX/lib/sa).
+sa1 and sa2 shell scripts will also be saved in that directory.
+Letting ./configure guess the proper location for them should be a safe bet.
+
diff --git a/build/sensors b/build/sensors
new file mode 100644 (file)
index 0000000..bcb98c9
--- /dev/null
@@ -0,0 +1,7 @@
+
+Answering y here disable sensors support. Sysstat commands
+will not be linked against sensors library even if this library
+is installed on your system.
+Without sensors support, some statistics related to power management
+will not be available (fan speed, device temperature, etc.)
+
diff --git a/build/yesterday b/build/yesterday
new file mode 100644 (file)
index 0000000..383376e
--- /dev/null
@@ -0,0 +1,8 @@
+
+The sa2 shell script uses a daily data file to create a daily report.
+By default it uses current daily data file (that is to say
+the daily data file created today).
+Yet it may be sometimes useful to tell it to use the daily data file
+of the day before (that is to say the one created yesterday), for
+example if sa2 is started at, say, 02:00 AM. In this case, answer y.
+
diff --git a/cifsiostat.c b/cifsiostat.c
new file mode 100644 (file)
index 0000000..9621945
--- /dev/null
@@ -0,0 +1,597 @@
+/*
+ * cifsiostat: Report I/O statistics for CIFS filesystems.
+ * Copyright (C) 2010 Red Hat, Inc. All Rights Reserved
+ * Written by Ivana Varekova <varekova@redhat.com>
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/utsname.h>
+#include <ctype.h>
+
+#include "version.h"
+#include "cifsiostat.h"
+#include "common.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": " __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+unsigned long long uptime[2]  = {0, 0};
+unsigned long long uptime0[2] = {0, 0};
+struct cifs_stats *st_cifs[2];
+struct io_hdr_stats *st_hdr_cifs;
+
+int cifs_nr = 0;       /* Nb of CIFS mounted directories found */
+int cpu_nr = 0;                /* Nb of processors on the machine */
+int flags = 0;         /* Flag for common options and system state */
+
+long interval = 0;
+char timestamp[64];
+
+
+/*
+ ***************************************************************************
+ * Print usage and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command.
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+       fprintf(stderr, _("Usage: %s [ options ] [ <interval> [ <count> ] ]\n"),
+               progname);
+
+       fprintf(stderr, _("Options are:\n"
+                         "[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * SIGALRM signal handler.
+ *
+ * IN:
+ * @sig        Signal number. Set to 0 for the first time, then to SIGALRM.
+ ***************************************************************************
+ */
+void alarm_handler(int sig)
+{
+       signal(SIGALRM, alarm_handler);
+       alarm(interval);
+}
+
+/*
+ ***************************************************************************
+ * Find number of CIFS-mounted points that are registered in
+ * /proc/fs/cifs/Stats.
+ *
+ * RETURNS:
+ * Number of CIFS-mounted points.
+ ***************************************************************************
+ */
+int get_cifs_nr(void)
+{
+       FILE *fp;
+       char line[128];
+       int cifs = 0;
+
+       if ((fp = fopen(CIFSSTATS, "r")) == NULL)
+               /* File non-existent */
+               return 0;
+
+       while (fgets(line, 128, fp) != NULL) {
+               
+               if (!strncmp(line, "Share (unique mount targets): ", 30)) {
+                       sscanf(line + 30, "%d", &cifs);
+                       break;
+               }
+       }
+
+       /* Close file */
+       fclose(fp);
+
+       return cifs;
+}
+
+/*
+ ***************************************************************************
+ * Set every cifs_io entry to inactive state (unregistered).
+ ***************************************************************************
+ */
+void set_entries_inactive(void)
+{
+       int i;
+       struct io_hdr_stats *shi = st_hdr_cifs;
+
+       for (i = 0; i < cifs_nr; i++, shi++) {
+               shi->active = FALSE;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free inactive entries (mark them as unused).
+ ***************************************************************************
+ */
+void free_inactive_entries(void)
+{
+       int i;
+       struct io_hdr_stats *shi = st_hdr_cifs;
+
+       for (i = 0; i < cifs_nr; i++, shi++) {
+               if (!shi->active) {
+                       shi->used = FALSE;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Allocate and init structures, according to system state.
+ ***************************************************************************
+ */
+void io_sys_init(void)
+{
+       int i;
+       
+       /* How many processors on this machine? */
+       cpu_nr = get_cpu_nr(~0);
+
+       /* Get number of CIFS directories in /proc/fs/cifs/Stats */
+       if ((cifs_nr = get_cifs_nr()) > 0) {
+               cifs_nr += NR_CIFS_PREALLOC;
+       }
+       st_hdr_cifs = (struct io_hdr_stats *) calloc(cifs_nr, IO_HDR_STATS_SIZE);
+       
+       /* Allocate structures for number of CIFS directories found */
+       for (i = 0; i < 2; i++) {
+               if ((st_cifs[i] =
+                   (struct cifs_stats *) calloc(cifs_nr, CIFS_STATS_SIZE)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free various structures.
+ ***************************************************************************
+*/
+void io_sys_free(void)
+{
+       int i;
+
+       /* Free CIFS directories structures */
+       for (i = 0; i < 2; i++) {
+
+               if (st_cifs[i]) {
+                       free(st_cifs[i]);
+               }
+       }
+       
+       if (st_hdr_cifs) {
+               free(st_hdr_cifs);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Save stats for current CIFS filesystem.
+ *
+ * IN:
+ * @name               Name of CIFS filesystem.
+ * @curr               Index in array for current sample statistics.
+ * @st_io              Structure with CIFS statistics to save.
+ ***************************************************************************
+ */
+void save_stats(char *name, int curr, struct cifs_stats *st_io)
+{
+       int i;
+       struct io_hdr_stats *st_hdr_cifs_i;
+       struct cifs_stats *st_cifs_i;
+
+       /* Look for CIFS directory in data table */
+       for (i = 0; i < cifs_nr; i++) {
+               st_hdr_cifs_i = st_hdr_cifs + i;
+               if (!strcmp(st_hdr_cifs_i->name, name)) {
+                       break;
+               }
+       }
+       
+       if (i == cifs_nr) {
+               /*
+                * This is a new filesystem: Look for an unused entry to store it.
+                */
+               for (i = 0; i < cifs_nr; i++) {
+                       st_hdr_cifs_i = st_hdr_cifs + i;
+                       if (!st_hdr_cifs_i->used) {
+                               /* Unused entry found... */
+                               st_hdr_cifs_i->used = TRUE; /* Indicate it is now used */
+                               strcpy(st_hdr_cifs_i->name, name);
+                               st_cifs_i = st_cifs[!curr] + i;
+                               memset(st_cifs_i, 0, CIFS_STATS_SIZE);
+                               break;
+                       }
+               }
+       }
+       if (i < cifs_nr) {
+               st_hdr_cifs_i = st_hdr_cifs + i;
+               st_hdr_cifs_i->active = TRUE;
+               st_cifs_i = st_cifs[curr] + i;
+               *st_cifs_i = *st_io;
+       }
+       /*
+        * else it was a new CIFS directory
+        * but there was no free structure to store it.
+        */
+}
+
+/*
+ ***************************************************************************
+ * Read CIFS-mount directories stats from /proc/fs/cifs/Stats.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void read_cifs_stat(int curr)
+{
+       FILE *fp;
+       char line[256];
+       char aux[32];
+       int start = 0;
+       char cifs_name[MAX_NAME_LEN];
+       char name_tmp[MAX_NAME_LEN];
+       struct cifs_stats scifs;
+
+       /* Every CIFS entry is potentially unregistered */
+       set_entries_inactive();
+
+       if ((fp = fopen(CIFSSTATS, "r")) == NULL)
+               return;
+
+       sprintf(aux, "%%%ds %%10s %%10s",
+               MAX_NAME_LEN < 200 ? MAX_NAME_LEN : 200);
+
+       while (fgets(line, 256, fp) != NULL) {
+
+               /* Read CIFS directory name */
+               if (isdigit((unsigned char) line[0]) && sscanf(line, "%*d) %s", name_tmp) == 1) {
+                       if (start) {
+                               save_stats(cifs_name, curr, &scifs);
+                       }
+                       else {
+                               start = 1;
+                       }
+                       strcpy(cifs_name, name_tmp);
+               }
+               else {
+                       if (!strncmp(line, "Reads:", 6)) {
+                               sscanf(line, "Reads: %llu Bytes: %llu", &scifs.rd_ops, &scifs.rd_bytes);
+                       }
+                       if (!strncmp(line, "Writes:", 7)) {
+                               sscanf(line, "Writes: %llu Bytes: %llu", &scifs.wr_ops, &scifs.wr_bytes);
+                       }
+                       if (!strncmp(line, "Opens:", 6)) {
+                               sscanf(line, "Opens: %llu Closes:%llu Deletes: %llu",
+                                      &scifs.fopens, &scifs.fcloses, &scifs.fdeletes);
+                       }
+               }
+       }
+       
+       if (start) {
+               save_stats(cifs_name, curr, &scifs);
+       }
+
+       fclose(fp);
+
+       /* Free structures corresponding to unregistered filesystems */
+       free_inactive_entries();
+}
+
+/*
+ ***************************************************************************
+ * Display CIFS stats header.
+ *
+ * OUT:
+ * @fctr       Conversion factor.
+ ***************************************************************************
+ */
+void write_cifs_stat_header(int *fctr)
+{
+       printf("Filesystem:           ");
+       if (DISPLAY_KILOBYTES(flags)) {
+               printf("        rkB/s        wkB/s");
+               *fctr = 1024;
+       }
+       else if (DISPLAY_MEGABYTES(flags)) {
+               printf("        rMB/s        wMB/s");
+               *fctr = 1024 * 1024;
+       }
+       else {
+               printf("         rB/s         wB/s");
+               *fctr = 1;
+       }
+       printf("    rops/s    wops/s         fo/s         fc/s         fd/s\n");
+}
+
+/*
+ ***************************************************************************
+ * Write CIFS stats read from /proc/fs/cifs/Stats.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time.
+ * @fctr       Conversion factor.
+ * @shi                Structures describing the CIFS filesystems.
+ * @ioi                Current sample statistics.
+ * @ioj                Previous sample statistics.
+ ***************************************************************************
+ */
+void write_cifs_stat(int curr, unsigned long long itv, int fctr,
+                    struct io_hdr_stats *shi, struct cifs_stats *ioni,
+                    struct cifs_stats *ionj)
+{
+       if (DISPLAY_HUMAN_READ(flags)) {
+               printf("%-22s\n%23s", shi->name, "");
+       }
+       else {
+               printf("%-22s ", shi->name);
+       }
+       /*       rB/s   wB/s   fo/s   fc/s   fd/s*/
+       printf("%12.2f %12.2f %9.2f %9.2f %12.2f %12.2f %12.2f \n",
+              S_VALUE(ionj->rd_bytes, ioni->rd_bytes, itv) / fctr,
+              S_VALUE(ionj->wr_bytes, ioni->wr_bytes, itv) / fctr,
+              S_VALUE(ionj->rd_ops, ioni->rd_ops, itv),
+              S_VALUE(ionj->wr_ops, ioni->wr_ops, itv),
+              S_VALUE(ionj->fopens, ioni->fopens, itv),
+              S_VALUE(ionj->fcloses, ioni->fcloses, itv),
+              S_VALUE(ionj->fdeletes, ioni->fdeletes, itv));
+}
+
+/*
+ ***************************************************************************
+ * Print everything now (stats and uptime).
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @rectime    Current date and time.
+ ***************************************************************************
+ */
+void write_stats(int curr, struct tm *rectime)
+{
+       int i, fctr = 1;
+       unsigned long long itv;
+       struct io_hdr_stats *shi;
+       struct cifs_stats *ioni, *ionj;
+
+       /* Test stdout */
+       TEST_STDOUT(STDOUT_FILENO);
+
+       /* Print time stamp */
+       if (DISPLAY_TIMESTAMP(flags)) {
+               if (DISPLAY_ISO(flags)) {
+                       strftime(timestamp, sizeof(timestamp), "%FT%T%z", rectime);
+               }
+               else {
+                       strftime(timestamp, sizeof(timestamp), "%x %X", rectime);
+               }
+               printf("%s\n", timestamp);
+       }
+
+       /* Interval is multiplied by the number of processors */
+       itv = get_interval(uptime[!curr], uptime[curr]);
+
+       if (cpu_nr > 1) {
+               /* On SMP machines, reduce itv to one processor (see note above) */
+               itv = get_interval(uptime0[!curr], uptime0[curr]);
+       }
+
+       shi = st_hdr_cifs;
+
+       /* Display CIFS stats header */
+       write_cifs_stat_header(&fctr);
+
+       for (i = 0; i < cifs_nr; i++, shi++) {
+               if (shi->used) {
+                       ioni = st_cifs[curr]  + i;
+                       ionj = st_cifs[!curr] + i;
+                       write_cifs_stat(curr, itv, fctr, shi, ioni, ionj);
+               }
+       }
+       printf("\n");
+}
+
+/*
+ ***************************************************************************
+ * Main loop: Read stats from the relevant sources and display them.
+ *
+ * IN:
+ * @count      Number of lines of stats to print.
+ * @rectime    Current date and time.
+ ***************************************************************************
+ */
+void rw_io_stat_loop(long int count, struct tm *rectime)
+{
+       int curr = 1;
+
+       /* Don't buffer data if redirected to a pipe */
+       setbuf(stdout, NULL);
+       
+       do {
+               if (cpu_nr > 1) {
+                       /*
+                        * Read system uptime (only for SMP machines).
+                        * Init uptime0. So if /proc/uptime cannot fill it,
+                        * this will be done by /proc/stat.
+                        */
+                       uptime0[curr] = 0;
+                       read_uptime(&(uptime0[curr]));
+               }
+
+               /* Read CIFS stats */
+               read_cifs_stat(curr);
+
+               /* Get time */
+               get_localtime(rectime);
+
+               /* Print results */
+               write_stats(curr, rectime);
+
+               if (count > 0) {
+                       count--;
+               }
+               if (count) {
+                       curr ^= 1;
+                       pause();
+               }
+       }
+       while (count);
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the cifsiostat program.
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int it = 0;
+       int opt = 1;
+       int i;
+       long count = 1;
+       struct utsname header;
+       struct tm rectime;
+
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       /* Get HZ */
+       get_HZ();
+
+       /* Process args... */
+       while (opt < argc) {
+
+               if (!strncmp(argv[opt], "-", 1)) {
+                       for (i = 1; *(argv[opt] + i); i++) {
+
+                               switch (*(argv[opt] + i)) {
+
+                               case 'h':
+                                       /* Display an easy-to-read CIFS report */
+                                       flags |= I_D_HUMAN_READ;
+                                       break;
+       
+                               case 'k':
+                                       if (DISPLAY_MEGABYTES(flags)) {
+                                               usage(argv[0]);
+                                       }
+                                       /* Display stats in kB/s */
+                                       flags |= I_D_KILOBYTES;
+                                       break;
+
+                               case 'm':
+                                       if (DISPLAY_KILOBYTES(flags)) {
+                                               usage(argv[0]);
+                                       }
+                                       /* Display stats in MB/s */
+                                       flags |= I_D_MEGABYTES;
+                                       break;
+
+                               case 't':
+                                       /* Display timestamp */
+                                       flags |= I_D_TIMESTAMP;
+                                       break;
+
+                               case 'V':
+                                       /* Print version number and exit */
+                                       print_version();
+                                       break;
+       
+                               default:
+                                       usage(argv[0]);
+                               }
+                       }
+                       opt++;
+               }
+
+               else if (!it) {
+                       interval = atol(argv[opt++]);
+                       if (interval < 0) {
+                               usage(argv[0]);
+                       }
+                       count = -1;
+                       it = 1;
+               }
+
+               else if (it > 0) {
+                       count = atol(argv[opt++]);
+                       if ((count < 1) || !interval) {
+                               usage(argv[0]);
+                       }
+                       it = -1;
+               }
+               else {
+                       usage(argv[0]);
+               }
+       }
+
+       if (!interval) {
+               count = 1;
+       }
+
+       /* Init structures according to machine architecture */
+       io_sys_init();
+
+       get_localtime(&rectime);
+
+       /* Get system name, release number and hostname */
+       uname(&header);
+       if (print_gal_header(&rectime, header.sysname, header.release,
+                            header.nodename, header.machine, cpu_nr)) {
+               flags |= I_D_ISO;
+       }
+       printf("\n");
+
+       /* Set a handler for SIGALRM */
+       alarm_handler(0);
+
+       /* Main loop */
+       rw_io_stat_loop(count, &rectime);
+
+       /* Free structures */
+       io_sys_free();
+
+       return 0;
+}
diff --git a/cifsiostat.h b/cifsiostat.h
new file mode 100644 (file)
index 0000000..6c84d0a
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * cifsiostat: Report CIFS statistics
+ * Copyright (C) 2010 Red Hat, Inc. All Rights Reserved
+ * Written by Ivana Varekova <varekova@redhat.com>
+ */
+
+#ifndef _CIFSIOSTAT_H
+#define _CIFSIOSTAT_H
+
+#include "common.h"
+
+#define CIFSSTATS  "/proc/fs/cifs/Stats"
+
+/* I_: iostat - D_: Display - F_: Flag */
+#define I_D_TIMESTAMP          0x001
+#define I_D_KILOBYTES          0x002
+#define I_D_MEGABYTES          0x004
+#define I_D_ISO                        0x008
+#define I_D_HUMAN_READ         0x010
+
+#define DISPLAY_TIMESTAMP(m)   (((m) & I_D_TIMESTAMP)     == I_D_TIMESTAMP)
+#define DISPLAY_KILOBYTES(m)   (((m) & I_D_KILOBYTES)     == I_D_KILOBYTES)
+#define DISPLAY_MEGABYTES(m)   (((m) & I_D_MEGABYTES)     == I_D_MEGABYTES)
+#define DISPLAY_ISO(m)         (((m) & I_D_ISO)           == I_D_ISO)
+#define DISPLAY_HUMAN_READ(m)  (((m) & I_D_HUMAN_READ)    == I_D_HUMAN_READ)
+
+/* Preallocation constats */
+#define NR_CIFS_PREALLOC       2
+
+struct cifs_stats {
+       unsigned long long rd_bytes     __attribute__ ((aligned (8)));
+       unsigned long long wr_bytes     __attribute__ ((packed));
+       unsigned long long rd_ops       __attribute__ ((packed));
+       unsigned long long wr_ops       __attribute__ ((packed));
+       unsigned long long fopens       __attribute__ ((packed));
+       unsigned long long fcloses      __attribute__ ((packed));
+       unsigned long long fdeletes     __attribute__ ((packed));
+};
+
+#define CIFS_STATS_SIZE        (sizeof(struct cifs_stats))
+
+struct io_hdr_stats {
+       unsigned int active             __attribute__ ((aligned (4)));
+       unsigned int used               __attribute__ ((packed));
+       char name[MAX_NAME_LEN];
+};
+
+#define IO_HDR_STATS_SIZE      (sizeof(struct io_hdr_stats))
+
+#endif  /* _CIFSIOSTAT_H */
diff --git a/common.c b/common.c
new file mode 100644 (file)
index 0000000..0df2ee8
--- /dev/null
+++ b/common.c
@@ -0,0 +1,600 @@
+/*
+ * sar, sadc, sadf, mpstat and iostat common routines.
+ * (C) 1999-2009 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <errno.h>
+#include <unistd.h>    /* For STDOUT_FILENO, among others */
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include "version.h"
+#include "common.h"
+#include "ioconf.h"
+#include "rd_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+/* Number of ticks per second */
+unsigned int hz;
+/* Number of bit shifts to convert pages to kB */
+unsigned int kb_shift;
+
+/*
+ ***************************************************************************
+ * Print sysstat version number and exit.
+ ***************************************************************************
+ */
+void print_version(void)
+{
+       fprintf(stderr, _("sysstat version %s\n"), VERSION);
+       fprintf(stderr, "(C) Sebastien Godard (sysstat <at> orange.fr)\n");
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * Get local date and time.
+ *
+ * OUT:
+ * @rectime    Current local date and time.
+ *
+ * RETURNS:
+ * Value of time in seconds since the Epoch.
+ ***************************************************************************
+ */
+time_t get_localtime(struct tm *rectime)
+{
+       time_t timer;
+       struct tm *ltm;
+
+       time(&timer);
+       ltm = localtime(&timer);
+
+       *rectime = *ltm;
+       return timer;
+}
+
+/*
+ ***************************************************************************
+ * Get date and time expressed in UTC.
+ *
+ * OUT:
+ * @rectime    Current date and time expressed in UTC.
+ *
+ * RETURNS:
+ * Value of time in seconds since the Epoch.
+ ***************************************************************************
+ */
+time_t get_gmtime(struct tm *rectime)
+{
+       time_t timer;
+       struct tm *ltm;
+
+       time(&timer);
+       ltm = gmtime(&timer);
+
+       *rectime = *ltm;
+       return timer;
+}
+
+/*
+ ***************************************************************************
+ * Get date and time and take into account <ENV_TIME_DEFTM> variable.
+ *
+ * OUT:
+ * @rectime    Current date and time.
+ *
+ * RETURNS:
+ * Value of time in seconds since the Epoch.
+ ***************************************************************************
+ */
+time_t get_time(struct tm *rectime)
+{
+       static int utc = 0;
+       char *e;
+
+       if (!utc) {
+               /* Read environment variable value once */
+               if ((e = getenv(ENV_TIME_DEFTM)) != NULL) {
+                       utc = !strcmp(e, K_UTC);
+               }
+               utc++;
+       }
+       
+       if (utc == 2)
+               return get_gmtime(rectime);
+       else
+               return get_localtime(rectime);
+}
+
+/*
+ ***************************************************************************
+ * Count number of comma-separated values in arguments list. For example,
+ * the number will be 3 for the list "foobar -p 1 -p 2,3,4 2 5".
+ *
+ * IN:
+ * @arg_c      Number of arguments in the list.
+ * @arg_v      Arguments list.
+ *
+ * RETURNS:
+ * Number of comma-separated values in the list.
+ ***************************************************************************
+ */
+int count_csvalues(int arg_c, char **arg_v)
+{
+       int opt = 1;
+       int nr = 0;
+       char *t;
+       
+       while (opt < arg_c) {
+               if (strchr(arg_v[opt], ',')) {
+                       for (t = arg_v[opt]; t; t = strchr(t + 1, ',')) {
+                               nr++;
+                       }
+               }
+               opt++;
+       }
+       
+       return nr;
+}
+
+/*
+ ***************************************************************************
+ * Look for partitions of a given block device in /sys filesystem.
+ *
+ * IN:
+ * @dev_name   Name of the block device.
+ *
+ * RETURNS:
+ * Number of partitions for the given block device.
+ ***************************************************************************
+ */
+int get_dev_part_nr(char *dev_name)
+{
+       DIR *dir;
+       struct dirent *drd;
+       char dfile[MAX_PF_NAME], line[MAX_PF_NAME];
+       int part = 0;
+
+       snprintf(dfile, MAX_PF_NAME, "%s/%s", SYSFS_BLOCK, dev_name);
+       dfile[MAX_PF_NAME - 1] = '\0';
+
+       /* Open current device directory in /sys/block */
+       if ((dir = opendir(dfile)) == NULL)
+               return 0;
+
+       /* Get current file entry */
+       while ((drd = readdir(dir)) != NULL) {
+               if (!strcmp(drd->d_name, ".") || !strcmp(drd->d_name, ".."))
+                       continue;
+               snprintf(line, MAX_PF_NAME, "%s/%s/%s", dfile, drd->d_name, S_STAT);
+               line[MAX_PF_NAME - 1] = '\0';
+
+               /* Try to guess if current entry is a directory containing a stat file */
+               if (!access(line, R_OK)) {
+                       /* Yep... */
+                       part++;
+               }
+       }
+       
+       /* Close directory */
+       closedir(dir);
+
+       return part;
+}
+
+/*
+ ***************************************************************************
+ * Look for block devices present in /sys/ filesystem:
+ * Check first that sysfs is mounted (done by trying to open /sys/block
+ * directory), then find number of devices registered.
+ *
+ * IN:
+ * @display_partitions Set to TRUE if partitions must also be counted.
+ *
+ * RETURNS:
+ * Total number of block devices (and partitions if @display_partitions was
+ * set).
+ ***************************************************************************
+ */
+int get_sysfs_dev_nr(int display_partitions)
+{
+       DIR *dir;
+       struct dirent *drd;
+       char line[MAX_PF_NAME];
+       int dev = 0;
+
+       /* Open /sys/block directory */
+       if ((dir = opendir(SYSFS_BLOCK)) == NULL)
+               /* sysfs not mounted, or perhaps this is an old kernel */
+               return 0;
+
+       /* Get current file entry in /sys/block directory */
+       while ((drd = readdir(dir)) != NULL) {
+               if (!strcmp(drd->d_name, ".") || !strcmp(drd->d_name, ".."))
+                       continue;
+               snprintf(line, MAX_PF_NAME, "%s/%s/%s", SYSFS_BLOCK, drd->d_name, S_STAT);
+               line[MAX_PF_NAME - 1] = '\0';
+
+               /* Try to guess if current entry is a directory containing a stat file */
+               if (!access(line, R_OK)) {
+                       /* Yep... */
+                       dev++;
+       
+                       if (display_partitions) {
+                               /* We also want the number of partitions for this device */
+                               dev += get_dev_part_nr(drd->d_name);
+                       }
+               }
+       }
+
+       /* Close /sys/block directory */
+       closedir(dir);
+
+       return dev;
+}
+
+/*
+ ***************************************************************************
+ * Print banner.
+ *
+ * IN:
+ * @rectime    Date and time to display.
+ * @sysname    System name to display.
+ * @release    System release number to display.
+ * @nodename   Hostname to display.
+ * @machine    Machine architecture to display.
+ * @cpu_nr     Number of CPU.
+ *
+ * RETURNS:
+ * TRUE if S_TIME_FORMAT is set to ISO, or FALSE otherwise.
+ ***************************************************************************
+ */
+int print_gal_header(struct tm *rectime, char *sysname, char *release,
+                    char *nodename, char *machine, int cpu_nr)
+{
+       char cur_date[64];
+       char *e;
+       int rc = 0;
+
+       if (((e = getenv(ENV_TIME_FMT)) != NULL) && !strcmp(e, K_ISO)) {
+               strftime(cur_date, sizeof(cur_date), "%Y-%m-%d", rectime);
+               rc = 1;
+       }
+       else {
+               strftime(cur_date, sizeof(cur_date), "%x", rectime);
+       }
+
+       printf("%s %s (%s) \t%s \t_%s_\t(%d CPU)\n", sysname, release, nodename,
+              cur_date, machine, cpu_nr);
+
+       return rc;
+}
+
+#ifdef USE_NLS
+/*
+ ***************************************************************************
+ * Init National Language Support.
+ ***************************************************************************
+ */
+void init_nls(void)
+{
+       setlocale(LC_MESSAGES, "");
+       setlocale(LC_CTYPE, "");
+       setlocale(LC_TIME, "");
+       setlocale(LC_NUMERIC, "");
+
+       bindtextdomain(PACKAGE, LOCALEDIR);
+       textdomain(PACKAGE);
+}
+#endif
+
+/*
+ ***************************************************************************
+ * Get number of rows for current window.
+ *
+ * RETURNS:
+ * Number of rows.
+ ***************************************************************************
+ */
+int get_win_height(void)
+{
+       struct winsize win;
+       /*
+        * This default value will be used whenever STDOUT
+        * is redirected to a pipe or a file
+        */
+       int rows = 3600 * 24;
+
+       if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) != -1) {
+               if (win.ws_row > 2) {
+                       rows = win.ws_row - 2;
+               }
+       }
+       return rows;
+}
+
+/*
+ ***************************************************************************
+ * Remove /dev from path name.
+ *
+ * IN:
+ * @name       Device name (may begins with "/dev/")
+ *
+ * RETURNS:
+ * Device basename.
+ ***************************************************************************
+ */
+char *device_name(char *name)
+{
+       if (!strncmp(name, "/dev/", 5))
+               return name + 5;
+
+       return name;
+}
+
+/*
+ ***************************************************************************
+ * Test whether given name is a device or a partition, using sysfs.
+ * This is more straightforward that using ioc_iswhole() function from
+ * ioconf.c which should be used only with kernels that don't have sysfs.
+ *
+ * IN:
+ * @name       Device or partition name.
+ *
+ * RETURNS:
+ * TRUE if @name is a (whole) device.
+ ***************************************************************************
+ */
+int is_device(char *name)
+{
+       char syspath[PATH_MAX];
+       char *slash;
+
+       /* Some devices may have a slash in their name (eg. cciss/c0d0...) */
+       while ((slash = strchr(name, '/'))) {
+               *slash = '!';
+       }
+       snprintf(syspath, sizeof(syspath), "%s/%s", SYSFS_BLOCK, name);
+       
+       return !(access(syspath, F_OK));
+}
+
+/*
+ ***************************************************************************
+ * Get page shift in kB.
+ ***************************************************************************
+ */
+void get_kb_shift(void)
+{
+       int shift = 0;
+       long size;
+
+       /* One can also use getpagesize() to get the size of a page */
+       if ((size = sysconf(_SC_PAGESIZE)) == -1) {
+               perror("sysconf");
+       }
+
+       size >>= 10;    /* Assume that a page has a minimum size of 1 kB */
+
+       while (size > 1) {
+               shift++;
+               size >>= 1;
+       }
+
+       kb_shift = (unsigned int) shift;
+}
+
+/*
+ ***************************************************************************
+ * Get number of clock ticks per second.
+ ***************************************************************************
+ */
+void get_HZ(void)
+{
+       long ticks;
+
+       if ((ticks = sysconf(_SC_CLK_TCK)) == -1) {
+               perror("sysconf");
+       }
+
+       hz = (unsigned int) ticks;
+}
+
+/*
+ ***************************************************************************
+ * Handle overflow conditions properly for counters which are read as
+ * unsigned long long, but which can be unsigned long long or
+ * unsigned long only depending on the kernel version used.
+ * @value1 and @value2 being two values successively read for this
+ * counter, if @value2 < @value1 and @value1 <= 0xffffffff, then we can
+ * assume that the counter's type was unsigned long and has overflown, and
+ * so the difference @value2 - @value1 must be casted to this type.
+ * NOTE: These functions should no longer be necessary to handle a particular
+ * stat counter when we can assume that everybody is using a recent kernel
+ * (defining this counter as unsigned long long).
+ ***************************************************************************
+ */
+double ll_sp_value(unsigned long long value1, unsigned long long value2,
+                  unsigned long long itv)
+{
+       if ((value2 < value1) && (value1 <= 0xffffffff))
+               /* Counter's type was unsigned long and has overflown */
+               return ((double) ((value2 - value1) & 0xffffffff)) / itv * 100;
+       else
+               return SP_VALUE(value1, value2, itv);
+}
+
+double ll_s_value(unsigned long long value1, unsigned long long value2,
+                 unsigned long long itv)
+{
+       if ((value2 < value1) && (value1 <= 0xffffffff))
+               /* Counter's type was unsigned long and has overflown */
+               return ((double) ((value2 - value1) & 0xffffffff)) / itv * HZ;
+       else
+               return S_VALUE(value1, value2, itv);
+}
+
+/*
+ ***************************************************************************
+ * Compute time interval.
+ *
+ * IN:
+ * @prev_uptime        Previous uptime value in jiffies.
+ * @curr_uptime        Current uptime value in jiffies.
+ *
+ * RETURNS:
+ * Interval of time in jiffies.
+ ***************************************************************************
+ */
+unsigned long long get_interval(unsigned long long prev_uptime,
+                               unsigned long long curr_uptime)
+{
+       unsigned long long itv;
+
+       /* prev_time=0 when displaying stats since system startup */
+       itv = curr_uptime - prev_uptime;
+       
+       if (!itv) {     /* Paranoia checking */
+               itv = 1;
+       }
+
+       return itv;
+}
+
+/*
+ ***************************************************************************
+ * Since ticks may vary slightly from CPU to CPU, we'll want
+ * to recalculate itv based on this CPU's tick count, rather
+ * than that reported by the "cpu" line. Otherwise we
+ * occasionally end up with slightly skewed figures, with
+ * the skew being greater as the time interval grows shorter.
+ *
+ * IN:
+ * @scc        Current sample statistics for current CPU.
+ * @scp        Previous sample statistics for current CPU.
+ *
+ * RETURNS:
+ * Interval of time based on current CPU.
+ ***************************************************************************
+ */
+unsigned long long get_per_cpu_interval(struct stats_cpu *scc,
+                                       struct stats_cpu *scp)
+{
+       /* Don't take cpu_guest into account because cpu_user already includes it */
+       return ((scc->cpu_user    + scc->cpu_nice   +
+                scc->cpu_sys     + scc->cpu_iowait +
+                scc->cpu_idle    + scc->cpu_steal  +
+                scc->cpu_hardirq + scc->cpu_softirq) -
+               (scp->cpu_user    + scp->cpu_nice   +
+                scp->cpu_sys     + scp->cpu_iowait +
+                scp->cpu_idle    + scp->cpu_steal  +
+                scp->cpu_hardirq + scp->cpu_softirq));
+}
+
+/*
+ ***************************************************************************
+ * Unhandled situation: Panic and exit.
+ *
+ * IN:
+ * @function   Function name where situation occured.
+ * @error_code Error code.
+ ***************************************************************************
+ */
+void sysstat_panic(const char *function, int error_code)
+{
+       fprintf(stderr, "sysstat: %s[%d]: Last chance handler...\n",
+               function, error_code);
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * Count number of bits set in an array.
+ *
+ * IN:
+ * @ptr                Pointer to array.
+ * @size       Size of array in bytes.
+ *
+ * RETURNS:
+ * Number of bits set in the array.
+ ***************************************************************************
+*/
+int count_bits(void *ptr, int size)
+{
+       int nr = 0, i, k;
+       char *p;
+
+       p = ptr;
+       for (i = 0; i < size; i++, p++) {
+               k = 0x80;
+               while (k) {
+                       if (*p & k)
+                               nr++;
+                       k >>= 1;
+               }
+       }
+
+       return nr;
+}
+
+/*
+ ***************************************************************************
+ * Compute "extended" device statistics (service time, etc.).
+ *
+ * IN:
+ * @sdc                Structure with current device statistics.
+ * @sdp                Structure with previous device statistics.
+ * @itv                Interval of time in jiffies.
+ *
+ * OUT:
+ * @xds                Structure with extended statistics.
+ ***************************************************************************
+*/
+void compute_ext_disk_stats(struct stats_disk *sdc, struct stats_disk *sdp,
+                           unsigned long long itv, struct ext_disk_stats *xds)
+{
+       double tput
+               = ((double) (sdc->nr_ios - sdp->nr_ios)) * HZ / itv;
+       
+       xds->util  = S_VALUE(sdp->tot_ticks, sdc->tot_ticks, itv);
+       xds->svctm = tput ? xds->util / tput : 0.0;
+       /*
+        * Kernel gives ticks already in milliseconds for all platforms
+        * => no need for further scaling.
+        */
+       xds->await = (sdc->nr_ios - sdp->nr_ios) ?
+               ((sdc->rd_ticks - sdp->rd_ticks) + (sdc->wr_ticks - sdp->wr_ticks)) /
+               ((double) (sdc->nr_ios - sdp->nr_ios)) : 0.0;
+       xds->arqsz = (sdc->nr_ios - sdp->nr_ios) ?
+               ((sdc->rd_sect - sdp->rd_sect) + (sdc->wr_sect - sdp->wr_sect)) /
+               ((double) (sdc->nr_ios - sdp->nr_ios)) : 0.0;
+}
diff --git a/common.h b/common.h
new file mode 100644 (file)
index 0000000..f206e5f
--- /dev/null
+++ b/common.h
@@ -0,0 +1,194 @@
+/*
+ * sysstat: System performance tools for Linux
+ * (C) 1999-2010 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _COMMON_H
+#define _COMMON_H
+
+/* Maximum length of sensors device name */
+#define MAX_SENSORS_DEV_LEN    20
+
+#include <time.h>
+#include <sched.h>     /* For __CPU_SETSIZE */
+#include "rd_stats.h"
+
+
+/*
+ ***************************************************************************
+ * Various keywords and constants
+ ***************************************************************************
+ */
+
+#define FALSE  0
+#define TRUE   1
+
+#define DISP_HDR       1
+
+/* Maximum number of CPUs */
+#ifdef __CPU_SETSIZE
+#define NR_CPUS                __CPU_SETSIZE
+#else
+#define NR_CPUS                1024
+#endif
+
+/* Maximum number of interrupts */
+#define NR_IRQS                        256
+
+/* Size of /proc/interrupts line, CPU data excluded */
+#define INTERRUPTS_LINE        128
+
+/* Keywords */
+#define K_ISO  "ISO"
+#define K_ALL  "ALL"
+#define K_UTC  "UTC"
+
+/* Files */
+#define STAT           "/proc/stat"
+#define UPTIME         "/proc/uptime"
+#define PPARTITIONS    "/proc/partitions"
+#define DISKSTATS      "/proc/diskstats"
+#define INTERRUPTS     "/proc/interrupts"
+#define MEMINFO                "/proc/meminfo"
+#define SYSFS_BLOCK    "/sys/block"
+#define SYSFS_DEVCPU   "/sys/devices/system/cpu"
+#define S_STAT         "stat"
+#define DEVMAP_DIR     "/dev/mapper"
+
+#define MAX_FILE_LEN   256
+#define MAX_PF_NAME    1024
+#define DEVMAP_MAJOR   253
+#define MAX_NAME_LEN   72
+
+#define NR_DISKS       4
+
+/* Environment variables */
+#define ENV_TIME_FMT   "S_TIME_FORMAT"
+#define ENV_TIME_DEFTM "S_TIME_DEF_TIME"
+
+#define DIGITS         "0123456789"
+
+
+/*
+ ***************************************************************************
+ * Macro functions definitions.
+ ***************************************************************************
+ */
+
+/* Allocate and init structure */
+#define SREALLOC(S, TYPE, SIZE)        do {                                                             \
+                                       TYPE *_p_;                                               \
+                                       _p_ = S;                                                 \
+                                       if (SIZE) {                                              \
+                                               if ((S = (TYPE *) realloc(S, (SIZE))) == NULL) { \
+                                                       perror("realloc");                       \
+                                                       exit(4);                                 \
+                                               }                                                \
+                                               /* If the ptr was null, then it's a malloc() */  \
+                                               if (!_p_)                                        \
+                                                       memset(S, 0, (SIZE));                    \
+                                       }                                                        \
+                               } while (0)
+
+/*
+ * Macros used to display statistics values.
+ *
+ * NB: Define SP_VALUE() to normalize to %;
+ * HZ is 1024 on IA64 and % should be normalized to 100.
+ */
+#define S_VALUE(m,n,p) (((double) ((n) - (m))) / (p) * HZ)
+#define SP_VALUE(m,n,p)        (((double) ((n) - (m))) / (p) * 100)
+
+/*
+ * Under very special circumstances, STDOUT may become unavailable.
+ * This is what we try to guess here
+ */
+#define TEST_STDOUT(_fd_)      do {                                    \
+                                       if (write(_fd_, "", 0) == -1) { \
+                                               perror("stdout");       \
+                                               exit(6);                \
+                                       }                               \
+                               } while (0)
+
+
+#define MINIMUM(a,b)   ((a) < (b) ? (a) : (b))
+
+#define PANIC(m)       sysstat_panic(__FUNCTION__, m)
+
+
+/* Number of ticks per second */
+#define HZ             hz
+extern unsigned int hz;
+
+/* Number of bit shifts to convert pages to kB */
+extern unsigned int kb_shift;
+
+/*
+ * kB <-> number of pages.
+ * Page size depends on machine architecture (4 kB, 8 kB, 16 kB, 64 kB...)
+ */
+#define KB_TO_PG(k)    ((k) >> kb_shift)
+#define PG_TO_KB(k)    ((k) << kb_shift)
+
+/*
+ ***************************************************************************
+ * Structures definitions
+ ***************************************************************************
+ */
+
+/* Structure used for extended disk statistics */
+struct ext_disk_stats {
+       double util;
+       double await;
+       double svctm;
+       double arqsz;
+};
+
+
+/*
+ ***************************************************************************
+ * Functions prototypes
+ ***************************************************************************
+ */
+
+extern void
+       compute_ext_disk_stats(struct stats_disk *, struct stats_disk *,
+                              unsigned long long, struct ext_disk_stats *);
+extern int
+       count_bits(void *, int);
+extern int
+       count_csvalues(int, char **);
+extern char *
+       device_name(char *);
+extern void
+       get_HZ(void);
+extern unsigned long long
+       get_interval(unsigned long long, unsigned long long);
+extern void
+       get_kb_shift(void);
+extern time_t
+       get_localtime(struct tm *);
+extern time_t
+       get_time(struct tm *);
+unsigned long long
+       get_per_cpu_interval(struct stats_cpu *, struct stats_cpu *);
+extern int
+       get_sysfs_dev_nr(int);
+extern int
+       get_win_height(void);
+extern void
+       init_nls(void);
+extern int
+       is_device(char *);
+extern double
+       ll_s_value(unsigned long long, unsigned long long, unsigned long long);
+extern double
+       ll_sp_value(unsigned long long, unsigned long long, unsigned long long);
+extern int
+       print_gal_header(struct tm *, char *, char *, char *, char *, int);
+extern void
+       print_version(void);
+extern void
+       sysstat_panic(const char *, int);
+
+#endif  /* _COMMON_H */
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..27e19f4
--- /dev/null
+++ b/configure
@@ -0,0 +1,8949 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.63 for sysstat 9.1.5.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+       do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+       done
+       export CONFIG_SHELL
+       exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell bug-autoconf@gnu.org about your system,
+  echo including any error possibly output before this message.
+  echo This can help us improve future autoconf versions.
+  echo Configuration will now proceed without shell functions.
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='sysstat'
+PACKAGE_TARNAME='sysstat'
+PACKAGE_VERSION='9.1.5'
+PACKAGE_STRING='sysstat 9.1.5'
+PACKAGE_BUGREPORT=''
+
+ac_unique_file="ioconf.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+DFLAGS
+WITH_DEBUG
+AuxMandir
+INSTALL_DOC
+REM_CHOWN
+QUOTE
+CRON_COUNT
+CRON_INTERVAL_SEC
+CRON_INTERVAL
+SU_C_OWNER
+CRON_OWNER
+cron_interval
+cron_owner
+INSTALL_CRON
+CLEAN_SA_DIR
+INSTALL_ISAG
+COMPRESS_MANPG
+IGNORE_MAN_GROUP
+MAN_GROUP
+man_group
+COMPRESSAFTER
+compressafter
+HISTORY
+history
+YESTERDAY
+NLS
+SYSCONFIG_DIR
+conf_dir
+SA_DIR
+sa_dir
+SA_LIB_DIR
+sa_lib_dir
+INITD_DIR
+INIT_DIR
+RC_DIR
+rcdir
+HAVE_SENSORS
+PATH_CHKCONFIG
+PATH_CP
+INSTALL_BIN
+INSTALL_DATA
+ZIP
+MSGMERGE
+XGETTEXT
+MSGFMT
+INSTALL
+AR
+CHOWN
+CHMOD
+LN_S
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_sensors
+enable_largefile
+enable_nls
+enable_yesterday
+enable_man_group
+enable_compress_manpg
+enable_install_isag
+enable_clean_sa_dir
+enable_install_cron
+enable_documentation
+enable_debuginfo
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+rcdir
+sa_lib_dir
+sa_dir
+conf_dir
+history
+compressafter
+man_group
+cron_owner
+cron_interval'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+   { (exit 1); exit 1; }; }
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { $as_echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+   { (exit 1); exit 1; }; } ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { $as_echo "$as_me: error: working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures sysstat 9.1.5 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/sysstat]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of sysstat 9.1.5:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-sensors       disable sensors support
+  --disable-largefile     omit support for large files
+  --disable-nls           disable National Language Support
+  --enable-yesterday      tell sa2 to use data file of the day before
+  --disable-man-group     ignore man_group variable value
+  --enable-compress-manpg compress sysstat manual pages
+  --enable-install-isag   install isag script
+  --enable-clean-sa-dir   clean system activity directory
+  --enable-install-cron   install a crontab to start sar
+  --disable-documentation do not install documentation
+  --enable-debuginfo      enable debug output (--debuginfo option)
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  rcdir       run-commands directory
+  sa_lib_dir  sadc directory
+  sa_dir      system activity directory
+  conf_dir    sysstat configuration directory
+  history     number of daily data files to keep (default value is 7)
+  compressafter
+              number of days after which data files are compressed (default
+              value is 10)
+  man_group   group for manual pages
+  cron_owner  crontab owner
+  cron_interval
+              crontab interval
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+sysstat configure 9.1.5
+generated by GNU Autoconf 2.63
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by sysstat $as_me 9.1.5, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  $as_echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test -r "$ac_site_file"; then
+    { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Ensure that a recent enough version of Autoconf is being used
+
+
+# Check whether the configure script is in the right dir
+
+
+# Check programs
+echo .
+echo Check programs:
+echo .
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+if test -z "$ac_file"; then
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:$LINENO: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:$LINENO: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -rf conftest.dSYM
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+  if test "${ac_cv_header_minix_config_h+set}" = set; then
+  { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5
+$as_echo_n "checking for minix/config.h... " >&6; }
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+$as_echo "$ac_cv_header_minix_config_h" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5
+$as_echo_n "checking minix/config.h usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <minix/config.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5
+$as_echo_n "checking minix/config.h presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <minix/config.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: minix/config.h:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: minix/config.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5
+$as_echo_n "checking for minix/config.h... " >&6; }
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_header_minix_config_h=$ac_header_preproc
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+$as_echo "$ac_cv_header_minix_config_h" >&6; }
+
+fi
+if test "x$ac_cv_header_minix_config_h" = x""yes; then
+  MINIX=yes
+else
+  MINIX=
+fi
+
+
+  if test "$MINIX" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_SOURCE 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_1_SOURCE 2
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _MINIX 1
+_ACEOF
+
+  fi
+
+
+
+  { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5
+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if test "${ac_cv_safe_to_define___extensions__+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#        define __EXTENSIONS__ 1
+         $ac_includes_default
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_safe_to_define___extensions__=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_safe_to_define___extensions__=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5
+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
+  test $ac_cv_safe_to_define___extensions__ = yes &&
+    cat >>confdefs.h <<\_ACEOF
+#define __EXTENSIONS__ 1
+_ACEOF
+
+  cat >>confdefs.h <<\_ACEOF
+#define _ALL_SOURCE 1
+_ACEOF
+
+  cat >>confdefs.h <<\_ACEOF
+#define _GNU_SOURCE 1
+_ACEOF
+
+  cat >>confdefs.h <<\_ACEOF
+#define _POSIX_PTHREAD_SEMANTICS 1
+_ACEOF
+
+  cat >>confdefs.h <<\_ACEOF
+#define _TANDEM_SOURCE 1
+_ACEOF
+
+
+{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+
+# Extract the first word of "chmod", so it can be a program name with args.
+set dummy chmod; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CHMOD+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CHMOD"; then
+  ac_cv_prog_CHMOD="$CHMOD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CHMOD="chmod"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CHMOD=$ac_cv_prog_CHMOD
+if test -n "$CHMOD"; then
+  { $as_echo "$as_me:$LINENO: result: $CHMOD" >&5
+$as_echo "$CHMOD" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "chown", so it can be a program name with args.
+set dummy chown; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CHOWN+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CHOWN"; then
+  ac_cv_prog_CHOWN="$CHOWN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CHOWN="chown"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CHOWN=$ac_cv_prog_CHOWN
+if test -n "$CHOWN"; then
+  { $as_echo "$as_me:$LINENO: result: $CHOWN" >&5
+$as_echo "$CHOWN" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="ar"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:$LINENO: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "install", so it can be a program name with args.
+set dummy install; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_INSTALL+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$INSTALL"; then
+  ac_cv_prog_INSTALL="$INSTALL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_INSTALL="install"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+INSTALL=$ac_cv_prog_INSTALL
+if test -n "$INSTALL"; then
+  { $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_MSGFMT+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MSGFMT"; then
+  ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_MSGFMT="msgfmt"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+MSGFMT=$ac_cv_prog_MSGFMT
+if test -n "$MSGFMT"; then
+  { $as_echo "$as_me:$LINENO: result: $MSGFMT" >&5
+$as_echo "$MSGFMT" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_XGETTEXT+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$XGETTEXT"; then
+  ac_cv_prog_XGETTEXT="$XGETTEXT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_XGETTEXT="xgettext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+XGETTEXT=$ac_cv_prog_XGETTEXT
+if test -n "$XGETTEXT"; then
+  { $as_echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_MSGMERGE+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MSGMERGE"; then
+  ac_cv_prog_MSGMERGE="$MSGMERGE" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_MSGMERGE="msgmerge"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+MSGMERGE=$ac_cv_prog_MSGMERGE
+if test -n "$MSGMERGE"; then
+  { $as_echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+$as_echo "$MSGMERGE" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+for ac_prog in bzip2 gzip
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ZIP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ZIP"; then
+  ac_cv_prog_ZIP="$ZIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin /etc /sbin /usr/bin /usr/etc /usr/sbin /usr/ucb /usr/local/bin /usr/local/etc /usr/local/sbin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ZIP="$ac_prog"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ZIP=$ac_cv_prog_ZIP
+if test -n "$ZIP"; then
+  { $as_echo "$as_me:$LINENO: result: $ZIP" >&5
+$as_echo "$ZIP" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ZIP" && break
+done
+test -n "$ZIP" || ZIP="gzip"
+
+INSTALL_DATA="\${INSTALL} -m 644"
+
+INSTALL_BIN="\${INSTALL} -m 755"
+
+
+for ac_prog in cp
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_PATH_CP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $PATH_CP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PATH_CP="$PATH_CP" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin /etc /sbin /usr/bin /usr/etc /usr/sbin /usr/ucb /usr/local/bin /usr/local/etc /usr/local/sbin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PATH_CP="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PATH_CP=$ac_cv_path_PATH_CP
+if test -n "$PATH_CP"; then
+  { $as_echo "$as_me:$LINENO: result: $PATH_CP" >&5
+$as_echo "$PATH_CP" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PATH_CP" && break
+done
+test -n "$PATH_CP" || PATH_CP="cp"
+
+for ac_prog in chkconfig
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_PATH_CHKCONFIG+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  case $PATH_CHKCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PATH_CHKCONFIG="$PATH_CHKCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin /etc /sbin /usr/bin /usr/etc /usr/sbin /usr/ucb /usr/local/bin /usr/local/etc /usr/local/sbin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PATH_CHKCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PATH_CHKCONFIG=$ac_cv_path_PATH_CHKCONFIG
+if test -n "$PATH_CHKCONFIG"; then
+  { $as_echo "$as_me:$LINENO: result: $PATH_CHKCONFIG" >&5
+$as_echo "$PATH_CHKCONFIG" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PATH_CHKCONFIG" && break
+done
+test -n "$PATH_CHKCONFIG" || PATH_CHKCONFIG="chkconfig"
+
+
+# Check libraries
+
+# Check header files
+echo .
+echo Check header files:
+echo .
+HAVE_LIBINTL_H=
+HAVE_LOCALE_H=
+{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -rf conftest.dSYM
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  { $as_echo "$as_me:$LINENO: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if test "${ac_cv_search_opendir+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_search_opendir=$ac_res
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_opendir+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_opendir+set}" = set; then
+  :
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+  { $as_echo "$as_me:$LINENO: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if test "${ac_cv_search_opendir+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_search_opendir=$ac_res
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_opendir+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_opendir+set}" = set; then
+  :
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+
+for ac_header in ctype.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in errno.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in libintl.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ HAVE_LIBINTL_H=1
+fi
+
+done
+
+
+for ac_header in locale.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ HAVE_LOCALE_H=1
+fi
+
+done
+
+
+for ac_header in net/if.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in regex.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in signal.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in stdio.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in sys/file.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in sys/ioctl.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in sys/stat.h
+do
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+fi
+as_val=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo .
+echo Check typedefs, structures and compiler characteristics:
+echo .
+{ $as_echo "$as_me:$LINENO: checking return type of signal handlers" >&5
+$as_echo_n "checking return type of signal handlers... " >&6; }
+if test "${ac_cv_type_signal+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_signal=int
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_signal=void
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5
+$as_echo "$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+{ $as_echo "$as_me:$LINENO: checking for size_t" >&5
+$as_echo_n "checking for size_t... " >&6; }
+if test "${ac_cv_type_size_t+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_type_size_t=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if (sizeof (size_t))
+       return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if (sizeof ((size_t)))
+         return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_size_t=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+$as_echo "$ac_cv_type_size_t" >&6; }
+if test "x$ac_cv_type_size_t" = x""yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for off_t" >&5
+$as_echo_n "checking for off_t... " >&6; }
+if test "${ac_cv_type_off_t+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_type_off_t=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if (sizeof (off_t))
+       return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if (sizeof ((off_t)))
+         return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_off_t=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+$as_echo "$ac_cv_type_off_t" >&6; }
+if test "x$ac_cv_type_off_t" = x""yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
+
+fi
+
+
+echo .
+echo Check library functions:
+echo .
+
+for ac_func in strchr
+do
+as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+$as_echo_n "checking for $ac_func... " >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  eval "$as_ac_var=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strcspn
+do
+as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+$as_echo_n "checking for $ac_func... " >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  eval "$as_ac_var=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strspn
+do
+as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+$as_echo_n "checking for $ac_func... " >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  eval "$as_ac_var=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strstr
+do
+as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+$as_echo_n "checking for $ac_func... " >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  eval "$as_ac_var=yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+# Should we check for lm_sensors?
+{ $as_echo "$as_me:$LINENO: checking for sensors support" >&5
+$as_echo_n "checking for sensors support... " >&6; }
+# Check whether --enable-sensors was given.
+if test "${enable_sensors+set}" = set; then
+  enableval=$enable_sensors; SENSORS=$enableval
+else
+  SENSORS=yes
+fi
+
+if test $SENSORS != "yes"; then
+   CFSENSORS=""
+   DFSENSORS=""
+else
+   CFSENSORS="-lsensors"
+   DFSENSORS="-DHAVE_SENSORS"
+fi
+{ $as_echo "$as_me:$LINENO: result: $SENSORS" >&5
+$as_echo "$SENSORS" >&6; }
+
+# Check for lm_sensors
+HAVE_SENSORS=no
+DFLAGS=""
+{ $as_echo "$as_me:$LINENO: checking for sensors_get_detected_chips in -lsensors" >&5
+$as_echo_n "checking for sensors_get_detected_chips in -lsensors... " >&6; }
+if test "${ac_cv_lib_sensors_sensors_get_detected_chips+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsensors  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sensors_get_detected_chips ();
+int
+main ()
+{
+return sensors_get_detected_chips ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then
+  ac_cv_lib_sensors_sensors_get_detected_chips=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_sensors_sensors_get_detected_chips=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_sensors_sensors_get_detected_chips" >&5
+$as_echo "$ac_cv_lib_sensors_sensors_get_detected_chips" >&6; }
+if test "x$ac_cv_lib_sensors_sensors_get_detected_chips" = x""yes; then
+  CFLAGS="${CFLAGS} ${CFSENSORS}"
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for sensors lib" >&5
+$as_echo_n "checking for sensors lib... " >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sensors/sensors.h>
+#include <sensors/error.h>
+
+int
+main ()
+{
+sensors_cleanup();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  HAVE_SENSORS=yes; DFLAGS="${DFLAGS} ${DFSENSORS}"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       HAVE_SENSORS=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:$LINENO: result: $HAVE_SENSORS" >&5
+$as_echo "$HAVE_SENSORS" >&6; }
+
+
+echo .
+echo Check system services:
+echo .
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if test "${ac_cv_sys_largefile_CC+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+        # IRIX 6.2 and later do not support large files by default,
+        # so use the C compiler's -n32 option if that helps.
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+        rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  break
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+        CC="$CC -n32"
+        rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_sys_largefile_CC=' -n32'; break
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+        break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_sys_file_offset_bits=no; break
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_sys_file_offset_bits=64; break
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if test "${ac_cv_sys_large_files+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_sys_large_files=no; break
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_sys_large_files=1; break
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+fi
+
+
+echo .
+echo Check configuration:
+echo .
+# Check arguments used
+#
+# Optional Features:
+#  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+#  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+#  --disable-largefile     omit support for large files
+#  --disable-nls           disable National Language Support
+#  --enable-yesterday      tell sa2 to use "yesterday" data files
+#  --disable-man-group     ignore man_group variable value
+#  --enable-install-cron   tell sysstat to install cron scripts
+#  --enable-clean-sa-dir   clean system activity directory
+#  --enable-compress-manpg compress manual pages
+#  --enable-install-isag   install isag script
+#  --enable-debuginfo      enable debug output (--debuginfo option)
+#  --disable-documentation do not install documentation (man pages...)
+#  --disable-sensors      do not link against libsensors even if available
+#
+# Some influential environment variables:
+#  rcdir        directory where startup scripts are installed
+#  sa_lib_dir    sadc, sa1 and sa2 directory
+#  sa_dir        system activity daily datafiles directory
+#  conf_dir     sysstat configuration directory (default is /etc/sysconfig)
+#  history       number of daily datafiles to keep (default value is 7)
+#  compressafter number of days after which datafiles are compressed
+#  man_group     group for man pages
+#  cron_owner    crontab owner
+#  cron_interval crontab sampling interval
+#
+# Fine tuning the installation directories:
+#  --mandir=DIR           man documentation directory [PREFIX/man]
+#  --docdir=DIR                  other documentation directory [PREFIX/share/doc]
+#
+# Installation directories:
+#  --prefix=PREFIX         install architecture-independent files in PREFIX
+#                            [/usr/local]
+#  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+#                            [PREFIX]
+
+# Set directories
+if test -d /etc/init.d && test ! -L /etc/init.d; then
+   if test -d /etc/init.d/rc2.d; then
+      RC_DIR=/etc/init.d
+      INITD_DIR=.
+   else
+      RC_DIR=/etc
+      INITD_DIR=init.d
+   fi
+   INIT_DIR=/etc/init.d
+elif test -d /sbin/init.d; then
+   RC_DIR=/sbin/init.d
+   INIT_DIR=/sbin/init.d
+   INITD_DIR=.
+else
+   RC_DIR=/etc/rc.d
+   INIT_DIR=/etc/rc.d/init.d
+   INITD_DIR=init.d
+fi
+
+{ $as_echo "$as_me:$LINENO: checking run-commands directory" >&5
+$as_echo_n "checking run-commands directory... " >&6; }
+
+if test x$rcdir != x""; then
+       # Override previous rc directories values
+       RC_DIR=$rcdir
+       INIT_DIR=$rcdir/init.d
+       INITD_DIR=init.d
+fi
+{ $as_echo "$as_me:$LINENO: result: $RC_DIR" >&5
+$as_echo "$RC_DIR" >&6; }
+if test ! -d $RC_DIR; then
+       echo "INFO: Directory ${RC_DIR} doesn't exist."
+       echo "INFO: Startup scripts won't be installed."
+fi
+
+
+
+
+
+# Set sadc directory
+if test $prefix != "NONE"; then
+   AuxPrefix=$prefix
+else
+   AuxPrefix=/usr/local
+fi
+
+if test -d $AuxPrefix/lib; then
+   SADC_DIR=$AuxPrefix/lib
+elif test -d $AuxPrefix/lib64; then
+   SADC_DIR=$AuxPrefix/lib64
+else
+   SADC_DIR=$AuxPrefix/lib
+fi
+
+{ $as_echo "$as_me:$LINENO: checking sadc directory" >&5
+$as_echo_n "checking sadc directory... " >&6; }
+
+if test x$sa_lib_dir != x""; then
+   SA_LIB_DIR=$sa_lib_dir
+else
+   SA_LIB_DIR=$SADC_DIR/sa
+fi
+{ $as_echo "$as_me:$LINENO: result: $SA_LIB_DIR" >&5
+$as_echo "$SA_LIB_DIR" >&6; }
+if test ! -d $SA_LIB_DIR; then
+   echo "INFO: Directory ${SA_LIB_DIR} will be created during installation stage."
+fi
+
+
+# Set system activity directory
+{ $as_echo "$as_me:$LINENO: checking system activity directory" >&5
+$as_echo_n "checking system activity directory... " >&6; }
+
+if test x$sa_dir != x""; then
+   SA_DIR=$sa_dir
+else
+   SA_DIR=/var/log/sa
+fi
+{ $as_echo "$as_me:$LINENO: result: $SA_DIR" >&5
+$as_echo "$SA_DIR" >&6; }
+if test ! -d $SA_DIR; then
+   echo "INFO: Directory ${SA_DIR} will be created during installation stage."
+fi
+
+
+# Set configuration directory
+{ $as_echo "$as_me:$LINENO: checking sysstat configuration directory" >&5
+$as_echo_n "checking sysstat configuration directory... " >&6; }
+
+if test x$conf_dir != x""; then
+   SYSCONFIG_DIR=$conf_dir
+else
+   SYSCONFIG_DIR=/etc/sysconfig
+fi
+{ $as_echo "$as_me:$LINENO: result: $SYSCONFIG_DIR" >&5
+$as_echo "$SYSCONFIG_DIR" >&6; }
+if test ! -d $SYSCONFIG_DIR; then
+   echo "INFO: Directory ${SYSCONFIG_DIR} will be created during installation stage."
+fi
+
+
+# National Language Support
+{ $as_echo "$as_me:$LINENO: checking National Language Support" >&5
+$as_echo_n "checking National Language Support... " >&6; }
+# Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls; AUX_NLS=$enableval
+else
+  AUX_NLS=yes
+fi
+
+if test $AUX_NLS != "no" && test $HAVE_LIBINTL_H && test $HAVE_LOCALE_H; then
+   AUX_NLS="yes"
+   NLS="y"
+else
+   AUX_NLS="no"
+   NLS="n"
+fi
+{ $as_echo "$as_me:$LINENO: result: $AUX_NLS" >&5
+$as_echo "$AUX_NLS" >&6; }
+
+if test $AUX_NLS = "yes" &&  test x$MSGFMT != x"msgfmt"; then
+   echo "WARNING: msgfmt command not found!"
+fi
+if test $AUX_NLS = "yes" &&  test x$XGETTEXT != x"xgettext"; then
+   echo "WARNING: xgettext command not found!"
+fi
+if test $AUX_NLS = "yes" &&  test x$MSGMERGE != x"msgmerge"; then
+   echo "WARNING: msgmerge command not found!"
+fi
+
+# Check whether sa2 should process data file of the day before
+{ $as_echo "$as_me:$LINENO: checking whether sa2 should process data file of the day before" >&5
+$as_echo_n "checking whether sa2 should process data file of the day before... " >&6; }
+# Check whether --enable-yesterday was given.
+if test "${enable_yesterday+set}" = set; then
+  enableval=$enable_yesterday; AUX_YESTERDAY=$enableval
+else
+  AUX_YESTERDAY=no
+fi
+
+if test $AUX_YESTERDAY = "yes"; then
+   YESTERDAY="--date=yesterday"
+   { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+   YESTERDAY=""
+   { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Data history to keep by sa2
+{ $as_echo "$as_me:$LINENO: checking number of daily data files to keep" >&5
+$as_echo_n "checking number of daily data files to keep... " >&6; }
+
+if test x$history = x""; then
+   HISTORY=7
+else
+   HISTORY=$history
+fi
+{ $as_echo "$as_me:$LINENO: result: $HISTORY" >&5
+$as_echo "$HISTORY" >&6; }
+
+
+# Number of days after which datafiles are compressed
+{ $as_echo "$as_me:$LINENO: checking number of days after which data files are compressed" >&5
+$as_echo_n "checking number of days after which data files are compressed... " >&6; }
+
+if test x$compressafter = x""; then
+   COMPRESSAFTER=10
+else
+   COMPRESSAFTER=$compressafter
+fi
+{ $as_echo "$as_me:$LINENO: result: $COMPRESSAFTER" >&5
+$as_echo "$COMPRESSAFTER" >&6; }
+
+
+# Manual page group
+if `grep ^man: /etc/group >/dev/null 2>&1`; then
+   GRP=man
+else
+   GRP=root
+fi
+
+{ $as_echo "$as_me:$LINENO: checking group for manual pages" >&5
+$as_echo_n "checking group for manual pages... " >&6; }
+
+if test x$man_group = x""; then
+   MAN_GROUP=$GRP
+   { $as_echo "$as_me:$LINENO: result: $MAN_GROUP" >&5
+$as_echo "$MAN_GROUP" >&6; }
+else
+   if !(`grep ^$man_group: /etc/group >/dev/null 2>&1`); then
+      MAN_GROUP=$GRP
+      { $as_echo "$as_me:$LINENO: result: $MAN_GROUP" >&5
+$as_echo "$MAN_GROUP" >&6; }
+      echo "WARNING: Group ${man_group} not found: Using ${GRP} instead"
+   else
+      MAN_GROUP=$man_group
+      { $as_echo "$as_me:$LINENO: result: $MAN_GROUP" >&5
+$as_echo "$MAN_GROUP" >&6; }
+   fi
+fi
+
+
+# Ignore manual pages group?
+{ $as_echo "$as_me:$LINENO: checking whether man_group variable should be ignored" >&5
+$as_echo_n "checking whether man_group variable should be ignored... " >&6; }
+# Check whether --enable-man-group was given.
+if test "${enable_man_group+set}" = set; then
+  enableval=$enable_man_group; AUX_IMG=$enableval
+else
+  AUX_IMG=no
+fi
+
+if test $AUX_IMG != "yes"; then
+   IGNORE_MAN_GROUP=n
+   AUX_IMG=no
+else
+   IGNORE_MAN_GROUP=y
+fi
+{ $as_echo "$as_me:$LINENO: result: $AUX_IMG" >&5
+$as_echo "$AUX_IMG" >&6; }
+
+
+# Compress manual pages?
+{ $as_echo "$as_me:$LINENO: checking whether manual pages should be compressed" >&5
+$as_echo_n "checking whether manual pages should be compressed... " >&6; }
+# Check whether --enable-compress-manpg was given.
+if test "${enable_compress_manpg+set}" = set; then
+  enableval=$enable_compress_manpg; AUX_MPG=$enableval
+else
+  AUX_MPG=no
+fi
+
+if test $AUX_MPG != "yes"; then
+   COMPRESS_MANPG=n
+   AUX_MPG=no
+else
+   COMPRESS_MANPG=y
+fi
+{ $as_echo "$as_me:$LINENO: result: $AUX_MPG" >&5
+$as_echo "$AUX_MPG" >&6; }
+
+
+# Check whether isag should be installed
+{ $as_echo "$as_me:$LINENO: checking whether isag script should be installed" >&5
+$as_echo_n "checking whether isag script should be installed... " >&6; }
+# Check whether --enable-install-isag was given.
+if test "${enable_install_isag+set}" = set; then
+  enableval=$enable_install_isag; AUX_IIS=$enableval
+else
+  AUX_IIS=no
+fi
+
+if test $AUX_IIS != "yes"; then
+   INSTALL_ISAG=n
+   AUX_IIS=no
+else
+   INSTALL_ISAG=y
+fi
+{ $as_echo "$as_me:$LINENO: result: $AUX_IIS" >&5
+$as_echo "$AUX_IIS" >&6; }
+
+
+# Check whether sa directory should be cleaned
+{ $as_echo "$as_me:$LINENO: checking whether system activity directory should be cleaned" >&5
+$as_echo_n "checking whether system activity directory should be cleaned... " >&6; }
+# Check whether --enable-clean-sa-dir was given.
+if test "${enable_clean_sa_dir+set}" = set; then
+  enableval=$enable_clean_sa_dir; AUX_CSD=$enableval
+else
+  AUX_CSD=no
+fi
+
+if test $AUX_CSD != "yes"; then
+   CLEAN_SA_DIR=n
+   AUX_CSD=no
+else
+   CLEAN_SA_DIR=y
+fi
+{ $as_echo "$as_me:$LINENO: result: $AUX_CSD" >&5
+$as_echo "$AUX_CSD" >&6; }
+
+
+# Crontab
+{ $as_echo "$as_me:$LINENO: checking whether cron should start sar automatically" >&5
+$as_echo_n "checking whether cron should start sar automatically... " >&6; }
+# Check whether --enable-install-cron was given.
+if test "${enable_install_cron+set}" = set; then
+  enableval=$enable_install_cron; INSTALL_CRON=$enableval
+else
+  INSTALL_CRON=n
+fi
+
+if test $INSTALL_CRON != "yes"; then
+   INSTALL_CRON=n
+   AUX_CRON=no
+else
+   INSTALL_CRON=y
+   AUX_CRON=yes
+fi
+{ $as_echo "$as_me:$LINENO: result: $AUX_CRON" >&5
+$as_echo "$AUX_CRON" >&6; }
+
+
+CUSR="root"
+if test $INSTALL_CRON = "y"; then
+   { $as_echo "$as_me:$LINENO: checking crontab owner" >&5
+$as_echo_n "checking crontab owner... " >&6; }
+
+   if test x$cron_owner = x""; then
+      CRON_OWNER=$CUSR
+      { $as_echo "$as_me:$LINENO: result: $CRON_OWNER" >&5
+$as_echo "$CRON_OWNER" >&6; }
+   else
+      if !(`grep ^$cron_owner: /etc/passwd >/dev/null 2>&1`); then
+         CRON_OWNER=$CUSR;
+         { $as_echo "$as_me:$LINENO: result: $CRON_OWNER" >&5
+$as_echo "$CRON_OWNER" >&6; }
+         echo "WARNING: User ${cron_owner} not found: Using ${CUSR} instead."
+      else
+         CRON_OWNER=$cron_owner
+         { $as_echo "$as_me:$LINENO: result: $CRON_OWNER" >&5
+$as_echo "$CRON_OWNER" >&6; }
+      fi
+   fi
+   echo "INFO: Crontab for ${CRON_OWNER} will be saved in current directory if necessary"
+   if test $CRON_OWNER = "root"; then
+      SU_C_OWNER=""
+      QUOTE=""
+      REM_CHOWN="# REM_CHOWN"
+   else
+      SU_C_OWNER="su $CRON_OWNER -c "
+      QUOTE=\"
+      # " (ignore this line)
+      REM_CHOWN=$CHOWN
+   fi
+
+   { $as_echo "$as_me:$LINENO: checking crontab interval" >&5
+$as_echo_n "checking crontab interval... " >&6; }
+
+   if test x$cron_interval = x""; then
+      CRON_INTERVAL=10
+   else
+      CRON_INTERVAL=$cron_interval
+   fi
+   { $as_echo "$as_me:$LINENO: result: $CRON_INTERVAL" >&5
+$as_echo "$CRON_INTERVAL" >&6; }
+   CRON_INTERVAL_SEC=`expr ${CRON_INTERVAL} \* 60`
+   CRON_COUNT=`expr 60 / ${CRON_INTERVAL}`
+else
+   CRON_OWNER="root"
+   SU_C_OWNER=""
+   QUOTE=""
+   REM_CHOWN="# REM_CHOWN"
+   CRON_INTERVAL=10
+   CRON_INTERVAL_SEC=600
+   CRON_COUNT=6
+fi
+
+
+
+
+
+
+
+
+# Check whether documentation should be installed
+{ $as_echo "$as_me:$LINENO: checking whether documentation should be installed" >&5
+$as_echo_n "checking whether documentation should be installed... " >&6; }
+# Check whether --enable-documentation was given.
+if test "${enable_documentation+set}" = set; then
+  enableval=$enable_documentation; AUX_DOC=$enableval
+else
+  AUX_DOC=yes
+fi
+
+if  test  $AUX_DOC !=  "no"; then
+   AUX_DOC="yes"
+   INSTALL_DOC="y"
+else
+   AUX_DOC="no"
+   INSTALL_DOC="n"
+fi
+{ $as_echo "$as_me:$LINENO: result: $AUX_DOC" >&5
+$as_echo "$AUX_DOC" >&6; }
+
+
+# Set directory for installing manual pages (see comment in Makefile)
+if test $mandir != "\${datarootdir}/man"; then
+       AuxMandir=$mandir
+else
+       AuxMandir=$AuxPrefix/man
+fi
+
+
+# Check whether --debuginfo options should be allowed
+# Check whether --enable-debuginfo was given.
+if test "${enable_debuginfo+set}" = set; then
+  enableval=$enable_debuginfo; WITH_DEBUG=yes ; DFLAGS="$DFLAGS -DDEBUG"
+else
+  WITH_DEBUG=no
+fi
+
+
+
+
+# Create files
+echo .
+echo Now create files:
+echo .
+ac_config_files="$ac_config_files sa1"
+       # Permissions must be changed
+ac_config_files="$ac_config_files sa2"
+               # Permissions must be changed
+ac_config_files="$ac_config_files crontab:crontab.sample"
+       # File must be renamed
+ac_config_files="$ac_config_files sysstat.sysconfig"
+
+ac_config_files="$ac_config_files version.h:version.in"
+               # File must be renamed
+ac_config_files="$ac_config_files sysconfig.h:sysconfig.in"
+       # File must be renamed
+ac_config_files="$ac_config_files sysstat.cron.daily"
+
+ac_config_files="$ac_config_files sysstat.cron.hourly"
+
+ac_config_files="$ac_config_files sysstat.crond"
+
+ac_config_files="$ac_config_files sysstat.crond.sample.in:sysstat.crond.in"
+
+ac_config_files="$ac_config_files sysstat"
+       # Permissions must be changed
+ac_config_files="$ac_config_files man/sa1.8:man/sa1.in"
+               # File must be renamed
+ac_config_files="$ac_config_files man/sa2.8:man/sa2.in"
+               # File must be renamed
+ac_config_files="$ac_config_files man/sadc.8:man/sadc.in"
+       # File must be renamed
+ac_config_files="$ac_config_files man/sadf.1:man/sadf.in"
+       # File must be renamed
+ac_config_files="$ac_config_files man/sar.1:man/sar.in"
+               # File must be renamed
+ac_config_files="$ac_config_files man/iostat.1:man/iostat.in"
+       # File must be renamed
+ac_config_files="$ac_config_files contrib/isag/isag"
+ # Permissions must be changed
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by sysstat $as_me 9.1.5, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTION]... [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+sysstat config.status 9.1.5
+configured by $0, generated by GNU Autoconf 2.63,
+  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { $as_echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "sa1") CONFIG_FILES="$CONFIG_FILES sa1" ;;
+    "sa2") CONFIG_FILES="$CONFIG_FILES sa2" ;;
+    "crontab") CONFIG_FILES="$CONFIG_FILES crontab:crontab.sample" ;;
+    "sysstat.sysconfig") CONFIG_FILES="$CONFIG_FILES sysstat.sysconfig" ;;
+    "version.h") CONFIG_FILES="$CONFIG_FILES version.h:version.in" ;;
+    "sysconfig.h") CONFIG_FILES="$CONFIG_FILES sysconfig.h:sysconfig.in" ;;
+    "sysstat.cron.daily") CONFIG_FILES="$CONFIG_FILES sysstat.cron.daily" ;;
+    "sysstat.cron.hourly") CONFIG_FILES="$CONFIG_FILES sysstat.cron.hourly" ;;
+    "sysstat.crond") CONFIG_FILES="$CONFIG_FILES sysstat.crond" ;;
+    "sysstat.crond.sample.in") CONFIG_FILES="$CONFIG_FILES sysstat.crond.sample.in:sysstat.crond.in" ;;
+    "sysstat") CONFIG_FILES="$CONFIG_FILES sysstat" ;;
+    "man/sa1.8") CONFIG_FILES="$CONFIG_FILES man/sa1.8:man/sa1.in" ;;
+    "man/sa2.8") CONFIG_FILES="$CONFIG_FILES man/sa2.8:man/sa2.in" ;;
+    "man/sadc.8") CONFIG_FILES="$CONFIG_FILES man/sadc.8:man/sadc.in" ;;
+    "man/sadf.1") CONFIG_FILES="$CONFIG_FILES man/sadf.1:man/sadf.in" ;;
+    "man/sar.1") CONFIG_FILES="$CONFIG_FILES man/sar.1:man/sar.in" ;;
+    "man/iostat.1") CONFIG_FILES="$CONFIG_FILES man/iostat.1:man/iostat.in" ;;
+    "contrib/isag/isag") CONFIG_FILES="$CONFIG_FILES contrib/isag/isag" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   $as_echo "$as_me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr='\r'
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+   { (exit 1); exit 1; }; }
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      "
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      ac_file_inputs="$ac_file_inputs '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; } ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+ ;;
+
+
+
+  esac
+
+
+  case $ac_file$ac_mode in
+    "sa1":F) chmod +x sa1 ;;
+    "sa2":F) chmod +x sa2 ;;
+    "sysstat.crond.sample.in":F) sed s/^/#/ sysstat.crond.sample.in > sysstat.crond.sample ;;
+    "sysstat":F) chmod +x sysstat ;;
+    "contrib/isag/isag":F) chmod +x contrib/isag/isag ;;
+
+  esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+echo "
+   Sysstat version:            $PACKAGE_VERSION
+   Installation prefix:                $prefix
+   rc directory:               ${RC_DIR}
+   Init directory:             ${INIT_DIR}
+   Configuration directory:    ${SYSCONFIG_DIR}
+   Man pages directory:                $AuxMandir
+   Compiler:                   $CC
+   Compiler flags:             $CFLAGS
+"
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..4bf3a91
--- /dev/null
@@ -0,0 +1,528 @@
+# configure.in
+#
+# (C) 2007 - Ivana Varekova <varekova@redhat.com>
+# Modified by Sebastien Godard (sysstat <at> orange.fr)
+
+# Initialization of $PACKAGE_VERSION and $PACKAGE_NAME variables
+AC_INIT(sysstat, 9.1.5)
+
+# Ensure that a recent enough version of Autoconf is being used
+AC_PREREQ(2.53)
+
+# Check whether the configure script is in the right dir
+AC_CONFIG_SRCDIR(ioconf.h)
+
+# Check programs
+echo .
+echo Check programs:
+echo .
+
+AC_PROG_CC
+AC_GNU_SOURCE
+AC_PROG_LN_S
+
+AC_CHECK_PROG(CHMOD, chmod, chmod)
+AC_CHECK_PROG(CHOWN, chown, chown)
+AC_CHECK_PROG(AR, ar, ar)
+AC_CHECK_PROG(INSTALL, install, install)
+AC_CHECK_PROG(MSGFMT, msgfmt, msgfmt)
+AC_CHECK_PROG(XGETTEXT, xgettext, xgettext)
+AC_CHECK_PROG(MSGMERGE, msgmerge, msgmerge)
+AC_CHECK_PROGS(ZIP, bzip2 gzip, gzip, /bin /etc /sbin /usr/bin /usr/etc /usr/sbin /usr/ucb /usr/local/bin /usr/local/etc /usr/local/sbin)
+INSTALL_DATA="\${INSTALL} -m 644"
+AC_SUBST(INSTALL_DATA)
+INSTALL_BIN="\${INSTALL} -m 755"
+AC_SUBST(INSTALL_BIN)
+
+AC_PATH_PROGS(PATH_CP, cp, cp, /bin /etc /sbin /usr/bin /usr/etc /usr/sbin /usr/ucb /usr/local/bin /usr/local/etc /usr/local/sbin)
+AC_PATH_PROGS(PATH_CHKCONFIG, chkconfig, chkconfig, /bin /etc /sbin /usr/bin /usr/etc /usr/sbin /usr/ucb /usr/local/bin /usr/local/etc /usr/local/sbin)
+
+# Check libraries
+
+# Check header files
+echo .
+echo Check header files:
+echo .
+HAVE_LIBINTL_H=
+HAVE_LOCALE_H=
+AC_HEADER_STDC
+AC_HEADER_DIRENT
+AC_CHECK_HEADERS(ctype.h)
+AC_CHECK_HEADERS(errno.h)
+AC_CHECK_HEADERS(libintl.h, HAVE_LIBINTL_H=1)
+AC_CHECK_HEADERS(locale.h, HAVE_LOCALE_H=1)
+AC_CHECK_HEADERS(net/if.h)
+AC_CHECK_HEADERS(regex.h)
+AC_CHECK_HEADERS(signal.h)
+AC_CHECK_HEADERS(stdio.h)
+AC_CHECK_HEADERS(sys/file.h)
+AC_CHECK_HEADERS(sys/ioctl.h)
+AC_CHECK_HEADERS(sys/stat.h)
+
+echo .
+echo Check typedefs, structures and compiler characteristics:
+echo .
+AC_TYPE_SIGNAL
+AC_TYPE_SIZE_T
+AC_TYPE_OFF_T
+
+echo .
+echo Check library functions:
+echo .
+AC_CHECK_FUNCS(strchr)
+AC_CHECK_FUNCS(strcspn)
+AC_CHECK_FUNCS(strspn)
+AC_CHECK_FUNCS(strstr)
+
+# Should we check for lm_sensors?
+AC_MSG_CHECKING(for sensors support)
+AC_ARG_ENABLE(sensors,
+             AC_HELP_STRING([--disable-sensors],
+                            [disable sensors support]),
+                            SENSORS=$enableval,SENSORS=yes)
+if test $SENSORS != "yes"; then
+   CFSENSORS=""
+   DFSENSORS=""
+else
+   CFSENSORS="-lsensors"
+   DFSENSORS="-DHAVE_SENSORS"
+fi
+AC_MSG_RESULT($SENSORS)
+
+# Check for lm_sensors
+HAVE_SENSORS=no
+DFLAGS=""
+AC_CHECK_LIB(sensors, sensors_get_detected_chips, CFLAGS="${CFLAGS} ${CFSENSORS}")
+AC_MSG_CHECKING(for sensors lib)
+AC_TRY_COMPILE(#include <sensors/sensors.h>
+#include <sensors/error.h>
+               , sensors_cleanup();,HAVE_SENSORS=yes; DFLAGS="${DFLAGS} ${DFSENSORS}", HAVE_SENSORS=no)
+AC_MSG_RESULT($HAVE_SENSORS)
+AC_SUBST(HAVE_SENSORS)
+
+echo .
+echo Check system services:
+echo .
+AC_SYS_LARGEFILE
+
+echo .
+echo Check configuration:
+echo .
+# Check arguments used
+#
+# Optional Features:
+#  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+#  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+#  --disable-largefile     omit support for large files
+#  --disable-nls           disable National Language Support
+#  --enable-yesterday      tell sa2 to use "yesterday" data files
+#  --disable-man-group     ignore man_group variable value
+#  --enable-install-cron   tell sysstat to install cron scripts
+#  --enable-clean-sa-dir   clean system activity directory
+#  --enable-compress-manpg compress manual pages
+#  --enable-install-isag   install isag script
+#  --enable-debuginfo      enable debug output (--debuginfo option)
+#  --disable-documentation do not install documentation (man pages...)
+#  --disable-sensors      do not link against libsensors even if available
+#
+# Some influential environment variables:
+#  rcdir        directory where startup scripts are installed
+#  sa_lib_dir    sadc, sa1 and sa2 directory
+#  sa_dir        system activity daily datafiles directory
+#  conf_dir     sysstat configuration directory (default is /etc/sysconfig)
+#  history       number of daily datafiles to keep (default value is 7)
+#  compressafter number of days after which datafiles are compressed
+#  man_group     group for man pages
+#  cron_owner    crontab owner
+#  cron_interval crontab sampling interval
+#
+# Fine tuning the installation directories:
+#  --mandir=DIR           man documentation directory [PREFIX/man]
+#  --docdir=DIR                  other documentation directory [PREFIX/share/doc]
+#
+# Installation directories:
+#  --prefix=PREFIX         install architecture-independent files in PREFIX
+#                            [/usr/local]
+#  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+#                            [PREFIX]
+
+# Set directories
+if test -d /etc/init.d && test ! -L /etc/init.d; then
+   if test -d /etc/init.d/rc2.d; then
+      RC_DIR=/etc/init.d
+      INITD_DIR=.
+   else
+      RC_DIR=/etc
+      INITD_DIR=init.d
+   fi
+   INIT_DIR=/etc/init.d
+elif test -d /sbin/init.d; then
+   RC_DIR=/sbin/init.d
+   INIT_DIR=/sbin/init.d
+   INITD_DIR=.
+else
+   RC_DIR=/etc/rc.d
+   INIT_DIR=/etc/rc.d/init.d
+   INITD_DIR=init.d
+fi
+
+AC_MSG_CHECKING(run-commands directory)
+AC_ARG_VAR([rcdir],[run-commands directory])
+if test x$rcdir != x""; then
+       # Override previous rc directories values
+       RC_DIR=$rcdir
+       INIT_DIR=$rcdir/init.d
+       INITD_DIR=init.d
+fi
+AC_MSG_RESULT($RC_DIR)
+if test ! -d $RC_DIR; then
+       echo "INFO: Directory ${RC_DIR} doesn't exist."
+       echo "INFO: Startup scripts won't be installed."
+fi
+
+AC_SUBST(RC_DIR)
+AC_SUBST(INIT_DIR)
+AC_SUBST(INITD_DIR)
+
+# Set sadc directory
+if test $prefix != "NONE"; then
+   AuxPrefix=$prefix
+else
+   AuxPrefix=/usr/local
+fi
+
+if test -d $AuxPrefix/lib; then
+   SADC_DIR=$AuxPrefix/lib
+elif test -d $AuxPrefix/lib64; then
+   SADC_DIR=$AuxPrefix/lib64
+else
+   SADC_DIR=$AuxPrefix/lib
+fi
+
+AC_MSG_CHECKING(sadc directory)
+AC_ARG_VAR([sa_lib_dir],[sadc directory])
+if test x$sa_lib_dir != x""; then
+   SA_LIB_DIR=$sa_lib_dir
+else
+   SA_LIB_DIR=$SADC_DIR/sa
+fi
+AC_MSG_RESULT($SA_LIB_DIR)
+if test ! -d $SA_LIB_DIR; then
+   echo "INFO: Directory ${SA_LIB_DIR} will be created during installation stage."
+fi
+AC_SUBST(SA_LIB_DIR)
+
+# Set system activity directory
+AC_MSG_CHECKING(system activity directory)
+AC_ARG_VAR([sa_dir],[system activity directory])
+if test x$sa_dir != x""; then
+   SA_DIR=$sa_dir
+else
+   SA_DIR=/var/log/sa
+fi
+AC_MSG_RESULT($SA_DIR)
+if test ! -d $SA_DIR; then
+   echo "INFO: Directory ${SA_DIR} will be created during installation stage." 
+fi
+AC_SUBST(SA_DIR)
+
+# Set configuration directory
+AC_MSG_CHECKING(sysstat configuration directory)
+AC_ARG_VAR([conf_dir],[sysstat configuration directory])
+if test x$conf_dir != x""; then
+   SYSCONFIG_DIR=$conf_dir
+else
+   SYSCONFIG_DIR=/etc/sysconfig
+fi
+AC_MSG_RESULT($SYSCONFIG_DIR)
+if test ! -d $SYSCONFIG_DIR; then
+   echo "INFO: Directory ${SYSCONFIG_DIR} will be created during installation stage." 
+fi
+AC_SUBST(SYSCONFIG_DIR)
+
+# National Language Support
+AC_MSG_CHECKING(National Language Support)
+AC_ARG_ENABLE(nls,
+             AC_HELP_STRING([--disable-nls],
+                            [disable National Language Support]),
+                            AUX_NLS=$enableval,AUX_NLS=yes)
+if test $AUX_NLS != "no" && test $HAVE_LIBINTL_H && test $HAVE_LOCALE_H; then
+   AUX_NLS="yes"
+   NLS="y"
+else
+   AUX_NLS="no"
+   NLS="n"
+fi
+AC_MSG_RESULT($AUX_NLS)
+AC_SUBST(NLS)
+if test $AUX_NLS = "yes" &&  test x$MSGFMT != x"msgfmt"; then 
+   echo "WARNING: msgfmt command not found!"
+fi
+if test $AUX_NLS = "yes" &&  test x$XGETTEXT != x"xgettext"; then 
+   echo "WARNING: xgettext command not found!"
+fi
+if test $AUX_NLS = "yes" &&  test x$MSGMERGE != x"msgmerge"; then 
+   echo "WARNING: msgmerge command not found!"
+fi
+
+# Check whether sa2 should process data file of the day before
+AC_MSG_CHECKING(whether sa2 should process data file of the day before)
+AC_ARG_ENABLE(yesterday,
+             AC_HELP_STRING([--enable-yesterday],
+                            [tell sa2 to use data file of the day before]),
+                            AUX_YESTERDAY=$enableval,AUX_YESTERDAY=no)
+if test $AUX_YESTERDAY = "yes"; then
+   YESTERDAY="--date=yesterday"
+   AC_MSG_RESULT(yes)
+else
+   YESTERDAY=""
+   AC_MSG_RESULT(no)
+fi
+AC_SUBST(YESTERDAY)
+
+# Data history to keep by sa2
+AC_MSG_CHECKING(number of daily data files to keep)
+AC_ARG_VAR([history],[number of daily data files to keep (default value is 7)]) 
+if test x$history = x""; then
+   HISTORY=7
+else
+   HISTORY=$history
+fi
+AC_MSG_RESULT($HISTORY)
+AC_SUBST(HISTORY)
+
+# Number of days after which datafiles are compressed
+AC_MSG_CHECKING(number of days after which data files are compressed)
+AC_ARG_VAR([compressafter],[number of days after which data files are compressed (default value is 10)])
+if test x$compressafter = x""; then
+   COMPRESSAFTER=10
+else
+   COMPRESSAFTER=$compressafter
+fi
+AC_MSG_RESULT($COMPRESSAFTER)
+AC_SUBST(COMPRESSAFTER)
+
+# Manual page group
+if `grep ^man: /etc/group >/dev/null 2>&1`; then
+   GRP=man
+else
+   GRP=root
+fi
+
+AC_MSG_CHECKING(group for manual pages)
+AC_ARG_VAR([man_group],[group for manual pages])
+if test x$man_group = x""; then
+   MAN_GROUP=$GRP
+   AC_MSG_RESULT($MAN_GROUP)
+else
+   if !(`grep ^$man_group: /etc/group >/dev/null 2>&1`); then 
+      MAN_GROUP=$GRP
+      AC_MSG_RESULT($MAN_GROUP) 
+      echo "WARNING: Group ${man_group} not found: Using ${GRP} instead"
+   else
+      MAN_GROUP=$man_group
+      AC_MSG_RESULT($MAN_GROUP)
+   fi
+fi
+AC_SUBST(MAN_GROUP)
+
+# Ignore manual pages group?
+AC_MSG_CHECKING(whether man_group variable should be ignored)
+AC_ARG_ENABLE(man-group,
+             AC_HELP_STRING([--disable-man-group],
+                            [ignore man_group variable value]),
+                            AUX_IMG=$enableval,AUX_IMG=no)
+if test $AUX_IMG != "yes"; then
+   IGNORE_MAN_GROUP=n
+   AUX_IMG=no
+else
+   IGNORE_MAN_GROUP=y
+fi
+AC_MSG_RESULT($AUX_IMG)
+AC_SUBST(IGNORE_MAN_GROUP)
+
+# Compress manual pages?
+AC_MSG_CHECKING(whether manual pages should be compressed)
+AC_ARG_ENABLE(compress-manpg,
+             AC_HELP_STRING([--enable-compress-manpg],
+                            [compress sysstat manual pages]),
+                            AUX_MPG=$enableval,AUX_MPG=no)
+if test $AUX_MPG != "yes"; then
+   COMPRESS_MANPG=n
+   AUX_MPG=no
+else
+   COMPRESS_MANPG=y
+fi
+AC_MSG_RESULT($AUX_MPG)
+AC_SUBST(COMPRESS_MANPG)
+
+# Check whether isag should be installed
+AC_MSG_CHECKING(whether isag script should be installed)
+AC_ARG_ENABLE(install-isag,
+             AC_HELP_STRING([--enable-install-isag],
+                            [install isag script]),
+                            AUX_IIS=$enableval,AUX_IIS=no)
+if test $AUX_IIS != "yes"; then
+   INSTALL_ISAG=n
+   AUX_IIS=no
+else
+   INSTALL_ISAG=y
+fi
+AC_MSG_RESULT($AUX_IIS)
+AC_SUBST(INSTALL_ISAG)
+
+# Check whether sa directory should be cleaned
+AC_MSG_CHECKING(whether system activity directory should be cleaned)
+AC_ARG_ENABLE(clean-sa-dir,
+             AC_HELP_STRING([--enable-clean-sa-dir],
+                            [clean system activity directory]),
+                           AUX_CSD=$enableval,AUX_CSD=no)
+if test $AUX_CSD != "yes"; then
+   CLEAN_SA_DIR=n
+   AUX_CSD=no
+else
+   CLEAN_SA_DIR=y
+fi
+AC_MSG_RESULT($AUX_CSD)
+AC_SUBST(CLEAN_SA_DIR)
+
+# Crontab
+AC_MSG_CHECKING(whether cron should start sar automatically)
+AC_ARG_ENABLE(install-cron, 
+             AC_HELP_STRING([--enable-install-cron],
+                            [install a crontab to start sar]),
+                            INSTALL_CRON=$enableval,INSTALL_CRON=n)
+if test $INSTALL_CRON != "yes"; then
+   INSTALL_CRON=n
+   AUX_CRON=no
+else 
+   INSTALL_CRON=y
+   AUX_CRON=yes
+fi
+AC_MSG_RESULT($AUX_CRON)
+AC_SUBST(INSTALL_CRON)
+
+CUSR="root"
+if test $INSTALL_CRON = "y"; then 
+   AC_MSG_CHECKING(crontab owner)
+   AC_ARG_VAR([cron_owner],[crontab owner])
+   if test x$cron_owner = x""; then
+      CRON_OWNER=$CUSR
+      AC_MSG_RESULT($CRON_OWNER)
+   else
+      if !(`grep ^$cron_owner: /etc/passwd >/dev/null 2>&1`); then
+         CRON_OWNER=$CUSR;
+         AC_MSG_RESULT($CRON_OWNER)
+         echo "WARNING: User ${cron_owner} not found: Using ${CUSR} instead."
+      else 
+         CRON_OWNER=$cron_owner
+         AC_MSG_RESULT($CRON_OWNER)
+      fi
+   fi
+   echo "INFO: Crontab for ${CRON_OWNER} will be saved in current directory if necessary"
+   if test $CRON_OWNER = "root"; then 
+      SU_C_OWNER=""
+      QUOTE=""
+      REM_CHOWN="# REM_CHOWN"
+   else 
+      SU_C_OWNER="su $CRON_OWNER -c "
+      QUOTE=\"
+      # " (ignore this line)
+      REM_CHOWN=$CHOWN
+   fi
+
+   AC_MSG_CHECKING(crontab interval)
+   AC_ARG_VAR([cron_interval],[crontab interval])
+   if test x$cron_interval = x""; then
+      CRON_INTERVAL=10
+   else
+      CRON_INTERVAL=$cron_interval
+   fi
+   AC_MSG_RESULT($CRON_INTERVAL)
+   CRON_INTERVAL_SEC=`expr ${CRON_INTERVAL} \* 60`
+   CRON_COUNT=`expr 60 / ${CRON_INTERVAL}`
+else
+   CRON_OWNER="root"
+   SU_C_OWNER=""
+   QUOTE=""
+   REM_CHOWN="# REM_CHOWN"
+   CRON_INTERVAL=10
+   CRON_INTERVAL_SEC=600
+   CRON_COUNT=6
+fi
+AC_SUBST(CRON_OWNER)
+AC_SUBST(SU_C_OWNER)
+AC_SUBST(CRON_INTERVAL)
+AC_SUBST(CRON_INTERVAL_SEC)
+AC_SUBST(CRON_COUNT)
+AC_SUBST(QUOTE)
+AC_SUBST(REM_CHOWN)
+
+# Check whether documentation should be installed
+AC_MSG_CHECKING(whether documentation should be installed)
+AC_ARG_ENABLE(documentation,
+             AC_HELP_STRING([--disable-documentation],
+                            [do not install documentation]),
+                            AUX_DOC=$enableval,AUX_DOC=yes)
+if  test  $AUX_DOC !=  "no"; then
+   AUX_DOC="yes"
+   INSTALL_DOC="y"
+else
+   AUX_DOC="no"
+   INSTALL_DOC="n"
+fi
+AC_MSG_RESULT($AUX_DOC)
+AC_SUBST(INSTALL_DOC)
+
+# Set directory for installing manual pages (see comment in Makefile)
+if test $mandir != "\${datarootdir}/man"; then
+       AuxMandir=$mandir
+else
+       AuxMandir=$AuxPrefix/man
+fi
+AC_SUBST(AuxMandir)
+
+# Check whether --debuginfo options should be allowed
+AC_ARG_ENABLE(debuginfo, 
+             AC_HELP_STRING([--enable-debuginfo],
+                            [enable debug output (--debuginfo option)]),
+                            WITH_DEBUG=yes ; DFLAGS="$DFLAGS -DDEBUG" , WITH_DEBUG=no)
+AC_SUBST(WITH_DEBUG)
+AC_SUBST(DFLAGS)
+
+# Create files
+echo .
+echo Now create files:
+echo .
+AC_CONFIG_FILES([sa1], [chmod +x sa1])         # Permissions must be changed
+AC_CONFIG_FILES([sa2], [chmod +x sa2])         # Permissions must be changed
+AC_CONFIG_FILES([crontab:crontab.sample])      # File must be renamed
+AC_CONFIG_FILES([sysstat.sysconfig])
+AC_CONFIG_FILES([version.h:version.in])                # File must be renamed
+AC_CONFIG_FILES([sysconfig.h:sysconfig.in])    # File must be renamed
+AC_CONFIG_FILES([sysstat.cron.daily])
+AC_CONFIG_FILES([sysstat.cron.hourly])
+AC_CONFIG_FILES([sysstat.crond])
+AC_CONFIG_FILES([sysstat.crond.sample.in:sysstat.crond.in], [sed s/^/#/ sysstat.crond.sample.in > sysstat.crond.sample])
+AC_CONFIG_FILES([sysstat], [chmod +x sysstat]) # Permissions must be changed
+AC_CONFIG_FILES([man/sa1.8:man/sa1.in])                # File must be renamed
+AC_CONFIG_FILES([man/sa2.8:man/sa2.in])                # File must be renamed
+AC_CONFIG_FILES([man/sadc.8:man/sadc.in])      # File must be renamed
+AC_CONFIG_FILES([man/sadf.1:man/sadf.in])      # File must be renamed
+AC_CONFIG_FILES([man/sar.1:man/sar.in])                # File must be renamed
+AC_CONFIG_FILES([man/iostat.1:man/iostat.in])  # File must be renamed
+AC_CONFIG_FILES([contrib/isag/isag], [chmod +x contrib/isag/isag]) # Permissions must be changed
+
+AC_OUTPUT(Makefile)
+
+echo "
+   Sysstat version:            $PACKAGE_VERSION
+   Installation prefix:                $prefix
+   rc directory:               ${RC_DIR}
+   Init directory:             ${INIT_DIR}
+   Configuration directory:    ${SYSCONFIG_DIR}
+   Man pages directory:                $AuxMandir
+   Compiler:                   $CC
+   Compiler flags:             $CFLAGS
+"
+
diff --git a/contrib/README-contrib b/contrib/README-contrib
new file mode 100644 (file)
index 0000000..d8ef9aa
--- /dev/null
@@ -0,0 +1,8 @@
+This is the directory where you can find various programs related to sysstat.
+Please don't ask me any questions about them. Send your comments and/or
+bug reports to their respective authors.
+
+Thx.
+--
+Sébastien Godard (sysstat <at> orange.fr)
+
diff --git a/contrib/isag/README-isag b/contrib/isag/README-isag
new file mode 100644 (file)
index 0000000..ab443da
--- /dev/null
@@ -0,0 +1,18 @@
+README file for the isag - Interactive System Activity Graph - command.
+
+isag is a command that enables you to plot data stored in a daily data file
+by a previous sar run.
+isag needs a recent version of Tcl/Tk installed, together with the
+gnuplot plotting program.
+
+isag is (C) 2000,2001 by David Doubrava <linux_monitor@volny.cz>.
+Send bug reports to <linux_monitor@volny.cz>.
+
+Note that the path to daily data files is hard coded in isag and
+its value is "/var/log/sa".
+Also isag assumes that sar is installed in /usr/bin directory.
+Update isag script if sar is located elsewhere.
+
+--
+Sébastien Godard (sysstat <at> wanadoo.fr)
+
diff --git a/contrib/isag/isag.1 b/contrib/isag/isag.1
new file mode 100644 (file)
index 0000000..8281a7a
--- /dev/null
@@ -0,0 +1,201 @@
+.\" Automatically generated by Pod::Man version 1.02
+.\" Mon Mar 22 20:19:18 2004
+.\"
+.\" Standard preamble:
+.\" ======================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Ip \" List item
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  | will give a
+.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used
+.\" to do unbreakable dashes and therefore won't be available.  \*(C` and
+.\" \*(C' expand to `' in nroff, nothing in troff, for use with C<>
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` `
+.    ds C' '
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr
+.\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and
+.\" index entries marked with X<> in POD.  Of course, you'll have to process
+.\" the output yourself in some meaningful fashion.
+.if \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+.    .
+.    nr % 0
+.    rr F
+.\}
+.\"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it
+.\" makes way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.bd B 3
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ======================================================================
+.\"
+.IX Title "ISAG 1"
+.TH ISAG 1 "0.81.0" "March 2004" "System Activity Grapher"
+.UC
+.SH "NAME"
+isag \- Interactive System Activity Grapher
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+isag [\-p datafiles_path] [\-c config_file] [\-ght gr_height] [\-gwd gr_width]
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+The \fIisag\fR command graphically displays the system activity data stored
+in a binary data file by a previous \fIsar\fR run. The \fIisag\fR command invokes
+\&\fIsar\fR to extract the data to be plotted.
+.PP
+The data are processed using \fIsar\fR command and slightly transformed
+to tabular format, and then this format is visualized using \fIgnuplot\fR
+program.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+.Ip "\-p datafiles_path" 4
+.IX Item "-p datafiles_path"
+Specify the pathname where are located the daily data files.
+Default path is: \fI/var/log/sa\fR
+.Ip "\-c config_file" 4
+.IX Item "-c config_file"
+Specify the configuration file used by the \fIisag\fR command. 
+The contents of this file may depend on \fIisag\fR version number.
+Default config file is: \fI$HOME/.isag.cfg\fR.
+.Ip "\-ght gr_height" 4
+.IX Item "-ght gr_height"
+Specify the height of the chart area. 
+Default value is: \fI400\fR.
+.Ip "\-gwd gr_width" 4
+.IX Item "-gwd gr_width"
+Specify the width of the chart area. 
+Default value is: \fI720\fR.
+.SH "CONFIG FILE"
+.IX Header "CONFIG FILE"
+As mentioned above there is a config file. There are stored following values:
+.Ip "last showed graph" 2
+.IX Item "last showed graph"
+.Ip "y limits for each kind of graph" 2
+.IX Item "y limits for each kind of graph"
+.PP
+It seems usefull, because new run doesn't need new settings to obtain same scale.
+.SH "PREREQUSITIES"
+.IX Header "PREREQUSITIES"
+Here is list of prerequsities including versioning and built-in features.
+.Ip "Tcl/Tk"
+.IX Item "Tcl/Tk"
+Version 8.0 or newer.
+.Ip "gnuplot"
+.IX Item "gnuplot"
+Gnuplot must have a \fBtkcanvas\fR display.
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+D. Doubrava 2000, 2002 e-mail:\ linux_monitor(at)volny(dot)cz
+.PP
+\&\s-1HTTP\s0 Site: http://www.volny.cz/linux_monitor/isag/index.html
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fBsar\fR (1), \fBsadc\fR (8).
diff --git a/contrib/isag/isag.in b/contrib/isag/isag.in
new file mode 100644 (file)
index 0000000..5627fee
--- /dev/null
@@ -0,0 +1,1550 @@
+#!/bin/sh
+# the next line restarts using wish and correctly pass the arguments to this\
+exec wish "$0" -- "$@"
+
+
+###############################################################################
+#
+# Copyright (c) 2000, 2001 David Doubrava (linux_monitor(at)volny(dot)cz)
+#
+# Primary-site:        http://www.volny.cz:/linux_monitor/isag
+#
+# This program/module is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# as published by Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version
+#  
+# This program is distributed in the hope that it will be usefull,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY of FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+###############################################################################
+#
+# 2006/04/14 : Sebastien GODARD
+# isag v1.3
+# Updated to current sysstat version (6.1.2).
+#
+# $Id: isag.m4,v 1.26 2004/03/22 19:39:14 david Exp $
+# $State: Exp $
+#
+# $Log: isag.m4,v $
+# Revision 1.26  2004/03/22 19:39:14  david
+# fully avoided shell script, i hope the temp file issue is fixed
+#
+# Revision 1.25  2004/03/22 19:13:18  david
+# eliminated shell script, security issue
+#
+# Revision 1.24  2004/03/02 20:28:00  david
+# replaced <> by () in mangled e-mails
+#
+# Revision 1.23  2004/02/24 07:40:14  david
+# replaced (at) and (dot) in most e-mail addresses
+#
+# Revision 1.22  2003/02/26 18:19:09  david
+# realized new layout of files
+#
+# Revision 1.21  2003/02/23 21:07:35  david
+# first prototype of sag
+#
+# Revision 1.20  2003/01/26 20:41:48  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.19  2002/03/04 20:23:26  david
+# fixed whole day functionality
+#
+# Revision 1.17  2001/07/30 18:05:41  sarrep
+# fix: bug2001060501; set LC_ALL to sane value; see Debian bug #101545
+#
+# Revision 1.16  2001/04/22 14:19:34  sarrep
+# Added GPL related text
+# remove notes about solving R switch problems
+#
+# Revision 1.15  2001/03/17 17:30:15  sarrep
+# CVSizing, unified headers of each element file
+#
+# Revision 1.14  2001/03/17 16:55:26  sarrep
+# LINUX RESTART zeroes all counters.
+#
+# Revision 1.13  2001/03/11 20:15:19  sarrep
+# First step after CVSizing
+#
+# Revision 1.12  2001/02/20 19:06:10  sarrep
+# added q switch and actialize B switch to version 3.3.6
+#
+# Revision 1.11  2001/02/10 10:42:03  sarrep
+# finally renamed from sarrep to isag
+# added additional commnts in header
+# added patching
+#
+# Revision 1.10  2001/02/03 11:02:17  sarrep
+# removed many same (for family) parts to different files.
+# improved generationg of cmd array.
+#
+# Revision 1.9  2001/01/27 19:28:43  root
+# added secondary Y axes functionality
+# added -c cfg_file cmdln option
+# writting of selected config data to cfg_file
+# renamed chart lines to names used in sar
+# parametrized creating of cmd() array
+# added generic var __M4_TIMELEN__ for proc_line_generic
+#
+# Revision 1.8  2001/01/20 19:02:53  root
+# added version check due to bug.2312200001
+# added secondary Y label
+#
+# Revision 1.7  2000/12/30 18:35:06  root
+# split into few parts. main idea next extensibility for other platforms
+#
+# Revision 1.6  2000/12/30 11:30:20  root
+# command line argument(s) functionality was added
+# preparation for config file was done
+# and few small changes
+#
+# Revision 1.5  2000/12/23 21:22:10  root
+# fixed situation if LINUX RESTART is in data file
+# fixed if no more than one line in data file.
+# try to fix wrong graph size after resizing appl. window
+#
+# Revision 1.4  2000/12/23 20:48:31  root
+# function rescale_graph was renamed to redraw_graph
+# and one menu item was added.
+#
+# Revision 1.3  2000/12/16 13:37:12  root
+# resize window related functions
+#
+# Revision 1.2  2000/12/11 18:54:17  root
+# behavior will be parametrized
+#
+# Revision 1.1  2000/12/11 15:01:07  root
+# Initial revision
+#
+#
+###############################################################################
+
+# specific for sebastien's sar
+
+#
+###############################################################################
+# $Id: version.m4,v 1.4 2002/03/04 20:20:27 david Rel $
+# $State: Rel $
+# $Log: version.m4,v $
+# Revision 1.4  2002/03/04 20:20:27  david
+# make new end line
+#
+# Revision 1.3  2001/03/17 17:43:07  sarrep
+# About dialog modify
+#
+# Revision 1.2  2001/03/17 17:30:26  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+###############################################################################
+
+set ident "/usr/bin/ident"
+set version ""
+# This can be set only if small interactive change in result code was occured
+set patchlevel ""
+if {[catch {set fp [open "| $ident $argv0" "r"]}] == 0} {
+       set n 0
+       while {[gets $fp line] != -1} {
+               if {$n != 0 && -1 != [string first "Id:" $line]} {
+                       set version "$version\n[string trim $line]"
+               } else {
+                       set n 1
+               }
+       }
+} else {
+       set version "Unknown! $ident is missing"
+}
+if {"" != $patchlevel} {
+       set version "$version\nPatch level: $patchlevel"
+}
+# $Source: /var/CVSROOT/cvs/i-sag/common/version.m4,v $
+##############################################################################
+# Tcl/Tk: version check
+#
+# $Id: ver_check.m4,v 1.6 2003/03/03 20:11:16 david Exp $
+# $State: Exp $
+# $Log: ver_check.m4,v $
+# Revision 1.6  2003/03/03 20:11:16  david
+# fixed tools name
+#
+# Revision 1.5  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.4  2002/03/04 20:20:27  david
+# make new end line
+#
+# Revision 1.3  2001/03/17 17:30:25  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+#
+###############################################################################
+set needed_version 8.0
+if {$tcl_version < $needed_version} {
+       out_msg "Warning Version check" "sag needs $needed_version, but this is version $tcl_version of Tcl.\nSome features can fail"
+#      exit
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/common/ver_check.m4,v $
+###############################################################################
+# default paths, programs and other variables
+#
+# $Id: variables.m4,v 1.5 2003/01/26 20:41:49 david Rel $
+# $State: Rel $
+# $Log: variables.m4,v $
+# Revision 1.5  2003/01/26 20:41:49  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.4  2002/03/04 20:20:27  david
+# make new end line
+#
+# Revision 1.3  2001/03/17 17:30:24  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+#
+###############################################################################
+
+set gnuplot    "/usr/bin/gnuplot"
+set grep       "/bin/grep"
+set sh         "/bin/sh"
+set gunzip     "/usr/bin/gunzip"
+set sed                "/bin/sed"
+
+# default placement of config file
+set isag_cfg_file      "$env(HOME)/.isag.cfg"
+set sag_graph_wd       720
+set sag_graph_ht       400
+
+# $Source: /var/CVSROOT/cvs/i-sag/common/variables.m4,v $
+
+###############################################################################
+# Message box functionality
+#
+# $Id: msg_box.m4,v 1.6 2002/03/24 15:18:26 david Exp $
+# $State: Exp $
+# $Log: msg_box.m4,v $
+# Revision 1.6  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.5  2002/03/04 20:21:08  david
+# make new end line
+#
+# Revision 1.4  2001/06/03 19:58:04  sarrep
+# improved behaviour, added grab capability
+# removed (softly) Cancel button
+#
+# Revision 1.3  2001/03/17 17:30:22  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+#
+###############################################################################
+
+proc msg_box_btn {w} {
+       destroy $w
+}
+
+proc err_msg {title text} {
+       tk_messageBox -icon error -type ok  -message $text -title $title
+}      
+
+proc out_msg {title text} {
+       toplevel .msg_box
+       
+       wm title .msg_box $title
+       label .msg_box.l -text $text -justify left
+       pack .msg_box.l -side top
+       frame .msg_box.b
+       pack .msg_box.b -side top
+
+       button .msg_box.b.ok -text OK -command {msg_box_btn .msg_box}
+       pack .msg_box.b.ok -side left
+
+#      button .msg_box.b.cancel -text cancel -command {msg_box_btn .msg_box}
+#      pack .msg_box.b.cancel -side left
+
+       grab .msg_box
+       tkwait window .msg_box
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/msg_box.m4,v $
+
+# specific paths and programs
+set sar_data_path "@SA_DIR@"
+set sar_data_mask "sa\[0-9\]\[0-9\]"
+set prefix "@prefix@"
+set exec_prefix "@exec_prefix@"
+set sar "@bindir@/sar"
+
+# following check added: Thu Mar 18 21:44:52 GMT+1 2004
+if { 1 != [file executable $sar]} {
+       err_msg "Error" "File: $sar does not exist"
+       exit 
+}
+
+#fix: bug2001060501; set LC_ALL to sane value; see Debian bug #101545 
+set env(LC_ALL) "C"
+
+
+###############################################################################
+# $Id: isag_common_options.m4,v 1.6 2003/01/26 20:41:48 david Rel $
+# $State: Rel $
+# $Log: isag_common_options.m4,v $
+# Revision 1.6  2003/01/26 20:41:48  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.5  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.4  2002/03/04 20:21:51  david
+# make new end line
+#
+# Revision 1.3  2001/03/17 17:30:20  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+#
+###############################################################################
+proc Usage {} {
+       global sar_data_path sar_data_mask isag_cfg_file sag_graph_wd sag_graph_ht
+
+       out_msg "Usage" \
+"isag \[options\]
+
+Options:
+\t-p data_path (default: $sar_data_path)
+\t-m data_file_mask (default: $sar_data_mask)
+\t-c cfg_file (default: $isag_cfg_file) 
+\t-gwd graph_width (default: $sag_graph_wd)
+\t-ght graph_height (default: $sag_graph_ht) "
+        exit
+}
+
+proc getopt {argv opt} {
+       set rv ""
+       if {-1 != [set t [lsearch -exact $argv "-$opt"]]} {
+               set rv [lindex $argv [expr $t + 1]]
+       }
+       return $rv
+}
+
+if {-1 != [set t [lsearch -exact $argv "-h"]]} {
+               Usage
+}
+if {-1 != [set t [lsearch -exact $argv "-?"]]} {
+               Usage
+}
+if {[set t [getopt $argv c]] != ""} {
+       # check for path
+       if {1 == ([file exist $t] && [file isfile $t])} {
+               set isag_cfg_file $t
+       } else {
+               out_msg "Error" "<$t> is not regular file, using default <$isag_cfg_file>"
+       }
+}
+if {[set t [getopt $argv p]] != ""} {
+       # check for path
+       if {1 == ([file exist $t] && [file isdirectory $t])} {
+               set sar_data_path $t
+       } else {
+               out_msg "Error" "<$t> is not directory, using default <$sar_data_path>"
+       }
+}
+if {[set t [getopt $argv m]] != ""} {
+               set sar_data_mask $t
+}
+if {[set t [getopt $argv ght]] != ""} {
+       if {1 == [string is digit $t]} {
+               set sag_graph_ht $t
+       } else {
+               out_msg "Error" "<$t> is not decimal number, using default <$sag_graph_ht>"
+       }
+}
+if {[set t [getopt $argv gwd]] != ""} {
+       if {1 == [string is digit $t]} {
+               set sag_graph_wd $t
+       } else {
+               out_msg "Error" "<$t> is not decimal number, using default <$sag_graph_wd>"
+       }
+}
+
+unset t
+# $Source: /var/CVSROOT/cvs/i-sag/isag/isag_common_options.m4,v $
+
+###############################################################################
+#
+# Variables connected to graphs and their default values
+#
+# selected archive file for sa data, typically saNN
+# this variable is set thru: data Chooser (see: Concept Guide)
+set sag_if_archive ""
+
+# full path to archive file for sa data: either $sar_data_path/sa?? or
+# $fgnr_tmpdir/sa_data (if the former file was compressed)
+set sag_if_archive_uncompressed ""
+
+# last_graph contains last drawing function as letter
+set last_graph ""
+
+
+# path to the newest sa data file. Set by fill_file_menu, used by the main
+# procedure to autoload the file on program's startup
+set sag_latest_file ""
+
+# SGo 2008-07-06: Update options (options -S added).
+# SGo 2008-06-15: Update options (options -c and -w have been merged).
+# sar switches as names for object-instances (final and curent)
+set  prog_swtch [list b B q r R S u v w W]
+
+# maximal and current values for each graph indexed by sar switch i.e. for cpu 
+# is index u not -u
+
+foreach l $prog_swtch {
+       set val_max($l) 0
+       set val_cur($l) 0
+       set has_negative($l) 0
+}
+unset l
+# exceptions
+set val_max(u) 100
+set has_negative(R) 1
+
+set val_max(W) 1
+set val_cur(W) 1
+
+# graph/view names this is shoved in menu-view and as name of the graph
+# and other functional parameters
+#      xlabel - label for x-axis
+#      ylabel - label for y-axis
+#      y2label - label for secondary y-axis
+#      plotstr - string plot for gnuplot, describes a graph
+#
+# SGo 2008-07-06: Add menu option, ylabel and y2label for option -S.
+# SGo 2008-06-15: Update menu functions and ylabel names
+# view_n(ame) array
+set view_n(b) "I/O Transfer Rate"
+set view_n(B) "Paging Statistics"
+set view_n(q) "Run Queue"
+set view_n(r) "Memory Utilization"
+set view_n(R) "Memory Statistics"
+set view_n(S) "Swap Utilization"
+set view_n(u) "CPU Utilization"
+set view_n(v) "Inode Status"
+set view_n(w) "Process Creation and Context Switches"
+set view_n(W) "System Swapping"
+
+# xlabel is not an array - all values are same
+set xlabel "Time"
+
+# ylabel array
+set ylabel(b) "ops/s"
+set ylabel(B) "pages/s"
+set ylabel(q) ""
+set ylabel(r) "kB"
+set ylabel(R) "ops/s"
+set ylabel(S) "kB"
+set ylabel(u) "Percent"
+set ylabel(v) ""
+set ylabel(w) "ops/s"
+set ylabel(W) "swp/s"
+
+set y2label(b) ""
+set y2label(B) ""
+set y2label(q) ""
+set y2label(r) ""
+set y2label(R) ""
+set y2label(S) ""
+set y2label(u) ""
+set y2label(v) ""
+set y2label(w) ""
+set y2label(W) ""
+
+# sag_if_out_tokens describes how is input file covered
+# if no list specified the proc_line_$l() is called
+# Note: first element has index 0 (zero)!
+# SGo 2007-07-06: Add fields for option -S.
+# SGo 2007-10-21: Update fields taken for option -B.
+# SGo 2006-04-14: Update fields taken for options -B, -q, -r, -R, -v.
+# SGo 2008-06-15: Options -c and -w have been merged.
+set sag_if_out_tokens(b) [list 1 2 3 4]
+set sag_if_out_tokens2(b) ""
+set sag_if_out_tokens(B) [list 0 1 2 3 4 5 6 7]
+set sag_if_out_tokens2(B) ""
+set sag_if_out_tokens(q) [list 0 1 2 3 4]
+set sag_if_out_tokens2(q) ""
+set sag_if_out_tokens(r) [list 0 1 3 4 5]
+set sag_if_out_tokens2(r) ""
+set sag_if_out_tokens(R) [list 0 1 2]
+set sag_if_out_tokens2(R) ""
+set sag_if_out_tokens(S) [list 0 1 3]
+set sag_if_out_tokens2(S) ""
+# CPU needs special computation, following list must be empty
+# if no list is entered then following functions must be defined
+# __output_zero_metrics_$l & proc_line_$l (see: proc_line_u())
+set sag_if_out_tokens(u) ""
+set sag_if_out_tokens2(u) ""
+set sag_if_out_tokens(v) [list 0 1 2 3 5 7]
+set sag_if_out_tokens2(v) ""
+set sag_if_out_tokens(w) [list 0 1]
+set sag_if_out_tokens2(w) ""
+set sag_if_out_tokens(W) [list 0 1]
+set sag_if_out_tokens2(W) ""
+
+#
+# The sar_elim() array contains string which have to be eliminated from sar's output
+# SGo 2008-07-06: Add string for option -S.
+#
+set sar_elim(b) "tps"
+set sar_elim(B) "pgpgin"
+set sar_elim(c) "proc"
+set sar_elim(q) "runq-sz"
+set sar_elim(r) "kbmemfree"
+set sar_elim(R) "frmpg"
+set sar_elim(S) "kbswpfree"
+set sar_elim(u) "user"
+set sar_elim(v) "dentunusd"
+set sar_elim(w) "cswch"
+set sar_elim(W) "pswpin"
+
+# Functions which are responsible for data source selection and processing
+# funcs are referred from GUI
+proc fill_file_menu {} {
+       global sar_data_path sar_data_mask sag_latest_file
+
+       set max_timestamp 0
+       set directories [lsort -decreasing [glob -nocomplain -directory $sar_data_path -type d \[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]]]
+
+       menu .file.menu.m -tearoff false
+
+       foreach directory [concat $directories $sar_data_path ] {               
+               set files [glob -nocomplain -directory $directory -type f $sar_data_mask ]
+               # add compressed files too
+               set files [concat $files [glob -nocomplain -directory $directory -type f $sar_data_mask.gz ]]
+               set files [concat $files [glob -nocomplain -directory $directory -type f $sar_data_mask.bz2 ]]
+
+               if { 0 == [llength $files] } {
+                       continue
+               }
+
+               if { $directory == $sar_data_path } {
+                       set menudir ".file.menu.m"
+                       
+                       # Sort files according to theirs modification times descending
+
+                       # i) create temporary list of items in form `timestamp:file'
+                       set tmpfiles [list]
+                       foreach file $files {
+                               # skip symbolic links
+                               if { "link" == [ file type $file]} { continue }
+                               set timestamp [file mtime $file]
+                               set tmpfiles [linsert $tmpfiles end "$timestamp:$file"]
+                       }
+                       
+                       # ii) sort the temporary list 
+                       set tmpfiles [lsort -decreasing $tmpfiles]
+                       # iii) remove timestamps to get back the file list
+                       set files [list]
+                       foreach file $tmpfiles {
+                               set l [string first ":" $file]
+                               set files [linsert $files end [string range $file [expr $l+1] end]]
+                       }
+               } else {
+                       # sort file list by file name, descending 
+                       set files [ lsort -decreasing $files ]
+                       set l [string last "/" $directory]
+                       set dir [string range  $directory  [expr $l + 1] end]
+
+                       # create submenu for the $dir directory
+                       set menudir ".file.menu.m.dir$dir"
+                       menu $menudir -tearoff 0
+                       .file.menu.m add cascade -label $dir -menu $menudir
+               }
+
+
+               # Fill menu with files
+               foreach file $files {
+                       set l [string length $sar_data_path]
+                       set basefile [string range $file [expr $l + 1] end]
+                       set l [string last "/" $basefile]
+                       set label [string range  $basefile  [expr $l + 1] end]
+                       set label [string map { .gz "" } $label]
+                       set label [string map { .bz2 "" } $label]
+
+                       $menudir add command -label "$label" -command "set_file $basefile"
+                       set timestamp [file mtime $file]
+                       # ignore files small then 4kB to avoid "No data found" error
+                       if { ($timestamp > $max_timestamp) && ([file size $file] > 4096) } {
+                               set sag_latest_file  $basefile
+                               set max_timestamp  $timestamp
+                       }                       
+               }
+       }
+}      
+       
+
+proc set_file {name} {
+       global sar_data_path sag_if_archive sag_if_archive_uncompressed last_graph fngr_tmpdir
+
+       set sag_if_archive $name
+       .file.lbl configure -text "Data Source: $name"
+
+       set l [string last "." $sag_if_archive]
+       if { [string range $sag_if_archive $l end] == ".gz" } {
+               # uncompress file to sa_data located in the temporary dir
+               set sag_if_archive_uncompressed "$fngr_tmpdir/sa_data"
+               exec zcat "$sar_data_path/$sag_if_archive" > $sag_if_archive_uncompressed
+       } else {
+               if { [string range $sag_if_archive $l end] == ".bz2" } {
+                       set sag_if_archive_uncompressed "$fngr_tmpdir/sa_data"
+                       exec bzcat "$sar_data_path/$sag_if_archive" > $sag_if_archive_uncompressed
+               } else {
+                       set sag_if_archive_uncompressed "$sar_data_path/$sag_if_archive"
+               }
+       }               
+
+
+       if {"" != $last_graph} {
+               new_chart $last_graph
+       }
+}
+
+###############################################################################
+# GUI
+#
+# $Id: isag.GUI.m4,v 1.14 2004/03/02 20:28:00 david Exp $
+# $State: Exp $
+# $Log: isag.GUI.m4,v $
+# Revision 1.14  2004/03/02 20:28:00  david
+# replaced <> by () in mangled e-mails
+#
+# Revision 1.13  2004/02/24 07:40:14  david
+# replaced (at) and (dot) in most e-mail addresses
+#
+# Revision 1.12  2003/01/26 20:41:48  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.11  2002/10/31 15:07:21  david
+# fixed bad behaviour with OpenMotif WM
+#
+# Revision 1.10  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.9  2002/03/04 20:23:26  david
+# fixed whole day functionality
+#
+# Revision 1.8  2002/03/04 18:36:37  david
+# grid feature implemented
+#
+# Revision 1.7  2001/03/17 17:43:06  sarrep
+# About dialog modify
+#
+# Revision 1.6  2001/03/17 17:30:11  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+#
+###############################################################################
+set isag_title "System Activity Grapher"
+wm title . $isag_title
+
+frame .menu -relief raised -borderwidth 2
+pack .menu -side top -fill x
+menubutton .menu.file -text "Program" -menu .menu.file.m -underline 0
+menu .menu.file.m -tearoff false
+.menu.file.m add command -label "Redraw" -underline 0 \
+        -command "set isag_gr_scale_old 0;redraw_graph" -accelerator "F5"
+.menu.file.m add command -label "Save Picture" -underline 0 \
+               -command "sag_save_graph"
+.menu.file.m add separator
+.menu.file.m add command -label "Exit Program" -underline 0 \
+        -command "exit_program" -accelerator "Alt-X"
+
+menubutton .menu.chart -text "Chart" -menu .menu.chart.m -underline 0
+menu .menu.chart.m -tearoff true
+
+# creates for each sar-switch menu item with apropriate command
+foreach l $prog_swtch {
+       .menu.chart.m add command -label $view_n($l) \
+               -command "new_chart $l" -accelerator $l
+       bind all $l "new_chart $l"
+}
+
+menubutton .menu.opt -text "Options" -menu .menu.opt.m -underline 0
+menu .menu.opt.m -tearoff false
+.menu.opt.m add checkbutton -label "Whole Day (00:00-23:59)" -underline 0 \
+        -variable sag_opt_whole_day \
+               -command "set isag_gr_scale_old 0;redraw_graph"
+.menu.opt.m add checkbutton -label "Show Grid" -underline 0 \
+        -variable sag_opt_grid -command "set isag_gr_scale_old 0;redraw_graph"
+               
+menubutton .menu.help -text "Help" -menu .menu.help.m -underline 0
+menu .menu.help.m -tearoff false
+.menu.help.m add command -label "About" -underline 0 \
+        -command {About}
+
+pack .menu.file .menu.chart .menu.opt -side left
+pack .menu.help -side right
+
+frame .file -relief raised
+pack .file -side top -fill x
+label .file.lbl -text "(No File)" -borderwidth 2
+menubutton .file.menu -relief raised -borderwidth 2 -text "-" -menu .file.menu.m
+fill_file_menu
+pack .file.lbl .file.menu -side left
+
+frame .graph
+pack .graph -side top -expand true -fill both
+
+# this var contains a current value
+set sag_gr_scale 0
+scale .graph.scale -orient vertical -length $sag_graph_ht -to 0 -from 1 -variable sag_gr_scale
+
+bind .graph.scale <Leave> "redraw_graph"
+
+canvas .graph.canv -width $sag_graph_wd -height $sag_graph_ht
+pack .graph.scale -side left -fill y
+pack .graph.canv -side right -expand true -fill both
+
+
+#bind all <Enter> "%W configure -highlightbackground blue"
+#bind all <Leave> "%W configure -highlightbackground white"
+
+bind all <Alt-x> "exit_program"
+bind all <F5> "set isag_gr_scale_old 0;redraw_graph"
+
+
+# acction to do when user closes isag with the window managers's close button
+wm protocol . WM_DELETE_WINDOW exit_program
+
+
+###############################################################################
+#
+# this function normalizes max val and sets scale and so on.
+# this part is most common for draw_? functions
+proc set_cur_max {l} {
+       global val_max sag_gr_scale val_cur
+
+       set norm [num_norm $val_max($l)]
+       set val_max($l) [lindex $norm 0]
+       .graph.scale configure -from $val_max($l) -resolution [lindex $norm 1]
+       unset norm
+       
+       set val_cur($l) $sag_gr_scale
+       if {$val_cur($l) == 0} {
+               set val_cur($l) $val_max($l)
+               set sag_gr_scale $val_cur($l)
+       }
+}
+
+###############################################################################
+#
+# this function is called when mouse leaves a graph-scale widget
+#      and here is local variable isag_gr_scale_old
+#
+# this can be also as flag, is set to 0 after resizing
+set isag_gr_scale_old 0
+proc redraw_graph {} {
+       global last_graph sag_gr_scale isag_gr_scale_old sag_if_archive
+
+       if {($last_graph == "") || ($sag_if_archive == "")} {
+               return
+       }
+
+       if {$isag_gr_scale_old != $sag_gr_scale} {
+               set isag_gr_scale_old $sag_gr_scale
+               sag_draw $last_graph
+       }
+}
+###############################################################################
+#
+# this function is called from menu-view and decides which graph will be drawn
+#
+proc new_chart {l} {
+       global last_graph val_cur sag_gr_scale
+
+       if {$last_graph != "$l"} {
+               set m [.graph.scale configure -from]
+               if {$m < $val_cur($l)} {
+                       .graph.scale configure -from $val_cur($l)
+               }
+               set sag_gr_scale $val_cur($l)
+               set last_graph "$l"
+               unset m
+       }
+       sag_draw $l
+}
+###############################################################################
+#
+# About message box
+#
+proc About {} {
+       global version
+
+       out_msg About "Sar Grapher\n\nBuild info:$version\n\nhttp://www.volny.cz/linux_monitor/isag/index.html\ne-mail: linux_monitor(at)volny(dot)cz"
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/isag.GUI.m4,v $
+###############################################################################
+# Resizing graph window
+#
+# $Id: isag.ResizeAll.m4,v 1.7 2003/01/26 20:41:48 david Exp $
+# $State: Exp $
+# $Log:#
+#
+#
+###############################################################################
+
+bind . <Configure> {ResizeAll}
+set isag_enResizing 0
+# first time this function is empty
+proc gnuplot {w} {}
+
+proc ResizeAll {} {
+       global isag_enResizing isag_gr_scale_old
+       
+       set width [winfo width .]
+       set height [winfo height .]
+       
+       set w [expr [winfo width .graph.scale] + [winfo width .graph.canv]]
+       set h [expr [winfo height .menu] + [winfo height .file] + [winfo height .graph.scale]]
+       
+       if {($w >= $width) && ($h == $height)} {
+               incr isag_enResizing
+               return
+       }
+       
+       if {0 == $isag_enResizing} {
+               return
+       }
+
+               set isag_enResizing 0
+       if {$w <= $width} {
+# number two look as magic number
+               .graph.canv configure -width [expr $width - [winfo width .graph.scale] - 2]
+       } 
+
+       if {$h != $height} {
+               set h1 [expr [winfo height .menu] + [.file cget -height]]
+               .graph.canv configure -height [expr $height - $h1]
+               .graph.scale configure -length [expr $height - $h1]
+       }
+#      set isag_gr_scale_old 0
+#      redraw_graph
+## not reliable        WHY?
+       gnuplot .graph.canv 
+       #set isag_enResizing 1
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/isag.ResizeAll.m4,v $
+###############################################################################
+# Other functions
+#
+# $Id: isag.Other.Funcs.m4,v 1.20 2004/03/22 19:39:14 david Exp $
+# $State: Exp $
+# $Log: isag.Other.Funcs.m4,v $
+# Revision 1.20  2004/03/22 19:39:14  david
+# fully avoided shell script, i hope the temp file issue is fixed
+#
+#
+###############################################################################
+
+##############################################################################
+#
+#
+
+proc strrep {str old new} {
+       set l [string length $old]
+
+       for {set n [string first $old $str]} {$n != -1} {set n [string first $old $str]} {
+               set str "[string range $str 0 [expr $n - 1]]$new[string range $str [expr $n + $l] end]"
+       }
+       return $str
+}
+
+# eof: strrep.m4
+
+
+# normalizes time if HH:MM:SS PM to 00-24 `format' for gnuplot
+proc time_normalize {time} {
+       set n [string first "AM" $time]
+       if {$n > 0} {
+               set time [string trim [string range $time 0 [expr $n - 1]]]
+               set hours [string range $time 0 1]
+# if hour is 12 then time is after midnight
+               if {$hours == 12} {
+                       set time "[format %02d [expr $hours - 12]][string range $time 2 end]"
+               } else {
+                       return [string trim [string range $time 0 [expr $n - 1]]]
+               }
+               unset hours
+       }
+       set n [string first "PM" $time]
+       if {$n > 0} {
+               set time [string trim [string range $time 0 [expr $n - 1]]]
+               set hours [string range $time 0 1]
+       # if hours string looks like 07, then is evaluated as octal number
+       # in case of 08 and 09 generates an error
+               if {"0" == [string range $hours 0 0]} {
+                       set hours [string range $hours 1 1]
+               }
+               if {$hours < 12} {
+                       set time "[format %02d [expr $hours + 12]][string range $time 2 end]"
+               }
+               unset hours
+       }
+       unset n
+       return $time
+}
+
+# tokens are divided by one or more space(s)
+proc parse_line {ln} {
+       global needed_version tcl_version
+
+               set res ""
+       if {$tcl_version > $needed_version} {
+       # this is a more effective
+               set rest [string map { \t " " } [string trim $ln]]
+       } else {
+               set rest [strrep [string trim $ln] \t " "]
+       }
+
+       for {} {[string length $rest] > 0} {} {
+               set a [string first " " $rest]
+               if {$a == -1} {
+                       lappend res "$rest"
+                       set rest ""
+               } else {
+                       set token [string trim [string range $rest 0 [expr $a - 1]]]
+                       set rest [string trim [string range $rest [expr $a + 1] end]]
+                       lappend res "$token"
+               }
+       }
+       unset rest
+               return $res
+}
+
+
+# normalizes number to 2valid digits representation
+# and returns lis of norm number and step for list
+proc num_norm {num} {
+       if {$num < 10.0} {
+               return [list 10 1]
+       }
+       set l [expr int ([expr log10 ($num)])]
+       set n [expr int ([expr pow (10, [expr $l - 1])])]
+       set m [expr int ([expr ($num - 1)  / $n]) + 1]
+
+       set max [expr $m * $n]
+       set step [expr int ([expr pow (10, [expr $l - 2])])]
+       if {$step < 1} {
+               set step 1
+       }
+       unset l n m
+       return [list $max $step]        
+}
+
+##
+## Parameters
+##     gp_term  - gnuplot terminal (currently used: tkcanvas & jpeg)
+##     ext      - out filename extension (related to gp_term)
+##     fn       - file name base for resulting file
+##     title    - graph title/name
+##     xlabel   - xlabel text
+##     ylabel   - primary ylabel text
+##     y2label  - secondary ylabel text (scale 0-100%)
+##     yrange   - yrange (y-maximum)
+##     plot_str - gplot command which produces desired output graph
+##     f_grid   - flag if grid should be drawn
+##
+proc create_gnuplot_file {gp_term ext fn title xlabel ylabel y2label yrange plot_str f_grid} {
+       global sag_graph_wd sag_graph_ht
+
+       
+# Y2 percentage
+       set fp [open $fn.gp "w"]
+       
+# not consistent workaround    
+       if { $gp_term == "jpeg" } {
+               puts $fp "set term $gp_term transparent interlace size $sag_graph_wd,$sag_graph_ht"
+       } else {
+               puts $fp "set term $gp_term"
+       }
+#      puts $fp "set title \"$title\""
+#      puts $fp "set xlabel \"$xlabel\""
+       puts $fp "set ylabel \"$ylabel\""
+       if {$y2label != ""} {
+               puts $fp "set y2label \"$y2label\""
+               puts $fp "set y2range \[0:100\]"
+       }
+       puts $fp "set timefmt \"%H:%M:%S\""
+       puts $fp "set xdata time"
+       puts $fp "set format x \"%H:%M\""
+       if {$yrange != ""} {
+               puts $fp "set yrange $yrange"
+       }
+       puts $fp "set output \"$fn.$ext\""
+       if { 0 != $f_grid } {
+               puts $fp "set grid"
+       }
+       puts $fp "plot $plot_str"
+       close $fp
+}
+
+set fngr_tmpdir  [exec mktemp -d "/tmp/isag.XXXXXX"]
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/isag.Other.Funcs.m4,v $
+
+###############################################################################
+#
+# Remaining graph paramaters
+#
+
+# plotstr array
+# in future - this string will not be fixed but functions will coming
+# SGo 2008-07-06: Added fields for option -S.
+# SGo 2008-06-15: Update fields for option -w (options -c and -w have been merged).
+# SGo 2007-10-21: Update fields for option -B.
+# SGo 2006-04-14: Update fields for options -B, -q, -r, -R, -u, -v.
+# SGo 2007-07-31: Update fields for option -v.
+set plotstr(b) "\"__FNGR__\" using 1:2 t \"rtps\" with line, \"__FNGR__\" using 1:3 t \"wtps\" with line, \"__FNGR__\" using 1:4 t \"bread/s\" with line,  \"__FNGR__\" using 1:5 t \"bwrtn/s\" with line"
+set plotstr(B) "\"__FNGR__\" using 1:2 t \"pgpgin/s\" with line, \"__FNGR__\" using 1:3 t \"pgpgout/s\" with line, \"__FNGR__\" using 1:4 t \"fault/s\" with line, \"__FNGR__\" using 1:5 t \"majflt/s\" with line, \"__FNGR__\" using 1:6 t \"pgfree/s\" with line, \"__FNGR__\" using 1:7 t \"pgscank/s\" with line, \"__FNGR__\" using 1:8 t \"pgscand/s\" with line, \"__FNGR__\" using 1:9 t \"pgsteal/s\" with line"
+set plotstr(n) ""
+set plotstr(q) "\"__FNGR__\" using 1:2 t \"runq-sz\" with line, \"__FNGR__\" using 1:3 t \"plist-sz\" with line, \"__FNGR__\" using 1:4 t \"ldavg-1\" with line, \"__FNGR__\" using 1:5 t \"ldavg-5\" with line, \"__FNGR__\" using 1:6 t \"ldavg-15\" with line"
+set plotstr(r) "\"__FNGR__\" using 1:2 t \"kbmemfree\" with line, \"__FNGR__\" using 1:3 t \"kbmemused\" with line, \"__FNGR__\" using 1:4 t \"kbbuffers\" with line, \"__FNGR__\" using 1:5 t \"kbcached\" with line, \"__FNGR__\" using 1:6 t \"kbcommit\" with line"
+set plotstr(R) "\"__FNGR__\" using 1:2 t \"frmpg/s\" with line, \"__FNGR__\" using 1:3 t \"bufpg/s\" with line, \"__FNGR__\" using 1:4 t \"campg/s\" with line"
+set plotstr(S) "\"__FNGR__\" using 1:2 t \"kbswpfree\" with line, \"__FNGR__\" using 1:3 t \"kbswpused\" with line, \"__FNGR__\" using 1:4 t \"kbswpcad\" with line"
+set plotstr(u) "\"__FNGR__\" using 1:2 t \"%user\" with line, \"__FNGR__\" using 1:3 t \"%nice\" with line, \"__FNGR__\" using 1:4 t \"%system\" with line, \"__FNGR__\" using 1:5 t \"%iowait\" with line, \"__FNGR__\" using 1:6 t \"%steal\" with line"
+set plotstr(v) "\"__FNGR__\" using 1:2 t \"dentunusd\" with line, \"__FNGR__\" using 1:3 t \"file-nr\" with line, \"__FNGR__\" using 1:4 t \"inode-nr\" with line, \"__FNGR__\" using 1:5 t \"pty-nr\" with line"
+set plotstr(w) "\"__FNGR__\" using 1:2 t \"proc/s\" with line, \"__FNGR__\" using 1:3 t \"cswch/s\" with line"
+set plotstr(W) "\"__FNGR__\" using 1:2 t \"pswpin/s\" with line, \"__FNGR__\" using 1:3 t \"pswpout/s\" with line"
+
+###############################################################################
+# Performance data processing
+#
+# $Id: isag.perf_data_procs.m4,v 1.11 2003/01/26 20:41:48 david Exp $
+# $State: Exp $
+# $Log: isag.perf_data_procs.m4,v $
+# Revision 1.11  2003/01/26 20:41:48  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.10  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.9  2002/03/04 20:23:26  david
+# fixed whole day functionality
+#
+# Revision 1.8  2001/03/30 16:42:26  sarrep
+# Fixed bug about _last_time, (mangled graph)
+#
+# Revision 1.7  2001/03/17 17:30:16  sarrep
+# CVSizing, unified headers of each element file
+#
+# Revision 1.6  2001/03/17 16:55:27  sarrep
+# LINUX RESTART zeroes all counters.
+#
+###############################################################################
+
+# CPU measurement specific line processing
+# SGo 2006-04-14: take into account time spent in iowait and steal modes
+proc sag_if_proc_line_u {fp line} {
+       global val_cur val_max sag_if_last_time sag_if_reboot_flag
+
+       set rval 0
+               set a [string first "all" $line]
+       if {$a != -1} {
+                               set time [string trim [string range $line 0 [expr $a - 1]]]
+               set time [time_normalize "$time"]
+               set rest [string trim [string range $line [expr $a + 3] end]]
+               if {1 == $sag_if_reboot_flag} {
+# after reboot, set to zero also, all charts are with lines
+                                               set sag_if_reboot_flag 0
+# NOTE: The func __output_zero_metrics() cannot be used, because 'u' don't have sag_if_out_tokens
+                       puts $fp "$time 0 0 0 0 0"
+               }
+
+                               set nums [parse_line $rest]
+                       # user nice system iowait steal (idle)
+               set user  [lindex $nums 0]
+               set nice  [lindex $nums 1]
+               set syst  [lindex $nums 2]
+               set iow   [lindex $nums 3]
+               set steal [lindex $nums 4]
+
+               set total [expr $user + $nice + $syst + $iow + $steal]
+               if {$total > $val_max(u)} {set val_max(u) $total}
+                               puts $fp "$time $total [expr $nice + $syst + $iow + $steal] [expr $syst + $iow + $steal] [expr $iow + $steal] $steal"
+               set rval 1
+               set sag_if_last_time $time
+       } else {if {-1 != [string first "RESTART" $line]} {
+                               set sag_if_reboot_flag 1
+# see previous NOTE
+               if {$sag_if_last_time != ""} {
+                       puts $fp "$sag_if_last_time 0 0 0 0 0"
+                       set rval 1
+               }
+       }}
+       return $rval
+}
+
+proc sag_if__output_zero_metrics_u {time} {
+       return  "$time 0 0 0 0 0"
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/isag.perf_data_procs.m4,v $
+###############################################################################
+# Performance Data Processing and Drawing functions
+#      proces line functions
+#
+# $Id: proc_line_generic.m4,v 1.11 2004/03/22 19:39:14 david Exp $
+# $State: Exp $
+# $Log: proc_line_generic.m4,v $
+# Revision 1.11  2004/03/22 19:39:14  david
+# fully avoided shell script, i hope the temp file issue is fixed
+#
+# Revision 1.10  2003/01/26 20:41:49  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.9  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.8  2002/03/04 20:23:26  david
+# fixed whole day functionality
+#
+# Revision 1.7  2001/07/30 18:06:25  sarrep
+# Fixed one debug print. It was on wrong place.
+#
+# Revision 1.6  2001/03/30 16:42:26  sarrep
+# Fixed bug about _last_time, (mangled graph)
+#
+# Revision 1.5  2001/03/17 17:30:23  sarrep
+# CVSizing, unified headers of each element file
+#
+# Revision 1.4  2001/03/17 16:55:28  sarrep
+# LINUX RESTART zeroes all counters.
+#
+#
+###############################################################################
+
+#
+# NOTE: following function is used when
+# graph of whole day is required (see: draw() function)
+#
+proc sag_if__output_zero_metrics {time  l} {
+       global sag_if_out_tokens sag_if_out_tokens2
+
+       set out "$time "
+       foreach N $sag_if_out_tokens($l) {
+               set out "$out 0"
+       }
+       foreach N $sag_if_out_tokens2($l) {
+               set out "$out 0"
+       }
+       return "$out"
+}
+
+#
+# NOTE: `_last_time' related functionality is used when
+# graph of whole day is required (see: draw() function)
+#
+set sag_if_last_time ""
+set sag_if_reboot_flag 0
+
+# generic line processing
+proc sag_if_proc_line_generic {l fp line} {
+       global val_cur val_max sag_if_out_tokens sag_if_out_tokens2 sag_if_last_time sag_if_reboot_flag
+
+               set time [string trim [string range $line 0 12]]
+       # Here was a problem, time string was badly cutten
+               set time [time_normalize "$time"]
+       set rest [string trim [string range $line 12 end]]
+               
+#
+# Sebastien's isag specific
+# check for line: "time LINUX RESTART" and reset counter to next
+# valid time stamp.
+# NOTE: Values must be zeroed also for first valid time after reboot. For
+# explanation you can imagin the chart
+#
+       if {-1 == [string first "RESTART" $rest]} {
+               if {1 == $sag_if_reboot_flag} {
+# after reboot, set to zero also, all charts are with lines
+                       set sag_if_reboot_flag 0
+                       puts $fp [sag_if__output_zero_metrics $time $l]
+               }
+               set nums [parse_line $rest]
+               set out "$time "
+               foreach N $sag_if_out_tokens($l) {
+                       set n [lindex $nums $N]
+                       set out "$out $n"
+                       if {$n > $val_max($l)} {set val_max($l) $n}
+               }
+
+               foreach N $sag_if_out_tokens2($l) {
+                       set n [lindex $nums $N]
+                       set out "$out $n"
+               }
+               set sag_if_last_time $time
+               unset nums n N
+       } else {
+# reboot detected, drop all metrics to zero
+               set sag_if_reboot_flag 1
+               if {$sag_if_last_time != ""} {
+                       set out [sag_if__output_zero_metrics $sag_if_last_time $l]
+               }
+       }
+
+       catch {
+                               puts $fp "$out"
+               unset out
+       }
+       unset rest time
+       return 1
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/common/proc_line_generic.m4,v $
+###############################################################################
+# Performance Data Processing and Drawing functions
+#      generic draw function
+#      parametrical draw func for each kind of graph
+#
+# $Id: draw.m4,v 1.16 2004/03/22 19:39:14 david Exp $
+# $State: Exp $
+# $Log: draw.m4,v $
+# Revision 1.16  2004/03/22 19:39:14  david
+# fully avoided shell script, i hope the temp file issue is fixed
+#
+# Revision 1.15  2004/03/22 19:13:18  david
+# eliminated shell script, security issue
+#
+# Revision 1.14  2004/02/27 19:26:06  david
+# fixed bug: CAN-2004-0108
+#
+# Revision 1.13  2003/02/23 19:48:16  david
+# unified redundant code which generates data file
+#
+# Revision 1.12  2003/01/26 20:41:48  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.11  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.10  2002/03/04 20:23:43  david
+# fixed whole day functionality
+#
+# Revision 1.9  2002/03/04 18:36:37  david
+# grid feature implemented
+#
+# Revision 1.8  2002/03/03 19:45:19  david
+# added parameters to create_gnuplot_file()
+#
+# Revision 1.7  2001/03/30 16:42:26  sarrep
+# Fixed bug about _last_time, (mangled graph)
+#
+# Revision 1.6  2001/03/17 17:30:10  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+#
+###############################################################################
+
+proc sag_prepare_datafile {l} {
+       global sar sar_data_path sag_if_archive_uncompressed sag_if_out_tokens \
+               sag_opt_whole_day sag_if_last_time sar_elim fngr_tmpdir
+
+               
+       set sag_if_last_time ""
+               set fp [open "|$sar -$l -f $sag_if_archive_uncompressed" "r"]
+
+       set fgrname "$fngr_tmpdir/data.$l"
+
+       set fpgr [open $fgrname w]
+
+       set nlines 0
+       
+# if needed set starting time
+       if { 0 != $sag_opt_whole_day } {
+               set sag_if_last_time "00:00"
+               if {"" != $sag_if_out_tokens($l)} {
+                       puts $fpgr [sag_if__output_zero_metrics $sag_if_last_time $l]
+               } else {
+                       puts $fpgr [sag_if__output_zero_metrics_$l $sag_if_last_time]
+               }
+       }
+       
+       while {[gets $fp line] != -1} {
+               if {(1 == [string match \[0-9\]* $line]) && (0 == [string match *$sar_elim($l)* $line])} {
+                       
+                       if {"" != $sag_if_out_tokens($l)} {
+                               set n [sag_if_proc_line_generic $l $fpgr "$line"]
+                       } else {
+                               set n [sag_if_proc_line_$l $fpgr "$line"]
+                       }
+                       incr nlines $n
+               }
+       
+       }
+       
+## make closing remark if necessary
+# finishing whole day  
+       if { 0 != $sag_opt_whole_day } {
+               if {"" != $sag_if_out_tokens($l)} {
+                       puts $fpgr [sag_if__output_zero_metrics $sag_if_last_time $l]
+               } else {
+                       puts $fpgr [sag_if__output_zero_metrics_$l $sag_if_last_time]
+               }
+               if {"" != $sag_if_out_tokens($l)} {
+                       puts $fpgr [sag_if__output_zero_metrics "23:59" $l]
+               } else {
+                       puts $fpgr [sag_if__output_zero_metrics_$l "23:59"]
+               }
+       }
+       
+       catch {close $fp}
+       catch {close $fpgr}
+
+       unset fp fpgr line
+
+       return [list $nlines $fgrname]
+}
+
+#
+# generic draw function
+# Parameter:
+#      l - graph letter other values are parameters
+#
+proc sag_draw {l} {
+       global sag_if_archive isag_title sh sar grep sar_data_path gnuplot \
+               sag_gr_scale val_cur val_max view_n sag_if_cmd xlabel sag_if_out_tokens \
+               ylabel y2label plotstr has_negative \
+               sag_if_last_time sag_opt_grid sag_opt_whole_day fngr_tmpdir last_graph
+
+       if {$sag_if_archive == ""} {
+               err_msg "Error" "No data source selected for: $view_n($l)"
+               return
+       }
+
+       wm title . "$isag_title: $view_n($l)"
+
+       set prepared [sag_prepare_datafile $l]
+       set nlines  [lindex $prepared 0]
+       set fgrname [lindex $prepared 1]
+
+# at least two lines of data
+       if {$nlines > 1} {
+               set_cur_max $l
+
+               if {1 == $has_negative($l)} {
+                       set yrange "\[-$val_cur($l):$val_cur($l)\]"
+               } else {
+                       set yrange "\[0:$val_cur($l)\]"
+               }
+               set fngr "$fngr_tmpdir/draw.$l"
+               create_gnuplot_file tkcanvas tk $fngr "$view_n($l)" \
+                       "$xlabel" \
+                       "$ylabel($l)" $y2label($l) \
+                       $yrange \
+                       [strrep "$plotstr($l)" __FNGR__ $fgrname] $sag_opt_grid
+
+               exec $gnuplot $fngr.gp
+
+               source $fngr.tk
+               gnuplot .graph.canv
+
+               file delete $fngr.gp
+               file delete $fngr.tk
+               file delete $fngr
+       } else {
+               .graph.canv delete all
+               err_msg "Datafile: $sag_if_archive" "No data to show"
+               .graph.canv delete all
+       }
+       file delete $fgrname
+
+       unset nlines 
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/draw.m4,v $
+###############################################################################
+# Performance Data Processing and Drawing functions
+#      proces line functions
+#
+# $Id: sag.save_graph.m4,v 1.3 2003/02/23 21:07:41 david Exp $
+# $State: Exp $
+# $Log: sag.save_graph.m4,v $
+# Revision 1.3  2003/02/23 21:07:41  david
+# first prototype of sag
+#
+# Revision 1.2  2003/02/23 19:48:16  david
+# unified redundant code which generates data file
+#
+# Revision 1.1  2003/01/26 20:41:49  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.9  2002/03/24 15:18:26  david
+# added
+#
+# Revision 1.8  2002/03/04 20:23:26  david
+# fixed whole day functionality
+#
+# Revision 1.7  2001/07/30 18:06:25  sarrep
+# Fixed one debug print. It was on wrong place.
+#
+# Revision 1.6  2001/03/30 16:42:26  sarrep
+# Fixed bug about _last_time, (mangled graph)
+#
+# Revision 1.5  2001/03/17 17:30:23  sarrep
+# CVSizing, unified headers of each element file
+#
+# Revision 1.4  2001/03/17 16:55:28  sarrep
+# LINUX RESTART zeroes all counters.
+#
+#
+###############################################################################
+
+proc sag_save_graph {} {
+       global sag_if_archive isag_title sh sar grep sar_data_path gnuplot \
+               sag_gr_scale val_cur val_max view_n sag_if_cmd xlabel sag_if_out_tokens \
+               ylabel y2label plotstr has_negative \
+               sag_if_last_time sag_opt_grid sag_opt_whole_day last_graph fngr_tmpdir
+
+               
+       set l $last_graph
+
+       if {$sag_if_archive == ""} {
+#              out_msg "Error" "No data source selected for: $view_n($l)"
+               return
+       }
+
+       set prepared [sag_prepare_datafile $l]
+       set nlines  [lindex $prepared 0]
+       set fgrname [lindex $prepared 1]
+
+# at least two lines of data
+       if {$nlines > 1} {
+#              set_cur_max $l
+
+               if {$val_cur($l) != 0} {
+                       if {1 == $has_negative($l)} {
+                               set yrange "\[-$val_cur($l):$val_cur($l)\]"
+                       } else {
+                               set yrange "\[0:$val_cur($l)\]"
+                       }
+               } else {
+                       set yrange ""
+               }
+
+               set fngr "$fngr_tmpdir/jpeg.$l"
+               create_gnuplot_file jpeg jpg $fngr "$view_n($l)" \
+                       "$xlabel" \
+                       "$ylabel($l)" $y2label($l) \
+                       $yrange \
+                       [strrep "$plotstr($l)" __FNGR__ $fgrname] $sag_opt_grid
+
+               exec $gnuplot $fngr.gp
+
+               file delete $fngr.gp
+               file delete $fngr
+               set filename [tk_getSaveFile -title "Save Picture" \
+                               -initialfile [string map { / _ } $sag_if_archive].$l.jpg \
+                               -filetypes {{{JPEG Images} {.jpg}} {{All files} *}} ]
+               if { "" != $filename } {
+                       file rename -force $fngr.jpg $filename
+               } else {
+                       file delete $fngr.jpg
+               }                       
+
+       } else {
+               .graph.canv delete all
+               err_msg "Datafile: $sag_if_archive" "No data to show"
+       }
+       file delete "$fgrname"
+
+       unset nlines 
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/common/sag.save_graph.m4,v $
+###############################################################################
+# $Id: isag_cfg_file.m4,v 1.10 2004/03/22 19:39:14 david Exp $
+# $State: Exp $
+#
+# $Log: isag_cfg_file.m4,v $
+# Revision 1.10  2004/03/22 19:39:14  david
+# fully avoided shell script, i hope the temp file issue is fixed
+#
+# Revision 1.9  2004/03/22 19:13:18  david
+# eliminated shell script, security issue
+#
+# Revision 1.8  2004/02/27 19:53:28  david
+# hide temporary files
+#
+# Revision 1.7  2004/02/27 19:26:06  david
+# fixed bug: CAN-2004-0108
+#
+# Revision 1.6  2003/01/26 20:41:48  david
+# partially renamed variables, 1st implementation of "Save Graph"
+#
+# Revision 1.5  2002/03/04 20:21:51  david
+# make new end line
+#
+# Revision 1.4  2002/03/04 18:36:37  david
+# grid feature implemented
+#
+# Revision 1.3  2001/03/17 17:30:19  sarrep
+# CVSizing, unified headers of each element file
+#
+#
+#
+###############################################################################
+if {[file isfile $isag_cfg_file] == 1} {
+       source $isag_cfg_file
+
+       if {"" != $last_graph} {
+                               if {$val_max($last_graph) > 0} {
+                       .graph.scale configure -to 0 \
+                               -from $val_max($last_graph)
+                       set sag_gr_scale $val_cur($last_graph)
+                                       }
+       }
+}
+
+if { "" != $sag_latest_file } {
+       catch { set_file $sag_latest_file }
+}      
+
+#
+# Finishing a program and writting of config file
+#
+proc exit_program {} {
+       global isag_cfg_file prog_swtch val_max val_cur last_graph \
+               sag_opt_whole_day sag_opt_grid \
+               fngr_tmpdir
+
+       
+       set fp [open $isag_cfg_file w]
+       foreach l $prog_swtch {
+                                               puts $fp "set val_max($l) $val_max($l)"
+               puts $fp "set val_cur($l) $val_cur($l)"
+       }
+       if {$last_graph == ""} {
+               puts $fp "set last_graph \"\""
+       } else {
+               puts $fp "set last_graph $last_graph"
+       }
+       
+       puts $fp "set sag_opt_whole_day $sag_opt_whole_day"
+       puts $fp "set sag_opt_grid $sag_opt_grid"
+       
+       close $fp
+
+       file delete -force -- "$fngr_tmpdir"
+       destroy .
+       exit
+}
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/isag_cfg_file.m4,v $
+
+# $Source: /var/CVSROOT/cvs/i-sag/isag/isag.m4,v $
diff --git a/contrib/sargraph/sargraph b/contrib/sargraph/sargraph
new file mode 100755 (executable)
index 0000000..2f3e717
--- /dev/null
@@ -0,0 +1,486 @@
+#!/bin/bash
+# sargraph - a simple sketch on how to generate graphs from sadf XML output
+# by Lans.Carstensen@dreamworks.com <Lans Carstensen>
+
+# Our dependencies
+ZENITY="/usr/bin/zenity"
+XSLTPROC="/usr/bin/xsltproc"
+SADF="/usr/local/bin/sadf"
+GNUPLOT="/usr/bin/gnuplot"
+MKTEMP="/bin/mktemp"
+FIND="/usr/bin/find"
+SORT="/bin/sort"
+CUT="/bin/cut"
+
+# sar / sysstat DTD is published here:
+# http://pagesperso-orange.fr/sebastien.godard/sysstat.dtd
+# compare against output of "sadf -x"
+# and pull apart data into gnuplot tabular data files
+
+# Subroutines
+
+# Graph for "sar -u"
+
+cpu_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -u" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./cpu-load/cpu[@number='all']/@user"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./cpu-load/cpu[@number='all']/@nice"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./cpu-load/cpu[@number='all']/@system"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./cpu-load/cpu[@number='all']/@iowait"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./cpu-load/cpu[@number='all']/@steal"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+cpu_gnuplot() {
+    # Create the GNUplot rendering file, largely based on "isag" Tk script from sysstat package
+#set yrange [0:100]
+    cat > $1 <<EOF
+set term x11
+set title "sar -u"
+set ylabel "Percent"
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "%user" with line, "$2" using 1:3 t "%nice" with line, "$2" using 1:4 t "%system" with line, "$2" using 1:5 t "%iowait" with line, "$2" using 1:6 t "%steal" with line
+pause mouse
+EOF
+}
+
+# To output to a file change the gnuplot routines to say something like:
+# set term svg
+# ...
+# set output "/tmp/test.svg"
+# plot ...
+
+# Graph for "sar -q"
+
+rq_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -q" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@runq-sz"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@plist-sz"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@ldavg-1"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@ldavg-5"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@ldavg-15"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+rq_gnuplot() {
+    cat > $1 <<EOF
+set term x11
+set title "sar -q"
+set ylabel ""
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "runq-sz" with line, "$2" using 1:3 t "plist-sz" with line, "$2" using 1:4 t "ldavg-1" with line, "$2" using 1:5 t "ldavg-5" with line, "$2" using 1:6 t "ldavg-15" with line
+pause mouse
+EOF
+}
+
+# Graph for "sar -q", but w/o the process list size
+
+rqnoplistsz_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -q" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@runq-sz"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@ldavg-1"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@ldavg-5"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./queue/@ldavg-15"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+rqnoplistsz_gnuplot() {
+    cat > $1 <<EOF
+set term x11
+set title "sar -q"
+set ylabel ""
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "runq-sz" with line, "$2" using 1:3 t "ldavg-1" with line, "$2" using 1:4 t "ldavg-5" with line, "$2" using 1:5 t "ldavg-15" with line
+pause mouse
+EOF
+}
+
+# Graph for "sar -b"
+
+io_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -b" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./io/tps"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./io/io-reads/@rtps"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./io/io-writes/@wtps"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./io/io-reads/@bread"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./io/io-writes/@bwrtn"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+io_gnuplot() {
+    cat > $1 <<EOF
+set term x11
+set title "sar -b"
+set ylabel "ops/s"
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "rtps" with line, "$2" using 1:3 t "wtps" with line, "$2" using 1:4 t "bread/s" with line,  "$2" using 1:5 t "bwrtn/s" with line
+pause mouse
+EOF
+}
+
+# Graph for "sar -n NFS"
+
+nfsclient_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -n NFS" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./network/net-nfs/@call"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./network/net-nfs/@retrans"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./network/net-nfs/@read"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./network/net-nfs/@write"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./network/net-nfs/@access"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./network/net-nfs/@getatt"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+nfsclient_gnuplot() {
+    cat > $1 <<EOF
+set term x11
+set title "sar -n NFS"
+set ylabel "ops/s"
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "call/s" with line, "$2" using 1:3 t "retrans/s" with line, "$2" using 1:4 t "read/s" with line,  "$2" using 1:5 t "write/s" with line, "$2" using 1:6 t "access/s" with line, "$2" using 1:7 t "getatt/s" with line
+pause mouse
+EOF
+}
+
+# Graph for "sar -B"
+
+paging_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -B" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./paging/@pgpgin"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./paging/@pgpgout"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./paging/@fault"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./paging/@majflt"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+paging_gnuplot() {
+    cat > $1 <<EOF
+set term x11
+set title "sar -B"
+set ylabel "pages/s"
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "pgpgin/s" with line, "$2" using 1:3 t "pgpgout/s" with line, "$2" using 1:4 t "fault/s" with line, "$2" using 1:5 t "majflt/s" with line
+pause mouse
+EOF
+}
+
+# Graph for "sar -r"
+
+memuse_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -r" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/memfree"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/memused"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/buffers"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/cached"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/swpfree"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/swpused"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/swpcad"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+memuse_gnuplot() {
+    cat > $1 <<EOF
+set term x11
+set title "sar -r"
+set ylabel "kB"
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "kbmemfree" with line, "$2" using 1:3 t "kbmemused" with line, "$2" using 1:4 t "kbbuffers" with line, "$2" using 1:5 t "kbcached" with line, "$2" using 1:6 t "swpfree" with line, "$2" using 1:7 t "swpused" with line, "$2" using 1:8 t "swpcad" with line
+pause mouse
+EOF
+}
+
+# Graph for "sar -S"
+
+swapuse_xslt() {
+    # Create the XSLT transform to make a GNUplot data file out of "sar -r" type data
+    # test with "sadf -x | xsltproc <file containing stuff below> -
+    cat > $1 <<EOF
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="*"/>
+<xsl:template match="/sysstat/host/statistics">
+<xsl:text>&#10;</xsl:text>
+<xsl:for-each select="timestamp">
+<xsl:value-of select="@time"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/swpfree"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/swpused"/>
+<xsl:text> </xsl:text>
+<xsl:value-of select="./memory/swpcad"/>
+<xsl:text>&#10;</xsl:text>
+</xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+EOF
+}
+
+swapuse_gnuplot() {
+    cat > $1 <<EOF
+set term x11
+set title "sar -S"
+set ylabel "kB"
+set timefmt "%H:%M:%S"
+set xdata time
+set format x "%H:%M"
+plot "$2" using 1:2 t "swpfree" with line, "$2" using 1:3 t "swpused" with line, "$2" using 1:4 t "swpcad" with line
+pause mouse
+EOF
+}
+
+# Main
+
+while /bin/true; do
+
+# Prompt for sar file
+
+SARLIST=`$FIND /var/log/sa -name 'sa[0-9][0-9]' -printf '%T@,%p\n'| $SORT -n -r | $CUT -d, -f2`
+SARFILE=`$ZENITY --list --text "Select data source" --column "sar file" $SARLIST`
+if [ "$SARFILE" == "" ]; then
+    exit
+fi
+
+# Prompt for graph
+
+GRAPH=`$ZENITY --list --text "Select a graph" --column "Graph Type" "CPU" "Run Queue" "Run Queue w/o Process List Size" "IO Transfer Rate" "NFS Client" "Paging Stats" "Memory Utilization" "Memory Utilization (Swap)"`
+
+case "$GRAPH" in
+    "CPU")
+       XSLTFILE=`mktemp`
+       cpu_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -u | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       cpu_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    "Run Queue")
+       XSLTFILE=`mktemp`
+       rq_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -q | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       rq_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    "Run Queue w/o Process List Size")
+       XSLTFILE=`mktemp`
+       rqnoplistsz_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -q | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       rqnoplistsz_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    "IO Transfer Rate")
+       XSLTFILE=`mktemp`
+       io_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -b | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       io_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    "NFS Client")
+       XSLTFILE=`mktemp`
+       nfsclient_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -n NFS | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       nfsclient_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    "Paging Stats")
+       XSLTFILE=`mktemp`
+       paging_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -B | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       paging_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    "Memory Utilization")
+       XSLTFILE=`mktemp`
+       memuse_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -r | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       memuse_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    "Memory Utilization (Swap)")
+       XSLTFILE=`mktemp`
+       swapuse_xslt $XSLTFILE
+       DATAFILE=`mktemp`
+       $SADF -t -x $SARFILE -- -S | $XSLTPROC --novalid $XSLTFILE - > $DATAFILE
+       GNUPLOTFILE=`mktemp`
+       swapuse_gnuplot $GNUPLOTFILE $DATAFILE
+       $GNUPLOT $GNUPLOTFILE
+       rm $GNUPLOTFILE
+       rm $DATAFILE
+       rm $XSLTFILE
+       ;;
+    *)
+       # If you click "Cancel", you end up here and exit
+       exit
+       ;;
+esac
+
+done
+
+exit
+
diff --git a/crontab.sample b/crontab.sample
new file mode 100644 (file)
index 0000000..ddb26fc
--- /dev/null
@@ -0,0 +1,19 @@
+# Crontab sample for root or adm
+# Please update this crontab with the proper location
+# for sa1 and sa2 shell scripts (replace @SA_LIB_DIR@ with
+# /usr/lib/sa for example).
+#
+# 8am-7pm activity reports every 20 minutes during weekdays.
+# 0 8-18 * * 1-5 @SA_LIB_DIR@/sa1 1200 3 &
+# activity reports every @CRON_INTERVAL@ minutes everyday.
+0 * * * * @SA_LIB_DIR@/sa1 @CRON_INTERVAL_SEC@ @CRON_COUNT@ &
+#
+# Activity reports every an hour on Saturday and Sunday.
+# 0 * * * 0,6 @SA_LIB_DIR@/sa1 &
+#
+# 7pm-8am activity reports every an hour during weekdays.
+# 0 19-7 * * 1-5 @SA_LIB_DIR@/sa1 &
+#
+# Daily summary prepared at 19:05.
+# 5 19 * * 1-5 @SA_LIB_DIR@/sa2 -A &
+5 19 * * * @SA_LIB_DIR@/sa2 -A &
diff --git a/iconfig b/iconfig
new file mode 100755 (executable)
index 0000000..987ca4f
--- /dev/null
+++ b/iconfig
@@ -0,0 +1,185 @@
+#!/bin/sh
+#@(#) Configuration script for sysstat
+# (C) 2000-2010 Sebastien GODARD (sysstat <at> orange.fr)
+
+ASK="sh build/Ask.sh"
+
+echo ; echo
+echo Welcome to sysstat\'s  Interactive Configuration script!
+echo
+echo This script enables you to set the parameters value used by ./configure.
+echo Please enter the value for the parameters listed below.
+echo Press Return to tell ./configure to use the default value or to try to guess the proper one.
+echo "Defaut value for yes/no questions is no (parameter is NOT set)."
+echo You can enter a ? to display a help message at any time...
+echo
+
+# Syntax: Ask <QUESTION> <PARM> <TEXT_FILE>
+
+# Installation directory
+PREFIX=`${ASK} 'Installation directory:' "--prefix" "prefix"`
+if [ "${PREFIX}" != "" ]; then
+       PREFIX="--prefix=${PREFIX} "
+fi
+
+# sadc directory
+SA_LIB_DIR=`${ASK} 'sadc directory:' "sa_lib_dir" "sa_lib_dir"`
+if [ "${SA_LIB_DIR}" != "" ]; then
+       SA_LIB_DIR="sa_lib_dir=${SA_LIB_DIR} "
+fi
+
+# System Activity directory
+SA_DIR=`${ASK} 'System activity directory:' "sa_dir" "sa_dir"`
+if [ "${SA_DIR}" != "" ]; then
+       SA_DIR="sa_dir=${SA_DIR} "
+fi
+
+# sysstat configuration directory
+SYSCONFIG_DIR=`${ASK} 'sysstat configuration directory:' "conf_dir" "conf_dir"`
+if [ "${SYSCONFIG_DIR}" != "" ]; then
+       SYSCONFIG_DIR="conf_dir=${SYSCONFIG_DIR} "
+fi
+
+# Clean sa directory
+CLEAN_SA_DIR=`${ASK} 'Clean system activity directory? (y/n)' "--enable-clean-sa-dir" "clean-sa-dir"`
+if [ "${CLEAN_SA_DIR}" = "y" ]; then
+       CLEAN_SA_DIR="--enable-clean-sa-dir "
+else
+       CLEAN_SA_DIR=""
+       echo "Parameter --enable-clean-sa-dir is NOT set"
+fi
+
+# National Language Support
+NLS=`${ASK} 'Disable National Language Support (NLS)? (y/n)' "--disable-nls" "nls"`
+if [ "${NLS}" = "y" ]; then
+       NLS="--disable-nls "
+else
+       NLS=""
+       echo "Parameter --disable-nls is NOT set"
+fi
+
+# Sensors support
+SENSORS=`${ASK} 'Disable sensors support? (y/n)' "--disable-sensors" "sensors"`
+if [ "${SENSORS}" = "y" ]; then
+       SENSORS="--disable-sensors "
+else
+       SENSORS=""
+       echo "Parameter --disable-sensors is NOT set"
+fi
+
+# sa2 processes data file of the day before
+YESTERDAY=`${ASK} 'sa2 uses daily data file of the day before? (y/n)' "--enable-yesterday" "yesterday"`
+if [ "${YESTERDAY}" = "y" ]; then
+       YESTERDAY="--enable-yesterday "
+else
+       YESTERDAY=""
+       echo "Parameter --enable-yesterday is NOT set"
+fi
+
+# Data history to keep by sa2
+HISTORY=`${ASK} 'Number of daily data files to keep:' "history" "history"`
+if [ "${HISTORY}" != "" ]; then
+       HISTORY="history=${HISTORY} "
+fi
+
+# Delay after which datafiles are to be compressed
+COMPRESSAFTER=`${ASK} 'Number of days after which sar datafiles must be compressed:' "compressafter" "compressafter"`
+if [ "${COMPRESSAFTER}" != "" ]; then
+       COMPRESSAFTER="compressafter=${COMPRESSAFTER} "
+fi
+
+# Manual page group
+MAN=`${ASK} 'Group for manual pages:' "man_group" "man_group"`
+if [ "${MAN}" != "" ]; then
+       MAN="man_group=${MAN} "
+fi
+
+# Ignore man_group variable
+IGNORE_MAN=`${ASK} 'Ignore contents of man_group variable? (y/n)' "--disable-man-group" "ignore-man-group"`
+if [ "${IGNORE_MAN}" = "y" ]; then
+       IGNORE_MAN="--disable-man-group "
+else
+       IGNORE_MAN=""
+       echo "Parameter --disable-man-group is NOT set"
+fi
+
+# Crontab
+CRON=`${ASK} 'Set crontab to start sar automatically? (y/n)' "--enable-install-cron" "install-cron"`
+if [ "${CRON}" = "y" ]; then
+       CRON="--enable-install-cron "
+else
+       CRON=""
+       echo "Parameter --enable-install-cron is NOT set"
+fi
+
+if [ "${CRON}" != "" ];
+then
+       CRON_OWNER=`${ASK} 'Crontab owner:' "cron_owner" "cron_owner"`
+       if [ "${CRON_OWNER}" != "" ]; then
+               CRON="${CRON}cron_owner=${CRON_OWNER} "
+       fi
+fi
+
+if [ "${CRON}" != "" ];
+then
+       CRON_INTERVAL=`${ASK} 'Crontab sampling interval (in minutes):' "cron_interval" "cron_interval"`
+       if [ "${CRON_INTERVAL}" != "" ]; then
+               CRON="${CRON}cron_interval=${CRON_INTERVAL} "
+       fi
+fi
+
+if [ "${CRON}" != "" ];
+then
+       # rc directory
+       RCDIR=`${ASK} 'rc directory:' "rcdir" "rcdir"`
+       if [ "${RCDIR}" != "" ]; then
+               RCDIR="rcdir=${RCDIR} "
+       fi
+fi
+
+# Compress manual pages
+COMPRESSMANPG=`${ASK} 'Compress manual pages? (y/n)' "--enable-compress-manpg" "compress-manpg"`
+if [ "${COMPRESSMANPG}" = "y" ]; then
+       COMPRESSMANPG="--enable-compress-manpg "
+else
+       COMPRESSMANPG=""
+       echo "Parameter --enable-compress-manpg is NOT set"
+fi
+
+# Install documentation
+INSTALL_DOC=`${ASK} 'Skip documentation installation? (y/n)' "--disable-documentation" "install-doc"`
+if [ "${INSTALL_DOC}" = "y" ]; then
+       INSTALL_DOC="--disable-documentation "
+else
+       INSTALL_DOC=""
+       echo "Parameter --disable-documentation is NOT set"
+fi
+
+# Debug mode
+DEBUGINFO=`${ASK} 'Debug mode support? (y/n)' "--enable-debuginfo" "debuginfo"`
+if [ "${DEBUGINFO}" = "y" ]; then
+       DEBUGINFO="--enable-debuginfo "
+else
+       DEBUGINFO=""
+       echo "Parameter --enable-debuginfo is NOT set"
+fi
+
+# Install isag script
+INSTALL_ISAG=`${ASK} 'Install isag script? (y/n)' "--enable-install-isag" "install-isag"`
+if [ "${INSTALL_ISAG}" = "y" ]; then
+       INSTALL_ISAG="--enable-install-isag "
+else
+       INSTALL_ISAG=""
+       echo "Parameter --enable-install-isag is NOT set"
+fi
+
+echo
+echo "./configure ${PREFIX}${SA_LIB_DIR}${SA_DIR}${SYSCONFIG_DIR}${CLEAN_SA_DIR}${NLS} \
+${YESTERDAY}${HISTORY}${COMPRESSAFTER}${MAN}${IGNORE_MAN}${CRON}${RCDIR} \
+${COMPRESSMANPG}${INSTALL_DOC}${DEBUGINFO}${INSTALL_ISAG}${SENSORS}"
+echo
+
+./configure ${PREFIX}${SA_LIB_DIR}${SA_DIR}${SYSCONFIG_DIR}${CLEAN_SA_DIR}${NLS} \
+${YESTERDAY}${HISTORY}${COMPRESSAFTER}${MAN}${IGNORE_MAN}${CRON}${RCDIR} \
+${COMPRESSMANPG}${INSTALL_DOC}${DEBUGINFO}${INSTALL_ISAG}${SENSORS}
+
diff --git a/ioconf.c b/ioconf.c
new file mode 100644 (file)
index 0000000..b6b9994
--- /dev/null
+++ b/ioconf.c
@@ -0,0 +1,515 @@
+/*
+ * ioconf: ioconf configuration file handling code
+ * Original code (C) 2004 by Red Hat (Charlie Bennett <ccb@redhat.com>)
+ *
+ * Modified and maintained by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#include "ioconf.h"
+#include "common.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+static unsigned int ioc_parsed = 0;
+static struct ioc_entry *ioconf[MAX_BLKDEV + 1];
+static unsigned int ioc_refnr[MAX_BLKDEV + 1];
+
+/*
+ ***************************************************************************
+ * Free ioc_entry structures
+ ***************************************************************************
+ */
+static void ioc_free(void)
+{
+       unsigned int i;
+       struct ioc_entry **p;
+
+       /* Take out all of the references first */
+       for (i = 0, p = ioconf; i < MAX_BLKDEV; ++i, ++p) {
+               if ((*p == NULL) || ((*p)->live))
+                       continue;
+
+               if ((*p)->desc != (*p)->blkp->desc) {
+                       /* Not a shared description */
+                       free((*p)->desc);
+               }
+               free(*p);
+               *p = NULL;
+       }
+
+       /* Now the live ones */
+       for (i = 0, p = ioconf; i < MAX_BLKDEV; ++i, ++p) {
+               if (*p == NULL)
+                       continue;
+               free((*p)->blkp);
+               free(*p);
+               *p = NULL;
+       }
+}
+
+/*
+ ***************************************************************************
+ * ioc_conv - Turn a number into a string in radix <radix> using symbol
+ *   set (and ordering) syms.  Use nozero to generate strings
+ *   in which the number system uses a single sym for the
+ *   radix value (not 2, like decimal) and adds a column only
+ *   at radix+1.  If decimal were like this:
+ *
+ *   (no zero) 1 2 3 4 5 6 7 8 9 0 11 12 13 14 15 16 17 18 19 10 ...
+ ***************************************************************************
+ */
+static char *ioc_conv(int radix, int nozero, const char *syms,
+                     unsigned int val)
+{
+       static char out[17];
+       char *p;
+       int j;
+
+       *(p = out + 16) = '\0';
+
+       val += nozero;
+
+       if (val == 0) {
+               if (!nozero) {
+                       *--p = '0';
+               }
+               return (p);     /* Empty string if nozero radix gets val == 0 */
+       }
+
+       while (val > 0) {
+               *--p = syms[j = val % radix];
+               val /= radix;
+               if (nozero && (j == 0)) {
+                       /* Comp for 10 in nozero bases */
+                       --val;
+               }
+       }
+       return (p);
+}
+
+char *ioc_ito10(unsigned int n)
+{
+       return (ioc_conv(10, 0, "0123456789", n));
+}
+
+char *ioc_ito26(unsigned int n)
+{
+       return (ioc_conv(26, 1, "zabcdefghijklmnopqrstuvwxy", n));
+}
+
+/*
+ ***************************************************************************
+ * ioc_init() - internalize the ioconf file
+ *
+ * given:    void
+ * does:     parses IOCONF into ioconf, an array of ioc_entry *
+ *           Only entries having lines in IOCONF will have valid pointers
+ * return:   1 on success
+ *           0 on failure
+ ***************************************************************************
+ */
+int ioc_init(void)
+{
+       FILE *fp;
+       unsigned int i, major, indirect, count = 0;
+       char buf[IOC_LINESIZ + 1];
+       char cfmt[IOC_FMTLEN + 1];
+       char dfmt[IOC_FMTLEN + 1];
+       char pfmt[IOC_FMTLEN + 1];
+       char desc[IOC_DESCLEN + 1];
+       struct ioc_entry  *iocp = NULL;
+       struct blk_config *blkp = NULL;
+       char ioconf_name[64];
+
+       if ((fp = fopen(IOCONF, "r")) == NULL) {
+               if ((fp = fopen(LOCAL_IOCONF, "r")) == NULL)
+                       return 0;
+               strncpy(ioconf_name, LOCAL_IOCONF, 64);
+       }
+       else {
+               strncpy(ioconf_name, IOCONF, 64);
+       }
+       ioconf_name[63] = '\0';
+       
+       /* Init ioc_refnr array */
+       memset(ioc_refnr, 0, sizeof(ioc_refnr));
+
+       while (fgets(buf, IOC_LINESIZ, fp)) {
+
+               if ((*buf == '#') || (*buf == '\n'))
+                       continue;
+
+               /*
+                * Preallocate some (probably) needed data structures
+                */
+               IOC_ALLOC(blkp, struct blk_config, BLK_CONFIG_SIZE);
+               IOC_ALLOC(iocp, struct ioc_entry, IOC_ENTRY_SIZE);
+               memset(blkp, 0, BLK_CONFIG_SIZE);
+               memset(iocp, 0, IOC_ENTRY_SIZE);
+
+               i = sscanf(buf, "%u:%u:%u:%s",
+                          &major, &indirect, &iocp->ctrlno, desc);
+
+               if (i != 4) {
+                       i = sscanf(buf, "%u:%u:%u",
+                                  &major, &indirect, &iocp->ctrlno);
+               }
+
+               if ((i == 3) || (i == 4)) {
+                       /* indirect record */
+                       if (indirect == 0) {
+                               /* conventional usage for unsupported device */
+                               continue;
+                       }
+                       if (indirect >= MAX_BLKDEV) {
+                               fprintf(stderr, "%s: Indirect major #%u out of range\n",
+                                       ioconf_name, indirect);
+                               continue;
+                       }
+                       if (ioconf[indirect] == NULL) {
+                               fprintf(stderr,
+                                       "%s: Indirect record '%u:%u:%u:...'"
+                                       " references not yet seen major %u\n",
+                                       ioconf_name, major, indirect, iocp->ctrlno, major);
+                               continue;
+                       }
+                       /*
+                        * Cool. Point this device at its referent.
+                        * Skip last: (last field my be empty...)
+                        * if it was empty and : was in the sscanf spec
+                        * we'd only see 3 fields...
+                        */
+                       if (i == 3) {
+                               /* reference the mothership */
+                               iocp->desc = ioconf[indirect]->blkp->desc;
+                       }
+                       else {
+                               IOC_ALLOC(iocp->desc, char, IOC_DESCLEN + 1);
+                               strncpy(iocp->desc, desc, IOC_DESCLEN);
+                       }
+                       ioc_refnr[indirect]++;
+                       ioconf[major] = iocp;
+                       iocp->basemajor = indirect;
+                       iocp->blkp = ioconf[indirect]->blkp;
+                       iocp->live = 0;
+                       iocp = NULL;
+                       continue;
+                       /* all done with indirect record */
+               }
+
+               /* maybe it's a full record? */
+
+               i = sscanf(buf, "%u:%[^:]:%[^:]:%d:%[^:]:%u:%[^:]:%u:%s",
+                          &major, blkp->name,
+                          cfmt, &iocp->ctrlno,
+                          dfmt, &blkp->dcount,
+                          pfmt, &blkp->pcount,
+                          desc);
+
+               if (i != 9) {
+                       fprintf(stderr, "%s: Malformed %d field record: %s\n",
+                               ioconf_name, i, buf);
+                       continue;
+               }
+
+               /* this is a full-fledged direct record */
+
+               if ((major == 0) || (major >= MAX_BLKDEV)) {
+                       fprintf(stderr, "%s: major #%u out of range\n",
+                               __FUNCTION__, major);
+                       continue;
+               }
+
+               /* is this an exception record? */
+               if (*cfmt == 'x') {
+                       struct blk_config *xblkp;
+
+                       /*
+                        * device has an aliased minor
+                        * for now we only support on exception per major
+                        * (catering to initrd: (1,250))
+                        */
+                       if (ioconf[major] == NULL) {
+                               fprintf(stderr, "%s: type 'x' record for"
+                                       " major #%u must follow the base record - ignored\n",
+                                       ioconf_name, major);
+                               continue;
+                       }
+                       xblkp = ioconf[major]->blkp;
+
+                       if (xblkp->ext) {
+                               /*
+                                * Enforce one minor exception per major policy
+                                * note: this applies to each major number and
+                                * all of it's indirect (short form) majors
+                                */
+                               fprintf(stderr, "%s: duplicate 'x' record for"
+                                       " major #%u - ignored\ninput line: %s\n",
+                                       ioconf_name, major, buf);
+                               continue;
+                       }
+                       /*
+                        * Decorate the base major struct with the
+                        * exception info
+                        */
+                       xblkp->ext_minor = iocp->ctrlno;
+                       strcpy(xblkp->ext_name, blkp->name);
+                       xblkp->ext = 1;
+                       continue;
+               }
+
+               /*
+                * Preformat the sprintf format strings for generating
+                * c-d-p info in ioc_name()
+                */
+
+               /* basename of device + provided string + controller # */
+               if (*cfmt == '*') {
+                       strcpy(blkp->cfmt, blkp->name);
+               }
+               else {
+                       sprintf(blkp->cfmt, "%s%s%%d", blkp->name, cfmt);
+                       ++(blkp->ctrl_explicit);
+               }
+
+               /* Disk */
+               *blkp->dfmt = '\0';
+               switch (*dfmt) {
+               case 'a':
+                       blkp->cconv = ioc_ito26;
+                       strcpy(blkp->dfmt, "%s");
+                       break;
+
+               case '%':
+                       strcpy(blkp->dfmt, dfmt + 1);
+               case 'd':
+                       blkp->cconv = ioc_ito10;
+                       strcat(blkp->dfmt, "%s");
+                       break;
+               }
+
+               /* Partition */
+               sprintf(blkp->pfmt, "%s%%d", (*pfmt == '*') ? "" : pfmt);
+
+               /*
+                * We're good to go.
+                * Stuff the ioc_entry and ref it.
+                */
+               iocp->live = 1;
+               iocp->blkp = blkp;
+               iocp->desc = NULL;
+               iocp->basemajor = major;
+               ioconf[major] = iocp;
+               strncpy(blkp->desc, desc, IOC_DESCLEN);
+               blkp = NULL; iocp = NULL;
+               ++count;
+       }
+       fclose(fp);
+
+       /*
+        * These will become leaks if we ever 'continue'
+        * after IOC_ALLOC( blkp->desc ... ).
+        * Right Now, we don't.
+        */
+       if (blkp != NULL)
+               free(blkp);
+       if (iocp != NULL)
+               free(iocp);
+
+       /* Indicate that ioconf file has been parsed */
+       ioc_parsed = 1;
+
+       return (count);
+}
+
+/*
+ ***************************************************************************
+ *  ioc_name() - Generate a name from a maj,min pair
+ *
+ * IN:
+ * @major      Device major number.
+ * @minor      Device minor number.
+ *
+ * RETURNS:
+ * Returns NULL if major or minor are out of range
+ * otherwise returns a pointer to a static string containing
+ * the generated name.
+ ***************************************************************************
+ */
+
+char *ioc_name(unsigned int major, unsigned int minor)
+{
+       static char name[IOC_DEVLEN + 1];
+       struct ioc_entry *p;
+       int base, offset;
+
+       if ((MAX_BLKDEV <= major) || (IOC_MAXMINOR <= minor)) {
+               return (NULL);
+       }
+
+       if (!ioc_parsed && !ioc_init())
+               return (NULL);
+
+       p = ioconf[major];
+
+       /* Invalid major or minor numbers? */
+       if ((p == NULL) || ((minor & 0xff) >= (p->blkp->dcount * p->blkp->pcount))) {
+               /*
+                * That minor test is only there for IDE-style devices
+                * that have no minors over 128.
+                */
+               strcpy(name, K_NODEV);
+               return (name);
+       }
+
+       /* Is this an extension record? */
+       if (p->blkp->ext && (p->blkp->ext_minor == minor)) {
+               strcpy(name, p->blkp->ext_name);
+               return (name);
+       }
+
+       /* OK.  we're doing an actual device name... */
+
+       /*
+        * Assemble base + optional controller info
+        * this is of course too clever by half
+        * the parser has already cooked cfmt, dfmt to make this easy
+        * (we parse once but may generate lots of names)
+        */
+       base = p->ctrlno * p->blkp->dcount;
+       if (minor >= 256) {
+               base += p->blkp->dcount * (ioc_refnr[p->basemajor] + 1) * (minor >> 8);
+       }
+
+       offset = (minor & 0xff) / p->blkp->pcount;
+       if (!p->blkp->ctrl_explicit) {
+               offset += base;
+       }
+
+       /*
+        * These sprintfs can't be coalesced because the first might
+        * ignore its first arg
+        */
+       sprintf(name, p->blkp->cfmt, p->ctrlno);
+       sprintf(name + strlen(name), p->blkp->dfmt, p->blkp->cconv(offset));
+
+       if (!IS_WHOLE(major, minor)) {
+               /*
+                * Tack on partition info, format string cooked (curried?) by
+                * the parser
+                */
+               sprintf(name + strlen(name), p->blkp->pfmt, minor % p->blkp->pcount);
+       }
+       return (name);
+}
+
+/*
+ ***************************************************************************
+ * Check whether a device is a whole disk device or not.
+ *
+ * IN:
+ * @major      Device major number.
+ * @minor      Device minor number.
+ *
+ * RETURNS:
+ * Predicate: Returns 1 if dev (major,minor) is a whole disk device.
+ *            Returns 0 otherwise.
+ ***************************************************************************
+ */
+int ioc_iswhole(unsigned int major, unsigned int minor)
+{
+       if (!ioc_parsed && !ioc_init())
+               return 0;
+
+       if (major >= MAX_BLKDEV)
+               /*
+                * Later: Handle Linux long major numbers here.
+                * Now: This is an error.
+                */
+               return 0;
+
+       if (ioconf[major] == NULL)
+               /* Device not registered */
+               return 0 ;
+
+       return (IS_WHOLE(major, minor));
+}
+
+/*
+ ***************************************************************************
+ * Transform device mapper name: Get the user assigned name of the logical
+ * device instead of the internal device mapper numbering.
+ *
+ * IN:
+ * @major      Device major number.
+ * @minor      Device minor number.
+ *
+ * RETURNS:
+ * Assigned name of the logical device.
+ ***************************************************************************
+ */
+char *transform_devmapname(unsigned int major, unsigned int minor)
+{
+       DIR *dm_dir;
+       struct dirent *dp;
+       char filen[MAX_FILE_LEN];
+       char *dm_name = NULL;
+       struct stat aux;
+       unsigned int dm_major, dm_minor;
+
+       if ((dm_dir = opendir(DEVMAP_DIR)) == NULL) {
+               fprintf(stderr, _("Cannot open %s: %s\n"), DEVMAP_DIR, strerror(errno));
+               exit(4);
+       }
+
+       while ((dp = readdir(dm_dir)) != NULL) {
+               /* For each file in DEVMAP_DIR */
+
+               snprintf(filen, MAX_FILE_LEN, "%s/%s", DEVMAP_DIR, dp->d_name);
+               filen[MAX_FILE_LEN - 1] = '\0';
+
+               if (stat(filen, &aux) == 0) {
+                       /* Get its minor and major numbers */
+
+                       dm_major = ((aux.st_rdev >> 8) & 0xff);
+                       dm_minor = (aux.st_rdev & 0xff);
+       
+                       if ((dm_minor == minor) && (dm_major == major)) {
+                               dm_name = dp->d_name;
+                               break;
+                       }
+               }
+       }
+       closedir(dm_dir);
+
+       return dm_name;
+}
diff --git a/ioconf.h b/ioconf.h
new file mode 100644 (file)
index 0000000..c704cf8
--- /dev/null
+++ b/ioconf.h
@@ -0,0 +1,84 @@
+/*
+ * ioconf: ioconf configuration file handling code
+ * Original code (C) 2004 by Red Hat (Charlie Bennett <ccb@redhat.com>)
+ *
+ * Modified and maintained by Sebastien GODARD (sysstat <at> orange.fr)
+ */
+
+#ifndef _IOCONF_H
+#define _IOCONF_H
+
+#include "sysconfig.h"
+
+#define IOC_NAMELEN    31
+#define IOC_DESCLEN    63
+#define IOC_DEVLEN     47
+#define IOC_MAXMINOR   2047
+#define IOC_LINESIZ    255
+#define IOC_PARTLEN    7
+#define IOC_FMTLEN     15
+
+#ifndef MAX_BLKDEV
+#define MAX_BLKDEV     255
+#endif
+
+#define K_NODEV        "nodev"
+
+#define IS_WHOLE(maj,min)      ((min % ioconf[maj]->blkp->pcount) == 0)
+
+/*
+ * When is C going to get templates?
+ */
+#define IOC_ALLOC(P,TYPE,SIZE)                 \
+     do {                                      \
+         if (P == NULL) {                      \
+              P = (TYPE *) malloc(SIZE);       \
+              if (P == NULL) {                 \
+                   perror("malloc");           \
+                   ioc_free();                 \
+                   return 0;                   \
+              }                                        \
+         }                                     \
+     }                                         \
+     while (0)
+/* That dummy while allows ';' on the line that invokes the macro... */
+
+
+struct blk_config {
+       char name[IOC_NAMELEN + 1];     /* device basename */
+       char cfmt[IOC_FMTLEN + 1];      /* controller format string */
+       char dfmt[IOC_FMTLEN + 1];      /* disk format string */
+       char pfmt[IOC_FMTLEN + 1];      /* partition format string */
+       /* ctrlno is in the ioc_entry */
+       unsigned int ctrl_explicit;     /* use "cN" in name */
+       unsigned int dcount;            /* number of devices handled by this major */
+       unsigned int pcount;            /* partitions per device */
+       char desc[IOC_DESCLEN + 1];
+       /* disk info unit # conversion function */
+       char *(*cconv)(unsigned int);
+
+       /* extension properties (all this for initrd?) */
+       char ext_name[IOC_NAMELEN + 1];
+       unsigned int ext;               /* flag - this is an extension record */
+       unsigned int ext_minor;         /* which minor does this apply to */
+};
+
+#define BLK_CONFIG_SIZE        (sizeof(struct blk_config))
+
+
+struct ioc_entry {
+       int live;                       /* is this a Direct entry? */
+       unsigned int ctrlno;            /* controller number */
+       unsigned int basemajor;         /* Major number of the template */
+       char *desc;                     /* (dynamic) per-controller description */
+       struct blk_config *blkp;        /* the real info, may be a shared ref */
+};
+
+#define IOC_ENTRY_SIZE (sizeof(struct ioc_entry))
+
+
+extern int   ioc_iswhole(unsigned int, unsigned int);
+extern char *ioc_name(unsigned int, unsigned int);
+extern char *transform_devmapname(unsigned int, unsigned int);
+
+#endif
diff --git a/iostat.c b/iostat.c
new file mode 100644 (file)
index 0000000..0b98b16
--- /dev/null
+++ b/iostat.c
@@ -0,0 +1,1325 @@
+/*
+ * iostat: report CPU and I/O statistics
+ * (C) 1998-2009 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <time.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/utsname.h>
+
+#include "version.h"
+#include "iostat.h"
+#include "common.h"
+#include "ioconf.h"
+#include "rd_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": " __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+struct stats_cpu *st_cpu[2];
+unsigned long long uptime[2]  = {0, 0};
+unsigned long long uptime0[2] = {0, 0};
+struct io_stats *st_iodev[2];
+struct io_hdr_stats *st_hdr_iodev;
+struct io_dlist *st_dev_list;
+
+int iodev_nr = 0;      /* Nb of devices and partitions found */
+int cpu_nr = 0;                /* Nb of processors on the machine */
+int dlist_idx = 0;     /* Nb of devices entered on the command line */
+int flags = 0;         /* Flag for common options and system state */
+
+long interval = 0;
+char timestamp[64];
+
+
+/*
+ ***************************************************************************
+ * Print usage and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command.
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+       fprintf(stderr, _("Usage: %s [ options ] [ <interval> [ <count> ] ]\n"),
+               progname);
+#ifdef DEBUG
+       fprintf(stderr, _("Options are:\n"
+                         "[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+                         "[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"));
+#else
+       fprintf(stderr, _("Options are:\n"
+                         "[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+                         "[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"));
+#endif
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * Set disk output unit. Unit will be kB/s unless POSIXLY_CORRECT
+ * environment variable has been set, in which case the output will be
+ * expressed in blocks/s.
+ ***************************************************************************
+ */
+void set_disk_output_unit(void)
+{
+       char *e;
+       
+       if (DISPLAY_KILOBYTES(flags) || DISPLAY_MEGABYTES(flags))
+               return;
+
+       /* Check POSIXLY_CORRECT environment variable */
+       if ((e = getenv(ENV_POSIXLY_CORRECT)) == NULL) {
+               /* Variable not set: Unit is kB/s and not blocks/s */
+               flags |= I_D_KILOBYTES;
+       }
+}
+
+/*
+ ***************************************************************************
+ * SIGALRM signal handler.
+ *
+ * IN:
+ * @sig        Signal number. Set to 0 for the first time, then to SIGALRM.
+ ***************************************************************************
+ */
+void alarm_handler(int sig)
+{
+       signal(SIGALRM, alarm_handler);
+       alarm(interval);
+}
+
+/*
+ ***************************************************************************
+ * Initialize stats common structures.
+ ***************************************************************************
+ */
+void init_stats(void)
+{
+       int i;
+       
+       /* Allocate structures for CPUs "all" and 0 */
+       for (i = 0; i < 2; i++) {
+               if ((st_cpu[i] = (struct stats_cpu *) malloc(STATS_CPU_SIZE * 2)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(st_cpu[i], 0, STATS_CPU_SIZE * 2);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Set every disk_io entry to inactive state (unregistered).
+ *
+ * IN:
+ * @ioln_nr    Number of devices and partitions.
+ * @st_hdr_ioln        Pointer on first structure describing a device/partition.
+ ***************************************************************************
+ */
+void set_entries_inactive(int ioln_nr, struct io_hdr_stats *st_hdr_ioln)
+{
+       int i;
+       struct io_hdr_stats *shi = st_hdr_ioln;
+
+       for (i = 0; i < ioln_nr; i++, shi++) {
+               shi->active = FALSE;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free inactive entries (mark them as unused).
+ *
+ * IN:
+ * @ioln_nr    Number of devices and partitions.
+ * @st_hdr_ioln        Pointer on first structure describing a device/partition.
+ ***************************************************************************
+ */
+void free_inactive_entries(int ioln_nr, struct io_hdr_stats *st_hdr_ioln)
+{
+       int i;
+       struct io_hdr_stats *shi = st_hdr_ioln;
+
+       for (i = 0; i < ioln_nr; i++, shi++) {
+               if (!shi->active) {
+                       shi->used = FALSE;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Allocate and init I/O device structures.
+ *
+ * IN:
+ * @iodev_nr   Number of devices and partitions.
+ ***************************************************************************
+ */
+void salloc_device(int iodev_nr)
+{
+       int i;
+
+       for (i = 0; i < 2; i++) {
+               if ((st_iodev[i] =
+                    (struct io_stats *) malloc(IO_STATS_SIZE * iodev_nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(st_iodev[i], 0, IO_STATS_SIZE * iodev_nr);
+       }
+
+       if ((st_hdr_iodev =
+            (struct io_hdr_stats *) malloc(IO_HDR_STATS_SIZE * iodev_nr)) == NULL) {
+               perror("malloc");
+               exit(4);
+       }
+       memset(st_hdr_iodev, 0, IO_HDR_STATS_SIZE * iodev_nr);
+}
+
+/*
+ ***************************************************************************
+ * Allocate structures for devices entered on the command line.
+ *
+ * IN:
+ * @list_len   Number of arguments on the command line.
+ ***************************************************************************
+ */
+void salloc_dev_list(int list_len)
+{
+       if ((st_dev_list = (struct io_dlist *) malloc(IO_DLIST_SIZE * list_len)) == NULL) {
+               perror("malloc");
+               exit(4);
+       }
+       memset(st_dev_list, 0, IO_DLIST_SIZE * list_len);
+}
+
+/*
+ ***************************************************************************
+ * Free structures used for devices entered on the command line.
+ ***************************************************************************
+ */
+void sfree_dev_list(void)
+{
+       if (st_dev_list) {
+               free(st_dev_list);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Look for the device in the device list and store it if necessary.
+ *
+ * IN:
+ * @dlist_idx  Length of the device list.
+ * @device_name        Name of the device.
+ *
+ * OUT:
+ * @dlist_idx  Length of the device list.
+ *
+ * RETURNS:
+ * Position of the device in the list.
+ ***************************************************************************
+ */
+int update_dev_list(int *dlist_idx, char *device_name)
+{
+       int i;
+       struct io_dlist *sdli = st_dev_list;
+
+       for (i = 0; i < *dlist_idx; i++, sdli++) {
+               if (!strcmp(sdli->dev_name, device_name))
+                       break;
+       }
+
+       if (i == *dlist_idx) {
+               /* Device not found: Store it */
+               (*dlist_idx)++;
+               strncpy(sdli->dev_name, device_name, MAX_NAME_LEN - 1);
+       }
+
+       return i;
+}
+
+/*
+ ***************************************************************************
+ * Allocate and init structures, according to system state.
+ ***************************************************************************
+ */
+void io_sys_init(void)
+{
+       /* Allocate and init stat common counters */
+       init_stats();
+
+       /* How many processors on this machine? */
+       cpu_nr = get_cpu_nr(~0);
+
+       /* Get number of block devices and partitions in /proc/diskstats */
+       if ((iodev_nr = get_diskstats_dev_nr(CNT_PART, CNT_ALL_DEV)) > 0) {
+               flags |= I_F_HAS_DISKSTATS;
+               iodev_nr += NR_DEV_PREALLOC;
+       }
+
+       if (!HAS_DISKSTATS(flags) ||
+           (DISPLAY_PARTITIONS(flags) && !DISPLAY_PART_ALL(flags))) {
+               /*
+                * If /proc/diskstats exists but we also want stats for the partitions
+                * of a particular device, stats will have to be found in /sys. So we
+                * need to know if /sys is mounted or not, and set flags accordingly.
+                */
+
+               /* Get number of block devices (and partitions) in sysfs */
+               if ((iodev_nr = get_sysfs_dev_nr(DISPLAY_PARTITIONS(flags))) > 0) {
+                       flags |= I_F_HAS_SYSFS;
+                       iodev_nr += NR_DEV_PREALLOC;
+               }
+               else {
+                       fprintf(stderr, _("Cannot find disk data\n"));
+                       exit(2);
+               }
+       }
+       /*
+        * Allocate structures for number of disks found.
+        * iodev_nr must be <> 0.
+        */
+       salloc_device(iodev_nr);
+}
+
+/*
+ ***************************************************************************
+ * Free various structures.
+ ***************************************************************************
+*/
+void io_sys_free(void)
+{
+       int i;
+       
+       for (i = 0; i < 2; i++) {
+
+               /* Free CPU structures */
+               if (st_cpu[i]) {
+                       free(st_cpu[i]);
+               }
+
+               /* Free I/O device structures */
+               if (st_iodev[i]) {
+                       free(st_iodev[i]);
+               }
+       }
+       
+       if (st_hdr_iodev) {
+               free(st_hdr_iodev);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Save stats for current device or partition.
+ *
+ * IN:
+ * @name       Name of the device/partition.
+ * @curr       Index in array for current sample statistics.
+ * @st_io      Structure with device or partition to save.
+ * @ioln_nr    Number of devices and partitions.
+ * @st_hdr_ioln        Pointer on structures describing a device/partition.
+ *
+ * OUT:
+ * @st_hdr_ioln        Pointer on structures describing a device/partition.
+ ***************************************************************************
+ */
+void save_stats(char *name, int curr, void *st_io, int ioln_nr,
+               struct io_hdr_stats *st_hdr_ioln)
+{
+       int i;
+       struct io_hdr_stats *st_hdr_ioln_i;
+       struct io_stats *st_iodev_i;
+
+       /* Look for device in data table */
+       for (i = 0; i < ioln_nr; i++) {
+               st_hdr_ioln_i = st_hdr_ioln + i;
+               if (!strcmp(st_hdr_ioln_i->name, name)) {
+                       break;
+               }
+       }
+
+       if (i == ioln_nr) {
+               /*
+                * This is a new device: look for an unused entry to store it.
+                * Thus we are able to handle dynamically registered devices.
+                */
+               for (i = 0; i < ioln_nr; i++) {
+                       st_hdr_ioln_i = st_hdr_ioln + i;
+                       if (!st_hdr_ioln_i->used) {
+                               /* Unused entry found... */
+                               st_hdr_ioln_i->used = TRUE; /* Indicate it is now used */
+                               strcpy(st_hdr_ioln_i->name, name);
+                               st_iodev_i = st_iodev[!curr] + i;
+                               memset(st_iodev_i, 0, IO_STATS_SIZE);
+                               break;
+                       }
+               }
+       }
+       if (i < ioln_nr) {
+               st_hdr_ioln_i = st_hdr_ioln + i;
+               st_hdr_ioln_i->active = TRUE;
+               st_iodev_i = st_iodev[curr] + i;
+               *st_iodev_i = *((struct io_stats *) st_io);
+       }
+       /*
+        * else it was a new device
+        * but there was no free structure to store it.
+        */
+}
+
+/*
+ ***************************************************************************
+ * Read sysfs stat for current block device or partition.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @filename   File name where stats will be read.
+ * @dev_name   Device or partition name.
+ *
+ * RETURNS:
+ * 0 if file couldn't be opened, 1 otherwise.
+ ***************************************************************************
+ */
+int read_sysfs_file_stat(int curr, char *filename, char *dev_name)
+{
+       FILE *fp;
+       struct io_stats sdev;
+       int i;
+       unsigned long rd_ios, rd_merges_or_rd_sec, rd_ticks_or_wr_sec, wr_ios;
+       unsigned long ios_pgr, tot_ticks, rq_ticks, wr_merges, wr_ticks;
+       unsigned long long rd_sec_or_wr_ios, wr_sec;
+
+       /* Try to read given stat file */
+       if ((fp = fopen(filename, "r")) == NULL)
+               return 0;
+       
+       i = fscanf(fp, "%lu %lu %llu %lu %lu %lu %llu %lu %lu %lu %lu",
+                  &rd_ios, &rd_merges_or_rd_sec, &rd_sec_or_wr_ios, &rd_ticks_or_wr_sec,
+                  &wr_ios, &wr_merges, &wr_sec, &wr_ticks, &ios_pgr, &tot_ticks, &rq_ticks);
+
+       if (i == 11) {
+               /* Device or partition */
+               sdev.rd_ios     = rd_ios;
+               sdev.rd_merges  = rd_merges_or_rd_sec;
+               sdev.rd_sectors = rd_sec_or_wr_ios;
+               sdev.rd_ticks   = rd_ticks_or_wr_sec;
+               sdev.wr_ios     = wr_ios;
+               sdev.wr_merges  = wr_merges;
+               sdev.wr_sectors = wr_sec;
+               sdev.wr_ticks   = wr_ticks;
+               sdev.ios_pgr    = ios_pgr;
+               sdev.tot_ticks  = tot_ticks;
+               sdev.rq_ticks   = rq_ticks;
+       }
+       else if (i == 4) {
+               /* Partition without extended statistics */
+               sdev.rd_ios     = rd_ios;
+               sdev.rd_sectors = rd_merges_or_rd_sec;
+               sdev.wr_ios     = rd_sec_or_wr_ios;
+               sdev.wr_sectors = rd_ticks_or_wr_sec;
+       }
+       
+       if ((i == 11) || !DISPLAY_EXTENDED(flags)) {
+               /*
+                * In fact, we _don't_ save stats if it's a partition without
+                * extended stats and yet we want to display ext stats.
+                */
+               save_stats(dev_name, curr, &sdev, iodev_nr, st_hdr_iodev);
+       }
+
+       fclose(fp);
+
+       return 1;
+}
+
+/*
+ ***************************************************************************
+ * Read sysfs stats for all the partitions of a device.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @dev_name   Device name.
+ ***************************************************************************
+ */
+void read_sysfs_dlist_part_stat(int curr, char *dev_name)
+{
+       DIR *dir;
+       struct dirent *drd;
+       char dfile[MAX_PF_NAME], filename[MAX_PF_NAME];
+
+       snprintf(dfile, MAX_PF_NAME, "%s/%s", SYSFS_BLOCK, dev_name);
+       dfile[MAX_PF_NAME - 1] = '\0';
+
+       /* Open current device directory in /sys/block */
+       if ((dir = opendir(dfile)) == NULL)
+               return;
+
+       /* Get current entry */
+       while ((drd = readdir(dir)) != NULL) {
+               if (!strcmp(drd->d_name, ".") || !strcmp(drd->d_name, ".."))
+                       continue;
+               snprintf(filename, MAX_PF_NAME, "%s/%s/%s", dfile, drd->d_name, S_STAT);
+               filename[MAX_PF_NAME - 1] = '\0';
+
+               /* Read current partition stats */
+               read_sysfs_file_stat(curr, filename, drd->d_name);
+       }
+
+       /* Close device directory */
+       closedir(dir);
+}
+
+/*
+ ***************************************************************************
+ * Read stats from the sysfs filesystem for the devices entered on the
+ * command line.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void read_sysfs_dlist_stat(int curr)
+{
+       int dev, ok;
+       char filename[MAX_PF_NAME];
+       char *slash;
+       struct io_dlist *st_dev_list_i;
+
+       /* Every I/O device (or partition) is potentially unregistered */
+       set_entries_inactive(iodev_nr, st_hdr_iodev);
+
+       for (dev = 0; dev < dlist_idx; dev++) {
+               st_dev_list_i = st_dev_list + dev;
+
+               /* Some devices may have a slash in their name (eg. cciss/c0d0...) */
+               while ((slash = strchr(st_dev_list_i->dev_name, '/'))) {
+                       *slash = '!';
+               }
+
+               snprintf(filename, MAX_PF_NAME, "%s/%s/%s",
+                        SYSFS_BLOCK, st_dev_list_i->dev_name, S_STAT);
+               filename[MAX_PF_NAME - 1] = '\0';
+
+               /* Read device stats */
+               ok = read_sysfs_file_stat(curr, filename, st_dev_list_i->dev_name);
+
+               if (ok && st_dev_list_i->disp_part) {
+                       /* Also read stats for its partitions */
+                       read_sysfs_dlist_part_stat(curr, st_dev_list_i->dev_name);
+               }
+       }
+
+       /* Free structures corresponding to unregistered devices */
+       free_inactive_entries(iodev_nr, st_hdr_iodev);
+}
+
+/*
+ ***************************************************************************
+ * Read stats from the sysfs filesystem for every block devices found.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void read_sysfs_stat(int curr)
+{
+       DIR *dir;
+       struct dirent *drd;
+       char filename[MAX_PF_NAME];
+       int ok;
+
+       /* Every I/O device entry is potentially unregistered */
+       set_entries_inactive(iodev_nr, st_hdr_iodev);
+
+       /* Open /sys/block directory */
+       if ((dir = opendir(SYSFS_BLOCK)) != NULL) {
+
+               /* Get current entry */
+               while ((drd = readdir(dir)) != NULL) {
+                       if (!strcmp(drd->d_name, ".") || !strcmp(drd->d_name, ".."))
+                               continue;
+                       snprintf(filename, MAX_PF_NAME, "%s/%s/%s",
+                                SYSFS_BLOCK, drd->d_name, S_STAT);
+                       filename[MAX_PF_NAME - 1] = '\0';
+       
+                       /* If current entry is a directory, try to read its stat file */
+                       ok = read_sysfs_file_stat(curr, filename, drd->d_name);
+       
+                       /*
+                        * If '-p ALL' was entered on the command line,
+                        * also try to read stats for its partitions
+                        */
+                       if (ok && DISPLAY_PART_ALL(flags)) {
+                               read_sysfs_dlist_part_stat(curr, drd->d_name);
+                       }
+               }
+
+               /* Close /sys/block directory */
+               closedir(dir);
+       }
+
+       /* Free structures corresponding to unregistered devices */
+       free_inactive_entries(iodev_nr, st_hdr_iodev);
+}
+
+/*
+ ***************************************************************************
+ * Read stats from /proc/diskstats.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void read_diskstats_stat(int curr)
+{
+       FILE *fp;
+       char line[256], dev_name[MAX_NAME_LEN];
+       char *dm_name;
+       struct io_stats sdev;
+       int i;
+       unsigned long rd_ios, rd_merges_or_rd_sec, rd_ticks_or_wr_sec, wr_ios;
+       unsigned long ios_pgr, tot_ticks, rq_ticks, wr_merges, wr_ticks;
+       unsigned long long rd_sec_or_wr_ios, wr_sec;
+       char *ioc_dname;
+       unsigned int major, minor;
+
+       /* Every I/O device entry is potentially unregistered */
+       set_entries_inactive(iodev_nr, st_hdr_iodev);
+
+       if ((fp = fopen(DISKSTATS, "r")) == NULL)
+               return;
+
+       while (fgets(line, 256, fp) != NULL) {
+
+               /* major minor name rio rmerge rsect ruse wio wmerge wsect wuse running use aveq */
+               i = sscanf(line, "%u %u %s %lu %lu %llu %lu %lu %lu %llu %lu %lu %lu %lu",
+                          &major, &minor, dev_name,
+                          &rd_ios, &rd_merges_or_rd_sec, &rd_sec_or_wr_ios, &rd_ticks_or_wr_sec,
+                          &wr_ios, &wr_merges, &wr_sec, &wr_ticks, &ios_pgr, &tot_ticks, &rq_ticks);
+
+               if (i == 14) {
+                       /* Device or partition */
+                       if (!dlist_idx && !DISPLAY_PARTITIONS(flags) && !is_device(dev_name))
+                               continue;
+                       sdev.rd_ios     = rd_ios;
+                       sdev.rd_merges  = rd_merges_or_rd_sec;
+                       sdev.rd_sectors = rd_sec_or_wr_ios;
+                       sdev.rd_ticks   = rd_ticks_or_wr_sec;
+                       sdev.wr_ios     = wr_ios;
+                       sdev.wr_merges  = wr_merges;
+                       sdev.wr_sectors = wr_sec;
+                       sdev.wr_ticks   = wr_ticks;
+                       sdev.ios_pgr    = ios_pgr;
+                       sdev.tot_ticks  = tot_ticks;
+                       sdev.rq_ticks   = rq_ticks;
+               }
+               else if (i == 7) {
+                       /* Partition without extended statistics */
+                       if (DISPLAY_EXTENDED(flags) ||
+                           (!dlist_idx && !DISPLAY_PARTITIONS(flags)))
+                               continue;
+
+                       sdev.rd_ios     = rd_ios;
+                       sdev.rd_sectors = rd_merges_or_rd_sec;
+                       sdev.wr_ios     = rd_sec_or_wr_ios;
+                       sdev.wr_sectors = rd_ticks_or_wr_sec;
+               }
+               else
+                       /* Unknown entry: Ignore it */
+                       continue;
+
+               if ((ioc_dname = ioc_name(major, minor)) != NULL) {
+                       if (strcmp(dev_name, ioc_dname) && strcmp(ioc_dname, K_NODEV)) {
+                               /*
+                                * No match: Use name generated from sysstat.ioconf data
+                                * (if different from "nodev") works around known issues
+                                * with EMC PowerPath.
+                                */
+                               strncpy(dev_name, ioc_dname, MAX_NAME_LEN);
+                       }
+               }
+
+               if ((DISPLAY_DEVMAP_NAME(flags)) && (major == DEVMAP_MAJOR)) {
+                       /*
+                        * If the device is a device mapper device, try to get its
+                        * assigned name of its logical device.
+                        */
+                       dm_name = transform_devmapname(major, minor);
+                       if (dm_name) {
+                               strcpy(dev_name, dm_name);
+                       }
+               }
+
+               save_stats(dev_name, curr, &sdev, iodev_nr, st_hdr_iodev);
+       }
+       fclose(fp);
+
+       /* Free structures corresponding to unregistered devices */
+       free_inactive_entries(iodev_nr, st_hdr_iodev);
+}
+
+/*
+ ***************************************************************************
+ * Display CPU utilization.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time.
+ ***************************************************************************
+ */
+void write_cpu_stat(int curr, unsigned long long itv)
+{
+       printf("avg-cpu:  %%user   %%nice %%system %%iowait  %%steal   %%idle\n");
+
+       printf("         %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f\n\n",
+              ll_sp_value(st_cpu[!curr]->cpu_user,   st_cpu[curr]->cpu_user,   itv),
+              ll_sp_value(st_cpu[!curr]->cpu_nice,   st_cpu[curr]->cpu_nice,   itv),
+               /*
+                * Time spent in system mode also includes time spent servicing
+                * hard and soft interrupts.
+                */
+              ll_sp_value(st_cpu[!curr]->cpu_sys + st_cpu[!curr]->cpu_softirq +
+                          st_cpu[!curr]->cpu_hardirq,
+                          st_cpu[curr]->cpu_sys + st_cpu[curr]->cpu_softirq +
+                          st_cpu[curr]->cpu_hardirq, itv),
+              ll_sp_value(st_cpu[!curr]->cpu_iowait, st_cpu[curr]->cpu_iowait, itv),
+              ll_sp_value(st_cpu[!curr]->cpu_steal,  st_cpu[curr]->cpu_steal,  itv),
+              (st_cpu[curr]->cpu_idle < st_cpu[!curr]->cpu_idle) ?
+              0.0 :
+              ll_sp_value(st_cpu[!curr]->cpu_idle,   st_cpu[curr]->cpu_idle,   itv));
+}
+
+/*
+ ***************************************************************************
+ * Display disk stats header.
+ *
+ * OUT:
+ * @fctr       Conversion factor.
+ ***************************************************************************
+ */
+void write_disk_stat_header(int *fctr)
+{
+       if (DISPLAY_EXTENDED(flags)) {
+               /* Extended stats */
+               printf("Device:         rrqm/s   wrqm/s     r/s     w/s");
+               if (DISPLAY_MEGABYTES(flags)) {
+                       printf("    rMB/s    wMB/s");
+                       *fctr = 2048;
+               }
+               else if (DISPLAY_KILOBYTES(flags)) {
+                       printf("    rkB/s    wkB/s");
+                       *fctr = 2;
+               }
+               else {
+                       printf("   rsec/s   wsec/s");
+               }
+               printf(" avgrq-sz avgqu-sz   await r_await w_await  svctm  %%util\n");
+       }
+       else {
+               /* Basic stats */
+               printf("Device:            tps");
+               if (DISPLAY_KILOBYTES(flags)) {
+                       printf("    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn\n");
+                       *fctr = 2;
+               }
+               else if (DISPLAY_MEGABYTES(flags)) {
+                       printf("    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn\n");
+                       *fctr = 2048;
+               }
+               else {
+                       printf("   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn\n");
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display extended stats, read from /proc/{diskstats,partitions} or /sys.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time.
+ * @fctr       Conversion factor.
+ * @shi                Structures describing the devices and partitions.
+ * @ioi                Current sample statistics.
+ * @ioj                Previous sample statistics.
+ ***************************************************************************
+ */
+void write_ext_stat(int curr, unsigned long long itv, int fctr,
+                   struct io_hdr_stats *shi, struct io_stats *ioi,
+                   struct io_stats *ioj)
+{
+       struct stats_disk sdc, sdp;
+       struct ext_disk_stats xds;
+       double r_await, w_await;
+       
+       /*
+        * Counters overflows are possible, but don't need to be handled in
+        * a special way: the difference is still properly calculated if the
+        * result is of the same type as the two values.
+        * Exception is field rq_ticks which is incremented by the number of
+        * I/O in progress times the number of milliseconds spent doing I/O.
+        * But the number of I/O in progress (field ios_pgr) happens to be
+        * sometimes negative...
+        */
+       sdc.nr_ios    = ioi->rd_ios + ioi->wr_ios;
+       sdp.nr_ios    = ioj->rd_ios + ioj->wr_ios;
+
+       sdc.tot_ticks = ioi->tot_ticks;
+       sdp.tot_ticks = ioj->tot_ticks;
+
+       sdc.rd_ticks  = ioi->rd_ticks;
+       sdp.rd_ticks  = ioj->rd_ticks;
+       sdc.wr_ticks  = ioi->wr_ticks;
+       sdp.wr_ticks  = ioj->wr_ticks;
+
+       sdc.rd_sect   = ioi->rd_sectors;
+       sdp.rd_sect   = ioj->rd_sectors;
+       sdc.wr_sect   = ioi->wr_sectors;
+       sdp.wr_sect   = ioj->wr_sectors;
+       
+       compute_ext_disk_stats(&sdc, &sdp, itv, &xds);
+       
+       r_await = (ioi->rd_ios - ioj->rd_ios) ?
+                 (ioi->rd_ticks - ioj->rd_ticks) /
+                 ((double) (ioi->rd_ios - ioj->rd_ios)) : 0.0;
+       w_await = (ioi->wr_ios - ioj->wr_ios) ?
+                 (ioi->wr_ticks - ioj->wr_ticks) /
+                 ((double) (ioi->wr_ios - ioj->wr_ios)) : 0.0;
+
+       /*      DEV   rrq/s wrq/s   r/s   w/s  rsec  wsec  rqsz  qusz await r_await w_await svctm %util */
+       printf("%-13s %8.2f %8.2f %7.2f %7.2f %8.2f %8.2f %8.2f %8.2f %7.2f %7.2f %7.2f %6.2f %6.2f\n",
+              shi->name,
+              S_VALUE(ioj->rd_merges, ioi->rd_merges, itv),
+              S_VALUE(ioj->wr_merges, ioi->wr_merges, itv),
+              S_VALUE(ioj->rd_ios, ioi->rd_ios, itv),
+              S_VALUE(ioj->wr_ios, ioi->wr_ios, itv),
+              ll_s_value(ioj->rd_sectors, ioi->rd_sectors, itv) / fctr,
+              ll_s_value(ioj->wr_sectors, ioi->wr_sectors, itv) / fctr,
+              xds.arqsz,
+              S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0,
+              xds.await,
+              r_await,
+              w_await,
+              /* The ticks output is biased to output 1000 ticks per second */
+              xds.svctm,
+              /* Again: Ticks in milliseconds */
+              xds.util / 10.0);
+}
+
+/*
+ ***************************************************************************
+ * Write basic stats, read from /proc/diskstats or from sysfs.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time.
+ * @fctr       Conversion factor.
+ * @shi                Structures describing the devices and partitions.
+ * @ioi                Current sample statistics.
+ * @ioj                Previous sample statistics.
+ ***************************************************************************
+ */
+void write_basic_stat(int curr, unsigned long long itv, int fctr,
+                     struct io_hdr_stats *shi, struct io_stats *ioi,
+                     struct io_stats *ioj)
+{
+       unsigned long long rd_sec, wr_sec;
+
+       printf("%-13s", shi->name);
+
+       /* Print stats coming from /sys or /proc/diskstats */
+       rd_sec = ioi->rd_sectors - ioj->rd_sectors;
+       if ((ioi->rd_sectors < ioj->rd_sectors) && (ioj->rd_sectors <= 0xffffffff)) {
+               rd_sec &= 0xffffffff;
+       }
+       wr_sec = ioi->wr_sectors - ioj->wr_sectors;
+       if ((ioi->wr_sectors < ioj->wr_sectors) && (ioj->wr_sectors <= 0xffffffff)) {
+               wr_sec &= 0xffffffff;
+       }
+
+       printf(" %8.2f %12.2f %12.2f %10llu %10llu\n",
+              S_VALUE(ioj->rd_ios + ioj->wr_ios, ioi->rd_ios + ioi->wr_ios, itv),
+              ll_s_value(ioj->rd_sectors, ioi->rd_sectors, itv) / fctr,
+              ll_s_value(ioj->wr_sectors, ioi->wr_sectors, itv) / fctr,
+              (unsigned long long) rd_sec / fctr,
+              (unsigned long long) wr_sec / fctr);
+}
+
+/*
+ ***************************************************************************
+ * Print everything now (stats and uptime).
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @rectime    Current date and time.
+ ***************************************************************************
+ */
+void write_stats(int curr, struct tm *rectime)
+{
+       int dev, i, fctr = 1;
+       unsigned long long itv;
+       struct io_hdr_stats *shi;
+       struct io_dlist *st_dev_list_i;
+
+       /* Test stdout */
+       TEST_STDOUT(STDOUT_FILENO);
+
+       /* Print time stamp */
+       if (DISPLAY_TIMESTAMP(flags)) {
+               if (DISPLAY_ISO(flags)) {
+                       strftime(timestamp, sizeof(timestamp), "%FT%T%z", rectime);
+               }
+               else {
+                       strftime(timestamp, sizeof(timestamp), "%x %X", rectime);
+               }
+               printf("%s\n", timestamp);
+#ifdef DEBUG
+               if (DISPLAY_DEBUG(flags)) {
+                       fprintf(stderr, "%s\n", timestamp);
+               }
+#endif
+       }
+
+       /* Interval is multiplied by the number of processors */
+       itv = get_interval(uptime[!curr], uptime[curr]);
+
+       if (DISPLAY_CPU(flags)) {
+#ifdef DEBUG
+               if (DISPLAY_DEBUG(flags)) {
+                       /* Debug output */
+                       fprintf(stderr, "itv=%llu st_cpu[curr]{ cpu_user=%llu cpu_nice=%llu "
+                                       "cpu_sys=%llu cpu_idle=%llu cpu_iowait=%llu cpu_steal=%llu "
+                                       "cpu_hardirq=%llu cpu_softirq=%llu cpu_guest=%llu }\n",
+                               itv,
+                               st_cpu[curr]->cpu_user,
+                               st_cpu[curr]->cpu_nice,
+                               st_cpu[curr]->cpu_sys,
+                               st_cpu[curr]->cpu_idle,
+                               st_cpu[curr]->cpu_iowait,
+                               st_cpu[curr]->cpu_steal,
+                               st_cpu[curr]->cpu_hardirq,
+                               st_cpu[curr]->cpu_softirq,
+                               st_cpu[curr]->cpu_guest
+                               );
+               }
+#endif
+
+               /* Display CPU utilization */
+               write_cpu_stat(curr, itv);
+       }
+
+       if (cpu_nr > 1) {
+               /* On SMP machines, reduce itv to one processor (see note above) */
+               itv = get_interval(uptime0[!curr], uptime0[curr]);
+       }
+
+       if (DISPLAY_DISK(flags)) {
+               struct io_stats *ioi, *ioj;
+
+               shi = st_hdr_iodev;
+
+               /* Display disk stats header */
+               write_disk_stat_header(&fctr);
+
+               for (i = 0; i < iodev_nr; i++, shi++) {
+                       if (shi->used) {
+       
+                               if (dlist_idx && !HAS_SYSFS(flags)) {
+                                       /*
+                                        * With sysfs, only stats for the requested
+                                        * devices are read.
+                                        * With /proc/diskstats, stats for
+                                        * every device are read. Thus we need to check
+                                        * if stats for current device are to be displayed.
+                                        */
+                                       for (dev = 0; dev < dlist_idx; dev++) {
+                                               st_dev_list_i = st_dev_list + dev;
+                                               if (!strcmp(shi->name, st_dev_list_i->dev_name))
+                                                       break;
+                                       }
+                                       if (dev == dlist_idx)
+                                               /* Device not found in list: Don't display it */
+                                               continue;
+                               }
+       
+                               ioi = st_iodev[curr] + i;
+                               ioj = st_iodev[!curr] + i;
+
+                               if (!DISPLAY_UNFILTERED(flags)) {
+                                       if (!ioi->rd_ios && !ioi->wr_ios)
+                                               continue;
+                               }
+                               
+                               if (DISPLAY_ZERO_OMIT(flags)) {
+                                       if ((ioi->rd_ios == ioj->rd_ios) &&
+                                               (ioi->wr_ios == ioj->wr_ios))
+                                               /* No activity: Ignore it */
+                                               continue;
+                               }
+#ifdef DEBUG
+                               if (DISPLAY_DEBUG(flags)) {
+                                       /* Debug output */
+                                       fprintf(stderr, "name=%s itv=%llu fctr=%d ioi{ rd_sectors=%llu "
+                                                       "wr_sectors=%llu rd_ios=%lu rd_merges=%lu rd_ticks=%lu "
+                                                       "wr_ios=%lu wr_merges=%lu wr_ticks=%lu ios_pgr=%lu tot_ticks=%lu "
+                                                       "rq_ticks=%lu dk_drive=%lu dk_drive_rblk=%lu dk_drive_wblk=%lu }\n",
+                                               shi->name,
+                                               itv,
+                                               fctr,
+                                               ioi->rd_sectors,
+                                               ioi->wr_sectors,
+                                               ioi->rd_ios,
+                                               ioi->rd_merges,
+                                               ioi->rd_ticks,
+                                               ioi->wr_ios,
+                                               ioi->wr_merges,
+                                               ioi->wr_ticks,
+                                               ioi->ios_pgr,
+                                               ioi->tot_ticks,
+                                               ioi->rq_ticks,
+                                               ioi->dk_drive,
+                                               ioi->dk_drive_rblk,
+                                               ioi->dk_drive_wblk
+                                               );
+                               }
+#endif
+
+                               if (DISPLAY_EXTENDED(flags)) {
+                                       write_ext_stat(curr, itv, fctr, shi, ioi, ioj);
+                               }
+                               else {
+                                       write_basic_stat(curr, itv, fctr, shi, ioi, ioj);
+                               }
+                       }
+               }
+               printf("\n");
+       }
+}
+
+/*
+ ***************************************************************************
+ * Main loop: Read I/O stats from the relevant sources and display them.
+ *
+ * IN:
+ * @count      Number of lines of stats to print.
+ * @rectime    Current date and time.
+ ***************************************************************************
+ */
+void rw_io_stat_loop(long int count, struct tm *rectime)
+{
+       int curr = 1;
+
+       /* Don't buffer data if redirected to a pipe */
+       setbuf(stdout, NULL);
+       
+       do {
+               if (cpu_nr > 1) {
+                       /*
+                        * Read system uptime (only for SMP machines).
+                        * Init uptime0. So if /proc/uptime cannot fill it,
+                        * this will be done by /proc/stat.
+                        */
+                       uptime0[curr] = 0;
+                       read_uptime(&(uptime0[curr]));
+               }
+
+               /*
+                * Read stats for CPU "all" and 0.
+                * Note that stats for CPU 0 are not used per se. It only makes
+                * read_stat_cpu() fill uptime0.
+                */
+               read_stat_cpu(st_cpu[curr], 2, &(uptime[curr]), &(uptime0[curr]));
+
+               if (dlist_idx) {
+                       /*
+                        * A device or partition name was entered on the command line,
+                        * with or without -p option (but not -p ALL).
+                        */
+                       if (HAS_DISKSTATS(flags) && !DISPLAY_PARTITIONS(flags)) {
+                               read_diskstats_stat(curr);
+                       }
+                       else if (HAS_SYSFS(flags)) {
+                               read_sysfs_dlist_stat(curr);
+                       }
+               }
+               else {
+                       /*
+                        * No devices nor partitions entered on the command line
+                        * (for example if -p ALL was used).
+                        */
+                       if (HAS_DISKSTATS(flags)) {
+                               read_diskstats_stat(curr);
+                       }
+                       else if (HAS_SYSFS(flags)) {
+                               read_sysfs_stat(curr);
+                       }
+               }
+
+               /* Get time */
+               get_localtime(rectime);
+
+               /* Print results */
+               write_stats(curr, rectime);
+
+               if (count > 0) {
+                       count--;
+               }
+               if (count) {
+                       curr ^= 1;
+                       pause();
+               }
+       }
+       while (count);
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the iostat program.
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int it = 0;
+       int opt = 1;
+       int i, report_set = FALSE;
+       long count = 1;
+       struct utsname header;
+       struct io_dlist *st_dev_list_i;
+       struct tm rectime;
+       char *t;
+
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       /* Get HZ */
+       get_HZ();
+
+       /* Allocate structures for device list */
+       if (argc > 1) {
+               salloc_dev_list(argc - 1 + count_csvalues(argc, argv));
+       }
+
+       /* Process args... */
+       while (opt < argc) {
+
+               if (!strcmp(argv[opt], "-p")) {
+                       flags |= I_D_PARTITIONS;
+                       if (argv[++opt] &&
+                           (strspn(argv[opt], DIGITS) != strlen(argv[opt])) &&
+                           (strncmp(argv[opt], "-", 1))) {
+                               flags |= I_D_UNFILTERED;
+                               
+                               for (t = strtok(argv[opt], ","); t; t = strtok(NULL, ",")) {
+                                       if (!strcmp(t, K_ALL)) {
+                                               flags |= I_D_PART_ALL;
+                                       }
+                                       else {
+                                               /* Store device name */
+                                               i = update_dev_list(&dlist_idx, device_name(t));
+                                               st_dev_list_i = st_dev_list + i;
+                                               st_dev_list_i->disp_part = TRUE;
+                                       }
+                               }
+                               opt++;
+                       }
+                       else {
+                               flags |= I_D_PART_ALL;
+                       }
+               }
+
+#ifdef DEBUG
+               else if (!strcmp(argv[opt], "--debuginfo")) {
+                       flags |= I_D_DEBUG;
+                       opt++;
+               }
+#endif
+
+               else if (!strncmp(argv[opt], "-", 1)) {
+                       for (i = 1; *(argv[opt] + i); i++) {
+
+                               switch (*(argv[opt] + i)) {
+
+                               case 'c':
+                                       /* Display cpu usage */
+                                       flags |= I_D_CPU;
+                                       report_set = TRUE;
+                                       break;
+
+                               case 'd':
+                                       /* Display disk utilization */
+                                       flags |= I_D_DISK;
+                                       report_set = TRUE;
+                                       break;
+
+                               case 'k':
+                                       if (DISPLAY_MEGABYTES(flags)) {
+                                               usage(argv[0]);
+                                       }
+                                       /* Display stats in kB/s */
+                                       flags |= I_D_KILOBYTES;
+                                       break;
+
+                               case 'm':
+                                       if (DISPLAY_KILOBYTES(flags)) {
+                                               usage(argv[0]);
+                                       }
+                                       /* Display stats in MB/s */
+                                       flags |= I_D_MEGABYTES;
+                                       break;
+       
+                               case 'N':
+                                       /* Display device mapper logical name */
+                                       flags |= I_D_DEVMAP_NAME;
+                                       break;
+
+                               case 't':
+                                       /* Display timestamp */
+                                       flags |= I_D_TIMESTAMP;
+                                       break;
+       
+                               case 'x':
+                                       /* Display extended stats */
+                                       flags |= I_D_EXTENDED;
+                                       break;
+                                       
+                               case 'z':
+                                       /* Omit output for devices with no activity */
+                                       flags |= I_D_ZERO_OMIT;
+                                       break;
+
+                               case 'V':
+                                       /* Print version number and exit */
+                                       print_version();
+                                       break;
+       
+                               default:
+                                       usage(argv[0]);
+                               }
+                       }
+                       opt++;
+               }
+
+               else if (!isdigit(argv[opt][0])) {
+                       flags |= I_D_UNFILTERED;
+                       if (strcmp(argv[opt], K_ALL)) {
+                               /* Store device name */
+                               update_dev_list(&dlist_idx, device_name(argv[opt++]));
+                       }
+                       else {
+                               opt++;
+                       }
+               }
+
+               else if (!it) {
+                       interval = atol(argv[opt++]);
+                       if (interval < 0) {
+                               usage(argv[0]);
+                       }
+                       count = -1;
+                       it = 1;
+               }
+
+               else if (it > 0) {
+                       count = atol(argv[opt++]);
+                       if ((count < 1) || !interval) {
+                               usage(argv[0]);
+                       }
+                       it = -1;
+               }
+               else {
+                       usage(argv[0]);
+               }
+       }
+
+       if (!interval) {
+               count = 1;
+       }
+       
+       /* Default: Display CPU and DISK reports */
+       if (!report_set) {
+               flags |= I_D_CPU + I_D_DISK;
+       }
+       /*
+        * Also display DISK reports if options -p, -x or a device has been entered
+        * on the command line.
+        */
+       if (DISPLAY_PARTITIONS(flags) || DISPLAY_EXTENDED(flags) ||
+           DISPLAY_UNFILTERED(flags)) {
+               flags |= I_D_DISK;
+       }
+
+       /* Select disk output unit (kB/s or blocks/s) */
+       set_disk_output_unit();
+
+       /* Ignore device list if '-p ALL' entered on the command line */
+       if (DISPLAY_PART_ALL(flags)) {
+               dlist_idx = 0;
+       }
+
+       /* Init structures according to machine architecture */
+       io_sys_init();
+
+       get_localtime(&rectime);
+
+       /* Get system name, release number and hostname */
+       uname(&header);
+       if (print_gal_header(&rectime, header.sysname, header.release,
+                            header.nodename, header.machine, cpu_nr)) {
+               flags |= I_D_ISO;
+       }
+       printf("\n");
+
+       /* Set a handler for SIGALRM */
+       alarm_handler(0);
+
+       /* Main loop */
+       rw_io_stat_loop(count, &rectime);
+
+       /* Free structures */
+       io_sys_free();
+       sfree_dev_list();
+       
+       return 0;
+}
diff --git a/iostat.h b/iostat.h
new file mode 100644 (file)
index 0000000..d596cb9
--- /dev/null
+++ b/iostat.h
@@ -0,0 +1,121 @@
+/*
+ * iostat: report CPU and I/O statistics
+ * (C) 1999-2009 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _IOSTAT_H
+#define _IOSTAT_H
+
+#include "common.h"
+
+/* I_: iostat - D_: Display - F_: Flag */
+#define I_D_CPU                        0x00001
+#define I_D_DISK               0x00002
+#define I_D_TIMESTAMP          0x00004
+#define I_D_EXTENDED           0x00008
+#define I_D_PART_ALL           0x00010
+#define I_D_KILOBYTES          0x00020
+#define I_F_HAS_SYSFS          0x00040
+#define I_D_DEBUG              0x00080
+#define I_D_UNFILTERED         0x00100
+#define I_D_MEGABYTES          0x00200
+#define I_D_PARTITIONS         0x00400
+#define I_F_HAS_DISKSTATS      0x00800
+/* Unused                      0x01000 */
+/* Unused                      0x02000 */
+/* Unused                      0x04000 */
+/* Unused                      0x08000 */
+#define I_D_DEVMAP_NAME                0x10000
+#define I_D_ISO                        0x20000
+/* Unused                      0x40000 */
+#define I_D_ZERO_OMIT          0x80000
+
+#define DISPLAY_CPU(m)         (((m) & I_D_CPU)           == I_D_CPU)
+#define DISPLAY_DISK(m)                (((m) & I_D_DISK)          == I_D_DISK)
+#define DISPLAY_TIMESTAMP(m)   (((m) & I_D_TIMESTAMP)     == I_D_TIMESTAMP)
+#define DISPLAY_EXTENDED(m)    (((m) & I_D_EXTENDED)      == I_D_EXTENDED)
+#define DISPLAY_PART_ALL(m)    (((m) & I_D_PART_ALL)      == I_D_PART_ALL)
+#define DISPLAY_KILOBYTES(m)   (((m) & I_D_KILOBYTES)     == I_D_KILOBYTES)
+#define DISPLAY_MEGABYTES(m)   (((m) & I_D_MEGABYTES)     == I_D_MEGABYTES)
+#define HAS_SYSFS(m)           (((m) & I_F_HAS_SYSFS)     == I_F_HAS_SYSFS)
+#define DISPLAY_DEBUG(m)       (((m) & I_D_DEBUG)         == I_D_DEBUG)
+#define DISPLAY_UNFILTERED(m)  (((m) & I_D_UNFILTERED)    == I_D_UNFILTERED)
+#define DISPLAY_PARTITIONS(m)  (((m) & I_D_PARTITIONS)    == I_D_PARTITIONS)
+#define HAS_DISKSTATS(m)       (((m) & I_F_HAS_DISKSTATS) == I_F_HAS_DISKSTATS)
+#define DISPLAY_DEVMAP_NAME(m) (((m) & I_D_DEVMAP_NAME)   == I_D_DEVMAP_NAME)
+#define DISPLAY_ISO(m)         (((m) & I_D_ISO)           == I_D_ISO)
+#define DISPLAY_ZERO_OMIT(m)   (((m) & I_D_ZERO_OMIT)     == I_D_ZERO_OMIT)
+
+/* Preallocation constats */
+#define NR_DEV_PREALLOC                4
+#define NR_DISK_PREALLOC       3
+
+/* Environment variable */
+#define ENV_POSIXLY_CORRECT    "POSIXLY_CORRECT"
+
+/*
+ * Structures for I/O stats.
+ * The number of structures allocated corresponds to the number of devices
+ * present in the system, plus a preallocation number to handle those
+ * that can be registered dynamically.
+ * The number of devices is found by using /sys filesystem (if mounted),
+ * or the number of "disk_io:" entries in /proc/stat (2.4 kernels),
+ * else the default value is 4 (for old kernels, which maintained stats
+ * for the first four devices in /proc/stat).
+ * For each io_stats structure allocated corresponds a io_hdr_stats structure.
+ * A io_stats structure is considered as unused or "free" (containing no stats
+ * for a particular device) if the 'major' field of the io_hdr_stats
+ * structure is set to 0.
+ */
+struct io_stats {
+       /* # of sectors read */
+       unsigned long long rd_sectors   __attribute__ ((aligned (8)));
+       /* # of sectors written */
+       unsigned long long wr_sectors   __attribute__ ((packed));
+       /* # of read operations issued to the device */
+       unsigned long rd_ios            __attribute__ ((packed));
+       /* # of read requests merged */
+       unsigned long rd_merges         __attribute__ ((packed));
+       /* Time of read requests in queue */
+       unsigned long rd_ticks          __attribute__ ((packed));
+       /* # of write operations issued to the device */
+       unsigned long wr_ios            __attribute__ ((packed));
+       /* # of write requests merged */
+       unsigned long wr_merges         __attribute__ ((packed));
+       /* Time of write requests in queue */
+       unsigned long wr_ticks          __attribute__ ((packed));
+       /* # of I/Os in progress */
+       unsigned long ios_pgr           __attribute__ ((packed));
+       /* # of ticks total (for this device) for I/O */
+       unsigned long tot_ticks         __attribute__ ((packed));
+       /* # of ticks requests spent in queue */
+       unsigned long rq_ticks          __attribute__ ((packed));
+       /* # of I/O done since last reboot */
+       unsigned long dk_drive          __attribute__ ((packed));
+       /* # of blocks read */
+       unsigned long dk_drive_rblk     __attribute__ ((packed));
+       /* # of blocks written */
+       unsigned long dk_drive_wblk     __attribute__ ((packed));
+};
+
+#define IO_STATS_SIZE  (sizeof(struct io_stats))
+
+struct io_hdr_stats {
+       unsigned int active             __attribute__ ((aligned (4)));
+       unsigned int used               __attribute__ ((packed));
+       char name[MAX_NAME_LEN];
+};
+
+#define IO_HDR_STATS_SIZE      (sizeof(struct io_hdr_stats))
+
+/* List of devices entered on the command line */
+struct io_dlist {
+       /* Indicate whether its partitions are to be displayed or not */
+       int disp_part                   __attribute__ ((aligned (4)));
+       /* Device name */
+       char dev_name[MAX_NAME_LEN];
+};
+
+#define IO_DLIST_SIZE  (sizeof(struct io_dlist))
+
+#endif  /* _IOSTAT_H */
diff --git a/man/cifsiostat.1 b/man/cifsiostat.1
new file mode 100644 (file)
index 0000000..d588651
--- /dev/null
@@ -0,0 +1,137 @@
+.TH CIFSIOSTAT 1 "JULY 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+cifsiostat \- Report CIFS statistics.
+.SH SYNOPSIS
+.B cifsiostat [ -h ] [ -k | -m ] [ -t ] [ -V ] [
+.I interval
+.B [
+.I count
+.B ] ]
+.SH DESCRIPTION
+The
+.B cifsiostat
+command displays statistics about read and write operations
+on CIFS filesystems.
+
+The
+.I interval
+parameter specifies the amount of time in seconds between
+each report. The first report contains statistics for the time since
+system startup (boot). Each subsequent report contains statistics
+collected during the interval since the previous report.
+A report consists of a CIFS header row followed by
+a line of statistics for each CIFS filesystem that is mounted.
+The
+.I count
+parameter can be specified in conjunction with the
+.I interval
+parameter. If the
+.I count
+parameter is specified, the value of
+.I count
+determines the number of reports generated at
+.I interval
+seconds apart. If the
+.I interval
+parameter is specified without the
+.I count
+parameter, the
+.B cifsiostat
+command generates reports continuously.
+
+.SH REPORT
+The CIFS report provides statistics for each mounted CIFS filesystem.
+The report shows the following fields:
+
+.B Filesystem:
+.RS
+This columns shows the mount point of the CIFS filesystem.
+
+.RE
+.B rB/s (rkB/s, rMB/s)
+.RS
+Indicate the average number of bytes (kilobytes, megabytes) read per second.
+
+.RE
+.B wB/s (wkB/s, wMB/s)
+.RS
+Indicate the average number of bytes (kilobytes, megabytes) written per second.
+
+.RE
+.B rop/s
+.RS
+Indicate the number of 'read' operations that were issued to the filesystem
+per second.
+
+.RE
+.B wop/s
+.RS
+Indicate the number of 'write' operations that were issued to the filesystem
+per second.
+
+.RE
+.B fo/s
+.RS
+Indicate the number of open files per second.
+
+.RE
+.B fc/s
+.RS
+Indicate the number of closed files per second.
+
+.RE
+.B fd/s
+.RS
+Indicate the number of deleted files per second.
+.RE
+.RE
+.SH OPTIONS
+.IP -h
+Make the CIFS report easier to read by a human.
+.IP -k
+Display statistics in kilobytes per second.
+.IP -m
+Display statistics in megabytes per second.
+.IP -t
+Print the time for each report displayed. The timestamp format may depend
+on the value of the S_TIME_FORMAT environment variable (see below).
+.IP -V
+Print version number then exit.
+
+.SH ENVIRONMENT
+The
+.B cifsiostat
+command takes into account the following environment variables:
+
+.IP S_TIME_FORMAT
+If this variable exists and its value is
+.BR ISO
+then the current locale will be ignored when printing the date in the report
+header. The
+.B nfsiostat
+command will use the ISO 8601 format (YYYY-MM-DD) instead.
+The timestamp displayed with option -t will also be compliant with ISO 8601
+format.
+
+.SH BUG
+.I /proc
+filesystem must be mounted for
+.B cifsiostat
+to work.
+
+.SH FILE
+.I /proc/fs/cifs/Stats
+contains CIFS statistics.
+.SH AUTHORS
+Written by Ivana Varekova (varekova <at> redhat.com)
+
+Maintained by Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR pidstat (1),
+.BR mpstat (1),
+.BR vmstat (8),
+.BR iostat (1),
+.BR nfsiostat (1)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/iostat.in b/man/iostat.in
new file mode 100644 (file)
index 0000000..3f3bd8a
--- /dev/null
@@ -0,0 +1,377 @@
+.TH IOSTAT 1 "JUNE 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+iostat \- Report Central Processing Unit (CPU) statistics and input/output
+statistics for devices and partitions.
+.SH SYNOPSIS
+.ie 'yes'@WITH_DEBUG@' \{
+.B iostat [ -c ] [ -d ] [ --debuginfo ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [
+.I device
+.B [...] | ALL ] [ -p [
+.I device
+.B [,...] | ALL ] ] [
+.I interval
+.B [
+.I count
+.B ] ]
+.\}
+.el \{
+.B iostat [ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [
+.I device
+.B [...] | ALL ] [ -p [
+.I device
+.B [,...] | ALL ] ] [
+.I interval
+.B [
+.I count
+.B ] ]
+.\}
+.SH DESCRIPTION
+The
+.B iostat
+command is used for monitoring system input/output device
+loading by observing the time the devices are active in relation
+to their average transfer rates. The
+.B iostat
+command generates reports
+that can be used to change system configuration to better balance
+the input/output load between physical disks.
+
+The first report generated by the
+.B iostat
+command provides statistics
+concerning the time since the system was booted. Each subsequent report
+covers the time since the previous report. All statistics are reported
+each time the iostat command is run. The report consists of a
+CPU header row followed by a row of
+CPU statistics. On
+multiprocessor systems, CPU statistics are calculated system-wide
+as averages among all processors. A device header row is displayed
+followed by a line of statistics for each device that is configured.
+
+The
+.I interval
+parameter specifies the amount of time in seconds between
+each report. The first report contains statistics for the time since
+system startup (boot). Each subsequent report contains statistics
+collected during the interval since the previous report. The
+.I count
+parameter can be specified in conjunction with the
+.I interval
+parameter. If the
+.I count
+parameter is specified, the value of
+.I count
+determines the number of reports generated at
+.I interval
+seconds apart. If the
+.I interval
+parameter is specified without the
+.I count
+parameter, the
+.B iostat
+command generates reports continuously.
+
+.SH REPORTS
+The
+.B iostat
+command generates three types of reports, the CPU
+Utilization report, the Device Utilization report and
+the Network Filesystem report.
+.IP "CPU Utilization Report"
+The first report generated by the
+.B iostat
+command is the CPU
+Utilization Report. For multiprocessor systems, the CPU values are
+global averages among all processors.
+The report has the following format:
+
+.B %user
+.RS
+.RS
+Show the percentage of CPU utilization that occurred while
+executing at the user level (application).
+.RE
+
+.B %nice
+.RS
+Show the percentage of CPU utilization that occurred while
+executing at the user level with nice priority.
+.RE
+
+.B %system
+.RS
+Show the percentage of CPU utilization that occurred while
+executing at the system level (kernel).
+.RE
+
+.B %iowait
+.RS
+Show the percentage of time that the CPU or CPUs were idle during which
+the system had an outstanding disk I/O request.
+.RE
+
+.B %steal
+.RS
+Show the percentage of time spent in involuntary wait by the virtual CPU
+or CPUs while the hypervisor was servicing another virtual processor.
+.RE
+
+.B %idle
+.RS
+Show the percentage of time that the CPU or CPUs were idle and the system
+did not have an outstanding disk I/O request.
+.RE
+.RE
+.IP "Device Utilization Report"
+The second report generated by the
+.B iostat
+command is the Device Utilization
+Report. The device report provides statistics on a per physical device
+or partition basis. Block devices and partitions for which statistics are
+to be displayed may be entered on the command line.
+If no device nor partition
+is entered, then statistics are displayed
+for every device used by the system, and
+providing that the kernel maintains statistics for it.
+If the
+.B ALL
+keyword is given on the command line, then statistics are
+displayed for every device defined by the system, including those
+that have never been used.
+Transfer rates are shown in 1K blocks by default, unless the environment
+variable POSIXLY_CORRECT is set, in which case 512-byte blocks are used.
+The report may show the following fields,
+depending on the flags used:
+
+.B Device:
+.RS
+.RS
+This column gives the device (or partition) name as listed in the /dev
+directory.
+
+.RE
+.B tps
+.RS
+Indicate the number of transfers per second that were issued
+to the device. A transfer is an I/O request to the
+device. Multiple logical requests can be combined into a single I/O
+request to the device. A transfer is of indeterminate size.
+
+.RE
+.B Blk_read/s (kB_read/s, MB_read/s)
+.RS
+Indicate the amount of data read from the device expressed in a number of
+blocks (kilobytes, megabytes) per second. Blocks are equivalent to sectors
+and therefore have a size of 512 bytes.
+
+.RE
+.B Blk_wrtn/s (kB_wrtn/s, MB_wrtn/s)
+.RS
+Indicate the amount of data written to the device expressed in a number of
+blocks (kilobytes, megabytes) per second.
+
+.RE
+.B Blk_read (kB_read, MB_read)
+.RS
+The total number of blocks (kilobytes, megabytes) read.
+
+.RE
+.B Blk_wrtn (kB_wrtn, MB_wrtn)
+.RS
+The total number of blocks (kilobytes, megabytes) written.
+
+.RE
+.B rrqm/s
+.RS
+The number of read requests merged per second that were queued to the device.
+
+.RE
+.B wrqm/s
+.RS
+The number of write requests merged per second that were queued to the device.
+
+.RE
+.B r/s
+.RS
+The number (after merges) of read requests completed per second for the device.
+
+.RE
+.B w/s
+.RS
+The number (after merges) of write requests completed per second for the device.
+
+.RE
+.B rsec/s (rkB/s, rMB/s)
+.RS
+The number of sectors (kilobytes, megabytes) read from the device per second.
+
+.RE
+.B wsec/s (wkB/s, wMB/s)
+.RS
+The number of sectors (kilobytes, megabytes) written to the device per second.
+
+.RE
+.B avgrq-sz
+.RS
+The average size (in sectors) of the requests that were issued to the device.
+
+.RE
+.B avgqu-sz
+.RS
+The average queue length of the requests that were issued to the device.
+
+.RE
+.B await
+.RS
+The average time (in milliseconds) for I/O requests issued to the device
+to be served. This includes the time spent by the requests in queue and
+the time spent servicing them.
+
+.RE
+.B r_await
+.RS
+The average time (in milliseconds) for read requests issued to the device
+to be served. This includes the time spent by the requests in queue and
+the time spent servicing them.
+
+.RE
+.B w_await
+.RS
+The average time (in milliseconds) for write requests issued to the device
+to be served. This includes the time spent by the requests in queue and
+the time spent servicing them.
+
+.RE
+.B svctm
+.RS
+The average service time (in milliseconds) for I/O requests that were issued
+to the device. Warning! Do not trust this field any more.
+This field will be removed in a future sysstat version.
+
+.RE
+.B %util
+.RS
+Percentage of CPU time during which I/O requests were issued to the device
+(bandwidth utilization for the device). Device saturation occurs when this
+value is close to 100%.
+.RE
+.RE
+.SH OPTIONS
+.IP -c
+Display the CPU utilization report.
+.IP -d
+Display the device utilization report.
+.if 'yes'@WITH_DEBUG@' \{
+.IP --debuginfo
+Print debug output to stderr.
+.\}
+.IP -k
+Display statistics in kilobytes per second.
+.IP -m
+Display statistics in megabytes per second.
+.IP -N
+Display the registered device mapper names for any device mapper devices.
+Useful for viewing LVM2 statistics.
+.IP "-p [ { device [,...] | ALL } ]"
+The -p option displays statistics for
+block devices and all their partitions that are used by the system.
+If a device name is entered on the command line, then statistics for it
+and all its partitions are displayed. Last, the
+.B ALL
+keyword indicates that statistics have to be displayed for all the block
+devices and partitions defined by the system, including those that have
+never been used.
+.IP -t
+Print the time for each report displayed. The timestamp format may depend
+on the value of the S_TIME_FORMAT environment variable (see below).
+.IP -V
+Print version number then exit.
+.IP -x
+Display extended statistics.
+.IP -z
+Tell iostat to omit output for any devices for which there was no activity
+during the sample period.
+
+.SH ENVIRONMENT
+The
+.B iostat
+command takes into account the following environment variables:
+
+.IP S_TIME_FORMAT
+If this variable exists and its value is
+.BR ISO
+then the current locale will be ignored when printing the date in the report
+header. The
+.B iostat
+command will use the ISO 8601 format (YYYY-MM-DD) instead.
+The timestamp displayed with option -t will also be compliant with ISO 8601
+format.
+
+.IP POSIXLY_CORRECT
+When this variable is set, transfer rates are shown in 512-byte blocks instead
+of the default 1K blocks.
+
+.SH EXAMPLES
+.B iostat
+.RS
+Display a single history since boot report for all CPU and Devices.
+
+.RE
+.B iostat -d 2
+.RS
+Display a continuous device report at two second intervals.
+
+.RE
+.B iostat -d 2 6
+.RS
+Display six reports at two second intervals for all devices.
+
+.RE
+.B iostat -x sda sdb 2 6
+.RS
+Display six reports of extended statistics at two second intervals for devices
+sda and sdb.
+
+.RE
+.B iostat -p sda 2 6
+.RS
+Display six reports at two second intervals for device sda and all its
+partitions (sda1, etc.)
+.SH BUGS
+.I /proc
+filesystem must be mounted for
+.B iostat
+to work.
+
+Kernels older than 2.6.x are no longer supported.
+
+The average service time (svctm field) value is meaningless,
+as I/O statistics are calculated at block level, and we don't know
+when the disk driver starts to process a request. For this reason,
+this field will be removed in a future sysstat version. 
+.SH FILES
+.I /proc/stat
+contains system statistics.
+
+.I /proc/uptime
+contains system uptime.
+
+.I /proc/diskstats
+contains disks statistics.
+
+.I /sys
+contains statistics for block devices.
+
+.I /proc/self/mountstats
+contains statistics for network filesystems.
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR pidstat (1),
+.BR mpstat (1),
+.BR vmstat (8),
+.BR nfsiostat (1),
+.BR cifsiostat (1)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/mpstat.1 b/man/mpstat.1
new file mode 100644 (file)
index 0000000..1d0527d
--- /dev/null
@@ -0,0 +1,214 @@
+.TH MPSTAT 1 "JANUARY 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+mpstat \- Report processors related statistics.
+.SH SYNOPSIS
+.B mpstat [ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P {
+.I cpu
+.B [,...] | ALL } ] [ -V ] [
+.I interval
+.B [
+.I count
+.B ] ]
+.SH DESCRIPTION
+The
+.B mpstat
+command writes to standard output activities for each available processor,
+processor 0 being the first one.
+Global average activities among all processors are also reported.
+The
+.B mpstat
+command can be used both on SMP and UP machines, but in the latter, only global
+average activities will be printed. If no activity has been selected, then the
+default report is the CPU utilization report.
+
+The
+.I interval
+parameter specifies the amount of time in seconds between each report.
+A value of 0 (or no parameters at all) indicates that processors statistics are
+to be reported for the time since system startup (boot).
+The
+.I count
+parameter can be specified in conjunction with the
+.I interval
+parameter if this one is not set to zero. The value of
+.I count
+determines the number of reports generated at
+.I interval
+seconds apart. If the
+.I interval
+parameter is specified without the
+.I count
+parameter, the
+.B mpstat
+command generates reports continuously.
+
+.SH OPTIONS
+.IP -A
+This option is equivalent to specifying
+.BR "-I ALL -u -P ALL"
+.IP "-I { SUM | CPU | SCPU | ALL }"
+Report interrupts statistics.
+
+With the
+.B SUM
+keyword, the
+.B mpstat
+command reports the total number of interrupts per processor.
+The following values are displayed:
+
+.B CPU
+.RS
+.RS
+Processor number. The keyword
+.I all
+indicates that statistics are calculated as averages among all
+processors.
+.RE
+
+.B intr/s
+.RS
+Show the total number of interrupts received per second by
+the CPU or CPUs.
+.RE
+
+With the
+.B CPU
+keyword, the number of each individual interrupt received per
+second by the CPU or CPUs is displayed.
+
+With the
+.B SCPU
+keyword, the number of each individual software interrupt received per
+second by the CPU or CPUs is displayed. This option works only
+with kernels 2.6.31 and later.
+
+The
+.B ALL
+keyword is equivalent to specifying all the keywords above and
+therefore all the interrupts statistics are displayed.
+.RE
+.RE
+.IP "-P { cpu [,...] | ALL }"
+Indicate the processor number for which statistics are to be reported.
+.I cpu
+is the processor number. Note that processor 0 is the first processor.
+The
+.B ALL
+keyword indicates that statistics are to be reported for all processors.
+.IP -u
+Report CPU utilization. The following values are displayed:
+
+.B CPU
+.RS
+.RS
+Processor number. The keyword
+.I all
+indicates that statistics are calculated as averages among all
+processors.
+.RE
+
+.B %usr
+.RS
+Show the percentage of CPU utilization that occurred while
+executing at the user level (application).
+.RE
+
+.B %nice
+.RS
+Show the percentage of CPU utilization that occurred while
+executing at the user level with nice priority.
+.RE
+
+.B %sys
+.RS
+Show the percentage of CPU utilization that occurred while
+executing at the system level (kernel). Note that this does not
+include time spent servicing hardware and software interrupts.
+.RE
+
+.B %iowait
+.RS
+Show the percentage of time that the CPU or CPUs were idle during which
+the system had an outstanding disk I/O request.
+.RE
+
+.B %irq
+.RS
+Show the percentage of time spent by the CPU or CPUs to service hardware
+interrupts.
+.RE
+
+.B %soft
+.RS
+Show the percentage of time spent by the CPU or CPUs to service software
+interrupts.
+.RE
+
+.B %steal
+.RS
+Show the percentage of time spent in involuntary wait by the virtual CPU
+or CPUs while the hypervisor was servicing another virtual processor.
+.RE
+
+.B %guest
+.RS
+Show the percentage of time spent by the CPU or CPUs to run a virtual
+processor.
+.RE
+
+.B %idle
+.RS
+Show the percentage of time that the CPU or CPUs were idle and the system
+did not have an outstanding disk I/O request.
+.RE
+
+Note: On SMP machines a processor that does not have any activity at all
+is a disabled (offline) processor.
+.RE
+.IP -V
+Print version number then exit.
+
+.SH ENVIRONMENT
+The
+.B mpstat
+command takes into account the following environment variable:
+
+.IP S_TIME_FORMAT
+If this variable exists and its value is
+.BR ISO
+then the current locale will be ignored when printing the date in the report header.
+The
+.B mpstat
+command will use the ISO 8601 format (YYYY-MM-DD) instead.
+
+.SH EXAMPLES
+.B mpstat 2 5
+.RS
+Display five reports of global statistics among all processors at two second intervals.
+.RE
+
+.B mpstat -P ALL 2 5
+.RS
+Display five reports of statistics for all processors at two second intervals.
+
+.SH BUGS
+.I /proc
+filesystem must be mounted for the
+.B mpstat
+command to work.
+
+Only a few activities are given by the Linux kernel for each processor.
+
+.SH FILES
+.IR /proc
+contains various files with system statistics.
+
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR pidstat (1),
+.BR iostat (1),
+.BR vmstat (8)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/nfsiostat.1 b/man/nfsiostat.1
new file mode 100644 (file)
index 0000000..ec667ba
--- /dev/null
@@ -0,0 +1,156 @@
+.TH NFSIOSTAT 1 "JULY 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+nfsiostat \- Report input/output statistics for network filesystems (NFS).
+.SH SYNOPSIS
+.B nfsiostat [ -h ] [ -k | -m ] [ -t ] [ -V ] [
+.I interval
+.B [
+.I count
+.B ] ]
+.SH DESCRIPTION
+The
+.B nfsiostat
+command displays statistics about read and write operations
+on NFS filesystems.
+
+The
+.I interval
+parameter specifies the amount of time in seconds between
+each report. The first report contains statistics for the time since
+system startup (boot). Each subsequent report contains statistics
+collected during the interval since the previous report.
+A report consists of an NFS header row followed by
+a line of statistics for each network filesystem that is mounted.
+The
+.I count
+parameter can be specified in conjunction with the
+.I interval
+parameter. If the
+.I count
+parameter is specified, the value of
+.I count
+determines the number of reports generated at
+.I interval
+seconds apart. If the
+.I interval
+parameter is specified without the
+.I count
+parameter, the
+.B nfsiostat
+command generates reports continuously.
+
+.SH REPORT
+The Network Filesystem (NFS) report provides statistics for each mounted network filesystem.
+The report shows the following fields:
+
+.B Filesystem:
+.RS
+This columns shows the hostname of the NFS server followed by a colon and
+by the directory name where the network filesystem is mounted.
+
+.RE
+.B rBlk_nor/s (rkB_nor/s, rMB_nor)
+.RS
+Indicate the number of blocks (kilobytes, megabytes) read by applications
+via the read(2) system
+call interface. A block has a size of 512 bytes.
+
+.RE
+.B wBlk_nor/s (wkB_nor/s, wMB_nor/s)
+.RS
+Indicate the number of blocks (kilobytes, megabytes) written by applications
+via the write(2) system
+call interface.
+
+.RE
+.B rBlk_dir/s (rkB_dir/s, rMB_dir/s)
+.RS
+Indicate the number of blocks (kilobytes, megabytes) read from files
+opened with the O_DIRECT flag.
+
+.RE
+.B wBlk_dir/s (wkB_dir/s, wMB_dir/s)
+.RS
+Indicate the number of blocks (kilobytes, megabytes) written to files
+opened with the O_DIRECT flag.
+
+.RE
+.B rBlk_svr/s (rkB_svr/s, rMB_svr/s)
+.RS
+Indicate the number of blocks (kilobytes, megabytes) read from the server
+by the NFS client via an NFS READ request.
+
+.RE
+.B wBlk_svr/s (wkB_svr/s, wMB_svr/s)
+.RS
+Indicate the number of blocks (kilobytes, megabytes) written to the server
+by the NFS client via an NFS WRITE request.
+
+.RE
+.B ops/s
+.RS
+Indicate the number of operations that were issued to the filesystem per second.
+
+.RE
+.B rops/s
+.RS
+Indicate the number of 'read' operations that were issued to the filesystem 
+per second.
+
+.RE
+.B wops/s
+.RS
+Indicate the number of 'write' operations that were issued to the filesystem
+per second.
+.RE
+.RE
+.SH OPTIONS
+.IP -h
+Make the NFS report easier to read by a human.
+.IP -k
+Display statistics in kilobytes per second.
+.IP -m
+Display statistics in megabytes per second.
+.IP -t
+Print the time for each report displayed. The timestamp format may depend
+on the value of the S_TIME_FORMAT environment variable (see below).
+.IP -V
+Print version number then exit.
+
+.SH ENVIRONMENT
+The
+.B nfsiostat
+command takes into account the following environment variables:
+
+.IP S_TIME_FORMAT
+If this variable exists and its value is
+.BR ISO
+then the current locale will be ignored when printing the date in the report
+header. The
+.B nfsiostat
+command will use the ISO 8601 format (YYYY-MM-DD) instead.
+The timestamp displayed with option -t will also be compliant with ISO 8601
+format.
+
+.SH BUG
+.I /proc
+filesystem must be mounted for
+.B nfsiostat
+to work.
+
+.SH FILE
+.I /proc/self/mountstats
+contains statistics for network filesystems.
+.SH AUTHORS
+Written by Ivana Varekova (varekova <at> redhat.com)
+
+Maintained by Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR pidstat (1),
+.BR mpstat (1),
+.BR vmstat (8),
+.BR iostat (1),
+.BR cifsiostat (1)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/pidstat.1 b/man/pidstat.1
new file mode 100644 (file)
index 0000000..50e3104
--- /dev/null
@@ -0,0 +1,427 @@
+.TH PIDSTAT 1 "JUNE 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+pidstat \- Report statistics for Linux tasks.
+.SH SYNOPSIS
+.B pidstat [ -C
+.I comm
+.B ] [ -d ] [ -h ] [ -I ] [ -l ] [ -p {
+.I pid
+.B [,...] | SELF | ALL } ] [ -r ] [ -s ] [ -t ] [ -T { TASK | CHILD | ALL } ] [ -u ] [ -V ] [ -w ] [
+.I interval
+.B [
+.I count
+.B ] ]
+.SH DESCRIPTION
+The
+.B pidstat
+command is used for monitoring individual tasks currently being managed
+by the Linux kernel.
+It writes to standard output activities for every task selected with option
+.B -p
+or for every task managed by the Linux kernel if option
+.B -p ALL
+has been used. Not selecting any tasks is equivalent to specifying
+.B -p ALL
+but only active tasks (tasks with non-zero statistics values)
+will appear in the report.
+
+The
+.B pidstat
+command can also be used for monitoring the child processes of selected tasks.
+Read about option
+.B -T
+below.
+
+The
+.I interval
+parameter specifies the amount of time in seconds between each report.
+A value of 0 (or no parameters at all) indicates that tasks statistics are
+to be reported for the time since system startup (boot).
+The
+.I count
+parameter can be specified in conjunction with the
+.I interval
+parameter if this one is not set to zero. The value of
+.I count
+determines the number of reports generated at
+.I interval
+seconds apart. If the
+.I interval
+parameter is specified without the
+.I count
+parameter, the
+.B pidstat
+command generates reports continuously.
+
+You can select information about specific task activities using flags.
+Not specifying any flags selects only CPU activity.
+
+.SH OPTIONS
+.IP "-C comm"
+Display only tasks whose command name includes the string
+.IR comm .
+This string can be a regular expression.
+.IP -d
+Report I/O statistics (kernels 2.6.20 and later only).
+The following values are displayed:
+
+.B PID
+.RS
+.RS
+The identification number of the task being monitored.
+.RE
+
+.B kB_rd/s
+.RS
+Number of kilobytes the task has caused to be read from disk
+per second.
+.RE
+
+.B kB_wr/s
+.RS
+Number of kilobytes the task has caused, or shall cause to be
+written to disk per second.
+.RE
+
+.B kB_ccwr/s
+.RS
+Number of kilobytes whose writing to disk has been cancelled by
+the task. This may occur when the task truncates some
+dirty pagecache. In this case, some IO which another task has
+been accounted for will not be happening.
+.RE
+
+.B Command
+.RS
+The command name of the task.
+.RE
+.RE
+.IP -h
+Display all activities horizontally on a single line. This is
+intended to make it easier to be parsed by other programs.
+.IP -I
+In an SMP environment, indicate that tasks CPU usage
+(as displayed by option
+.B -u
+) should be divided by the total number of processors.
+.IP -l
+Display the process command name and all its arguments.
+.IP "-p { pid [,...] | SELF | ALL }"
+Select tasks (processes) for which statistics are to be reported.
+.B pid
+is the process identification number. The
+.B SELF
+keyword indicates that statistics are to be reported for the
+.B pidstat
+process itself, whereas the
+.B ALL
+keyword indicates that statistics are to be reported for all the
+tasks managed by the system.
+.IP -r
+Report page faults and memory utilization.
+
+When reporting statistics for individual tasks,
+the following values are displayed:
+
+.B PID
+.RS
+.RS
+The identification number of the task being monitored.
+.RE
+
+.B minflt/s
+.RS
+Total number of minor faults the task has made per second, those
+which have not required loading a memory page from disk.
+.RE
+
+.B majflt/s
+.RS
+Total number of major faults the task has made per second, those
+which have required loading a memory page from disk.
+.RE
+
+.B VSZ
+.RS
+Virtual Size: The virtual memory usage of entire task in kilobytes.
+.RE
+
+.B RSS
+.RS
+Resident Set Size: The non-swapped physical memory
+used by the task in kilobytes.
+.RE
+
+.B Command
+.RS
+The command name of the task.
+.RE
+
+When reporting global statistics for tasks and all their children,
+the following values are displayed:
+
+.B PID
+.RS
+The identification number of the task which is being monitored
+together with its children.
+.RE
+
+.B minflt-nr
+.RS
+Total number of minor faults made by the task and all its children,
+and collected during the interval of time.
+.RE
+
+.B majflt-nr
+.RS
+Total number of major faults made by the task and all its children,
+and collected during the interval of time.
+.RE
+
+.B Command
+.RS
+The command name of the task which is being monitored
+together with its children.
+.RE
+.RE
+.IP -s
+Report stack utilization.
+The following values are displayed:
+
+.B PID
+.RS
+.RS
+The identification number of the task being monitored.
+.RE
+
+.B StkSize
+.RS
+The amount of memory in kilobytes reserved for the task as stack,
+but not necessarily used.
+.RE
+
+.B StkRef
+.RS
+The amount of memory in kilobytes used as stack, referenced by the task.
+.RE
+
+.B Command
+.RS
+The command name of the task.
+.RE
+.RE
+.IP -t
+Also display statistics for threads associated with selected tasks.
+
+This option adds the following values to the reports:
+
+.B TGID
+.RS
+.RS
+The identification number of the thread group leader.
+.RE
+
+.B TID
+.RS
+The identification number of the thread being monitored.
+.RE
+.RE
+.IP "-T { TASK | CHILD | ALL }"
+This option specifies what has to be monitored by the
+.B pidstat
+command. The
+.B TASK
+keyword indicates that statistics are to be reported for individual tasks
+(this is the default option) whereas the
+.B CHILD
+keyword indicates that statistics are to be globally reported for the
+selected tasks and all their children. The
+.B ALL
+keyword indicates that statistics are to be reported for
+individual tasks and globally for the selected
+tasks and their children.
+
+Note: Global statistics for tasks and all their children are not available
+for all options of
+.B pidstat.
+Also these statistics are not necessarily relevant to current time interval:
+The statistics of a child process are collected only when it finishes or
+it is killed.
+.IP -u
+Report CPU utilization.
+
+When reporting statistics for individual tasks,
+the following values are displayed:
+
+.B PID
+.RS
+.RS
+The identification number of the task being monitored.
+.RE
+
+.B %usr
+.RS
+Percentage of CPU used by the task while executing at the user level
+(application), with or without nice priority. Note that this field
+does NOT include time spent running a virtual processor.
+.RE
+
+.B %system
+.RS
+Percentage of CPU used by the task while executing at the system level
+(kernel).
+.RE
+
+.B %guest
+.RS
+Percentage of CPU spent by the task in virtual machine (running a virtual
+processor).
+.RE
+
+.B %CPU
+.RS
+Total percentage of CPU time used by the task. In an SMP environment,
+the task's CPU usage will be divided by the total number of CPU's if
+option
+.B -I
+has been entered on the command line.
+.RE
+
+.B CPU
+.RS
+Processor number to which the task is attached.
+.RE
+
+.B Command
+.RS
+The command name of the task.
+.RE
+
+When reporting global statistics for tasks and all their children,
+the following values are displayed:
+
+.B PID
+.RS
+The identification number of the task which is being monitored
+together with its children.
+.RE
+
+.B usr-ms
+.RS
+Total number of milliseconds spent
+by the task and all its children while executing at the
+user level (application), with or without nice priority, and
+collected during the interval of time. Note that this field does
+NOT include time spent running a virtual processor.
+.RE
+
+.B system-ms
+.RS
+Total number of milliseconds spent
+by the task and all its children while executing at the
+system level (kernel), and collected during the interval of time.
+.RE
+
+.B guest-ms
+.RS
+Total number of milliseconds spent
+by the task and all its children in virtual machine (running a virtual
+processor).
+.RE
+
+.B Command
+.RS
+The command name of the task which is being monitored
+together with its children.
+.RE
+.RE
+.IP -V
+Print version number then exit.
+.IP -w
+Report task switching activity (kernels 2.6.23 and later only).
+The following values are displayed:
+
+.B PID
+.RS
+.RS
+The identification number of the task being monitored.
+.RE
+
+.B cswch/s
+.RS
+Total number of voluntary context switches the task made per second.
+A voluntary context switch occurs when a task blocks because it
+requires a resource that is unavailable.
+.RE
+
+.B nvcswch/s
+.RS
+Total number of non voluntary context switches the task made per second.
+A involuntary context switch takes place when a task executes
+for the duration of its time slice and then is forced to relinquish the
+processor.
+.RE
+
+.B Command
+.RS
+The command name of the task.
+.RE
+.RE
+.SH ENVIRONMENT
+The
+.B pidstat
+command takes into account the following environment variable:
+
+.IP S_TIME_FORMAT
+If this variable exists and its value is
+.BR ISO
+then the current locale will be ignored when printing the date in the report header.
+The
+.B pidstat
+command will use the ISO 8601 format (YYYY-MM-DD) instead.
+
+.SH EXAMPLES
+.B pidstat 2 5
+.RS
+Display five reports of CPU statistics for every active task in the system
+at two second intervals.
+.RE
+
+.B pidstat -r -p 1643 2 5
+.RS
+Display five reports of page faults and memory statistics for
+PID 1643 at two second intervals.
+.RE
+
+.B pidstat -C """fox|bird"" -r -p ALL
+.RS
+Display global page faults and memory statistics for all the
+processes whose command name includes the string "fox" or "bird".
+.RE
+
+.B pidstat -T CHILD -r 2 5
+.RS
+Display five reports of page faults statistics at two second intervals
+for the child processes of all tasks in the system. Only child processes
+with non-zero statistics values are displayed.
+.SH BUGS
+.I /proc
+filesystem must be mounted for the
+.B pidstat
+command to work.
+
+.SH FILES
+.IR /proc
+contains various files with system statistics.
+
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR top (1),
+.BR ps (1),
+.BR mpstat (1),
+.BR iostat (1),
+.BR vmstat (8)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/sa1.in b/man/sa1.in
new file mode 100644 (file)
index 0000000..5e84424
--- /dev/null
@@ -0,0 +1,68 @@
+.TH SA1 8 "AUGUST 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+sa1 \- Collect and store binary data in the system activity daily data file.
+.SH SYNOPSIS
+.B @SA_LIB_DIR@/sa1 [ --boot |
+.I interval
+.I count
+.B ]
+.SH DESCRIPTION
+The
+.B sa1
+command is a shell procedure variant of the
+.B sadc
+command and handles all of the flags and parameters of that command. The
+.B sa1
+command collects and stores binary data in the
+.IR @SA_DIR@/sa dd
+file, where the dd parameter indicates the current day. The
+.I interval
+and
+.I count
+parameters specify that the record should be written
+.I count
+times at
+.I interval
+seconds. If no arguments are given to
+.B sa1
+then a single record is written.
+
+The
+.B sa1
+command is designed to be started automatically by the cron command.
+
+.SH OPTIONS
+.IP --boot
+This option tells
+.B sa1
+that the
+.B sadc
+command should be called without specifying the
+.I interval
+and
+.I count
+parameters in order to insert a dummy record, marking the time when the counters
+restarts from 0.
+
+.SH EXAMPLES
+To create a daily record of
+.B sar
+activities, place the following entry in your root or adm crontab file:
+
+.B 0 8-18 * * 1-5 @SA_LIB_DIR@/sa1 1200 3 &
+
+.SH FILES
+.IR @SA_DIR@/sa dd
+.RS
+Indicate the daily data file, where the
+.B dd
+parameter is a number representing the day of the month.
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR sadc (8),
+.BR sa2 (8),
+.BR sadf (1)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/sa2.in b/man/sa2.in
new file mode 100644 (file)
index 0000000..2f688e3
--- /dev/null
@@ -0,0 +1,47 @@
+.TH SA2 8 "AUGUST 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+sa2 \- Write a daily report in the @SA_DIR@ directory.
+.SH SYNOPSIS
+.B @SA_LIB_DIR@/sa2
+.SH DESCRIPTION
+The
+.B sa2
+command is a shell procedure variant of the
+.B sar
+command which writes a daily report in the
+.IR @SA_DIR@/sar dd
+file, where the dd parameter indicates the current day. The
+.B sa2
+command handles all of the flags and parameters of the
+.B sar
+command.
+
+The
+.B sa2
+command is designed to be started automatically by the cron command.
+
+.SH EXAMPLES
+To run the
+.B sa2
+command daily, place the following entry in your root or adm crontab file:
+
+.B 5 19 * * 1-5 @SA_LIB_DIR@/sa2 -A &
+
+This will generate a daily report called
+.IR @SA_DIR@/sar dd
+It will also remove reports more than one week old.
+.SH FILES
+.IR @SA_DIR@/sar dd
+.RS
+Indicate the daily report file, where the
+.B dd
+parameter is a number representing the day of the month.
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR sadc (8),
+.BR sa1 (8),
+.BR sadf (1)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/sadc.in b/man/sadc.in
new file mode 100644 (file)
index 0000000..a2d2679
--- /dev/null
@@ -0,0 +1,208 @@
+.TH SADC 8 "AUGUST 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+sadc \- System activity data collector.
+.SH SYNOPSIS
+.B @SA_LIB_DIR@/sadc [ -C
+.I comment
+.B ] [ -S { INT | DISK | SNMP | IPV6 | POWER | XDISK | ALL | XALL } ] [ -F ] [ -L ] [ -V ] [
+.I interval
+.B [
+.I count
+.B ] ] [
+.I outfile
+.B ]
+.SH DESCRIPTION
+The
+.B sadc
+command samples system data a specified number of times
+(\fIcount\fR) at a specified interval measured in seconds
+(\fIinterval\fR). It writes in binary format to the specified
+.I outfile
+or to standard output. If
+.I outfile
+is set to -, then
+.B sadc
+uses the standard system activity daily data file, the
+.IR @SA_DIR@/sa dd
+file, where the dd parameter indicates the current day.
+By default
+.B sadc
+collects all the data available from the kernel.
+Exceptions are interrupts and disk data, for which the
+relevant options must be explicitly passed to
+.B sadc
+(see options below).
+
+When the
+.I count
+parameter is not specified,
+.B sadc
+writes its data endlessly.
+When both
+.I interval
+and
+.I count
+are not specified, and option -C is not used,
+a dummy record, which is used at system startup to mark
+the time when the counter restarts from 0, will be written.
+For example, one of the system startup script may write the restart mark to
+the daily data file by the command entry:
+
+.B "@SA_LIB_DIR@/sadc -"
+
+The
+.B sadc
+command is intended to be used as a backend to the
+.B sar
+command.
+
+Note: The
+.B sadc
+command only reports on local activities.
+
+.SH OPTIONS
+.IP "-C comment"
+When neither the
+.I interval
+nor the
+.I count
+parameters are specified, this option tells
+.B sadc
+to write a dummy record containing the specified
+.I comment
+string.
+This comment can then be displayed with option -C of
+.BR sar .
+.IP -F
+The creation of
+.I outfile
+will be forced. If the file already exists and has a format unknown to
+.B sadc
+then it will be truncated. This may be useful for daily data files
+created by an older version of
+.B sadc
+and whose format is no longer compatible with current one.
+.IP -L
+.B sadc
+will try to get an exclusive lock on the
+.I outfile
+before writing to it or truncating it. Failure to get the lock is fatal,
+except in the case of trying to write a normal (i.e. not a dummy and not
+a header) record to an existing file, in which case
+.B sadc
+will try again at the next interval. Usually, the only reason a lock
+would fail would be if another
+.B sadc
+process were also writing to the file. This can happen when cron is used
+to launch
+.BR sadc .
+If the system is under heavy load, an old
+.B sadc
+might still be running when cron starts a new one. Without locking,
+this situation can result in a corrupted system activity file.
+.IP "-S { INT | DISK | SNMP | IPV6 | POWER | XDISK | ALL | XALL }"
+Specify which optional activities should be collected by
+.BR sadc .
+Some activities are optional to prevent data files from growing too large.
+The
+.B INT
+keyword indicates that
+.B sadc
+should collect data for system interrupts.
+The
+.B DISK
+keyword indicates that
+.B sadc
+should collect data for block devices.
+The
+.B SNMP
+and
+.B IPV6
+keywords indicate respectively that SNMP and IPv6 statistics should be
+collected by
+.BR sadc .
+The
+.B POWER
+keyword indicates that
+.B sadc
+should collect power management statistics.
+The
+.B ALL
+keyword is equivalent to specifying all the keywords above and therefore
+all previous activities are collected.
+
+The
+.B XDISK
+keyword is an extension to the
+.B DISK
+one and indicates that partition statistics should be collected by
+.B sadc
+in addition to disk statistics. This option works only with kernels 2.6.25
+and later.
+The
+.B XALL
+keyword is equivalent to specifying all the keywords above (including
+keyword extensions) and therefore all possible activities are collected.
+
+Important note: The activities (including optional ones) saved in an existing
+data file prevail over those selected with option -S.
+As a consequence, appending data to an existing data file will result in
+option -S being ignored.
+.IP -V
+Print version number then exit.
+
+.SH ENVIRONMENT
+The
+.B sadc
+command takes into account the following environment variable:
+
+.IP S_TIME_DEF_TIME
+If this variable exists and its value is
+.BR UTC
+then
+.B sadc
+will save its data in UTC time.
+.B sadc
+will also use UTC time instead of local time to determine the current
+daily data file located in the
+.IR @SA_DIR@
+directory.
+.SH EXAMPLES
+.B @SA_LIB_DIR@/sadc 1 10 /tmp/datafile
+.RS
+Write 10 records of one second intervals to the /tmp/datafile binary file.
+.RE
+
+.B @SA_LIB_DIR@/sadc -C Backup_Start /tmp/datafile
+.RS
+Insert the comment Backup_Start into the file /tmp/datafile.
+.RE
+.SH BUGS
+The
+.I /proc
+filesystem must be mounted for the
+.B sadc
+command to work.
+
+All the statistics are not necessarily available, depending on the kernel version used.
+.B sadc
+assumes that you are using at least a 2.6 kernel.
+.SH FILES
+.IR @SA_DIR@/sa dd
+.RS
+Indicate the daily data file, where the
+.B dd
+parameter is a number representing the day of the month.
+
+.RE
+.IR /proc
+contains various files with system statistics.
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR sa1 (8),
+.BR sa2 (8),
+.BR sadf (1)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/sadf.in b/man/sadf.in
new file mode 100644 (file)
index 0000000..7a4a771
--- /dev/null
@@ -0,0 +1,184 @@
+.TH SADF 1 "AUGUST 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+sadf \- Display data collected by sar in multiple formats.
+.SH SYNOPSIS
+.B sadf [ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ] [ -P {
+.I cpu
+.B [,...] | ALL } ] [ -s [
+.I hh:mm:ss
+.B ] ] [ -e [
+.I hh:mm:ss
+.B ] ] [ --
+.I sar_options
+.B ] [
+.I interval
+.B [
+.I count
+.B ] ] [
+.I datafile
+.B ]
+.SH DESCRIPTION
+The
+.B sadf
+command is used for displaying the contents of data files created by the
+.B sar(1)
+command. But unlike sar,
+.B sadf
+can write its data in many different formats (CSV, XML, etc.)
+The default format is one that can
+easily be handled by pattern processing commands like awk (see option -p).
+
+The
+.B sadf
+command extracts and writes to standard output records saved in the
+.I datafile
+file. This file must have been created by a version of
+.B sar
+which is compatible with that of
+.B sadf.
+If
+.I datafile
+is omitted,
+.B sadf
+uses the standard system activity file, the
+.IR @SA_DIR@/sa dd
+file, where the dd parameter indicates the current day.
+
+The
+.I interval
+and
+.I count
+parameters are used to tell
+.B sadf
+to select
+.I count
+records at
+.I interval
+seconds apart. If the
+.I count
+parameter is not set, then all the records saved in the data file will be
+displayed.
+
+All the activity flags of
+.B sar
+may be entered on the command line to indicate which
+activities are to be reported. Before specifying them, put a pair of
+dashes (--) on the command line in order not to confuse the flags
+with those of
+.B sadf.
+Not specifying any flags selects only CPU activity.
+
+.SH OPTIONS
+.IP -C
+Tell
+.B sadf
+to display comments present in file.
+.IP -D
+This option is equivalent to option -d below, except that the timestamp
+is always expressed in seconds since the epoch (00:00:00 UTC 01/01/1970).
+.IP -d
+Print the contents of the data file in a format that can easily
+be ingested by a relational database system. The output consists
+of fields separated by a semicolon. Each record contains
+the hostname of the host where the file was created, the interval value
+(or -1 if not applicable), the timestamp in a form easily acceptable by
+most databases, and additional semicolon separated data fields as specified
+by
+.I sar_options
+command line options.
+Note that the timestamp is displayed in UTC (Coordinated Universal Time)
+unless option -t is used. In this latter case, the timestamp is displayed
+in local time.
+.IP "-e [ hh:mm:ss ]"
+Set the ending time of the report, given in local time. The default ending
+time is 18:00:00. Hours must be given in 24-hour format.
+This option is ignored when option -x is used.
+.IP -h
+When used in conjunction with option -d or -D, all activities
+will be displayed horizontally on a single line.
+.IP -H
+Display the header of the data file.
+.IP "-P { cpu [,...] | ALL }"
+Tell
+.B sadf
+that processor dependent statistics are to be reported only for the
+specified processor or processors. Specifying the
+.B ALL
+keyword reports statistics for each individual processor, and globally for
+all processors. Note that processor 0 is the first processor.
+.IP -p
+Print the contents of the data file in a format that can
+easily be handled by pattern processing commands like awk.
+The output consists of fields separated by a tab. Each record contains the
+hostname of the host where the file was created, the interval value
+(or -1 if not applicable), the timestamp (UTC value - Coordinated Universal
+Time) in seconds from the epoch, the device name (or - if not applicable),
+the field name and its value.
+.IP "-s [ hh:mm:ss ]"
+Set the starting time of the data (given in local time), causing the
+.B sadf
+command to extract records time-tagged at, or following, the time
+specified. The default starting time is 08:00:00.
+Hours must be given in 24-hour format. This option is ignored when
+option -x is used.
+.IP -t
+When this option is used together with options -d or -x, the timestamp
+is displayed in local time instead of UTC (Coordinated Universal Time).
+This option is ignored when options -p or -D are used.
+.IP -V
+Print version number then exit.
+.IP -x
+Print the contents of the data file in XML format.
+Timestamps are displayed in UTC (Coordinated Universal Time)
+unless option -t is used, in which case they are displayed
+in local time. The corresponding
+DTD (Document Type Definition) and XML Schema are included in the sysstat
+source package. They are also available at
+.I http://pagesperso-orange.fr/sebastien.godard/download.html
+
+.SH ENVIRONMENT
+The
+.B sadf
+command takes into account the following environment variable:
+
+.IP S_TIME_DEF_TIME
+If this variable exists and its value is
+.BR UTC
+then
+.B sadf
+will use UTC time instead of local time to determine the current daily data
+file located in the
+.IR @SA_DIR@
+directory.
+.SH EXAMPLES
+.B sadf -d @SA_DIR@/sa21 -- -r -n DEV
+.RS
+Extract memory, swap space and network statistics from system activity
+file 'sa21', and display them in a format that can be ingested by a
+database.
+.RE
+
+.B sadf -p -P 1
+.RS
+Extract CPU statistics for processor 1 (the second processor) from current
+daily data file, and display them in a format that can easily be handled
+by a pattern processing command.
+.RE
+
+.SH FILES
+.IR @SA_DIR@/sa dd
+.RS
+Indicate the daily data file, where the
+.B dd
+parameter is a number representing the day of the month.
+
+.RE
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sar (1),
+.BR sadc (8),
+.BR sa1 (8),
+.BR sa2 (8)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/man/sar.in b/man/sar.in
new file mode 100644 (file)
index 0000000..16ee09f
--- /dev/null
@@ -0,0 +1,1975 @@
+.TH SAR 1 "AUGUST 2010" Linux "Linux User's Manual" -*- nroff -*-
+.SH NAME
+sar \- Collect, report, or save system activity information.
+.SH SYNOPSIS
+.B sar [ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -i
+.I interval
+.B ] [ -p ] [ -q ] [ -r ] [ -R ] [ -S ] [ -t ] [ -u [ ALL ] ]
+[ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
+.B [ -m {
+.I keyword
+.B [,...] | ALL } ]
+.B [ -n {
+.I keyword
+.B [,...] | ALL } ]
+.B [ -I {
+.I int
+.B [,...] | SUM | ALL | XALL } ] [ -P {
+.I cpu
+.B [,...] | ALL } ] [ -o [
+.I filename
+.B ] | -f [
+.I filename
+.B ] ] [ -s [
+.I hh:mm:ss
+.B ] ] [ -e [
+.I hh:mm:ss
+.B ] ] [
+.I interval
+.B [
+.I count
+.B ] ]
+.SH DESCRIPTION
+The
+.B sar
+command writes to standard output the contents of selected
+cumulative activity counters in the operating system. The accounting
+system, based on the values in the
+.I count
+and
+.I interval
+parameters, writes information the specified number of times spaced
+at the specified intervals in seconds.
+If the
+.I interval
+parameter is set to zero, the
+.B sar
+command displays the average statistics for the time
+since the system was started. If the
+.I interval
+parameter is specified without the
+.I count
+parameter, then reports are generated continuously.
+The collected data can also
+be saved in the file specified by the
+.B -o
+.I filename
+flag, in addition to being displayed onto the screen. If
+.I filename
+is omitted, sar uses the standard system activity daily data file,
+the
+.IR @SA_DIR@/sa dd
+file, where the dd parameter indicates the current day.
+By default all the data available from the kernel are saved in the
+data file.
+
+The
+.B sar
+command extracts and writes to standard output records previously
+saved in a file. This file can be either the one specified by the
+.B -f
+flag or, by default, the standard system activity daily data file.
+
+Without the
+.B -P
+flag, the
+.B sar
+command reports system-wide (global among all processors) statistics,
+which are calculated as averages for values expressed as percentages,
+and as sums otherwise. If the
+.B -P
+flag is given, the
+.B sar
+command reports activity which relates to the specified processor or
+processors. If
+.B -P ALL
+is given, the
+.B sar
+command reports statistics for each individual processor and global
+statistics among all processors.
+
+You can select information about specific system activities using
+flags. Not specifying any flags selects only CPU activity.
+Specifying the
+.B -A
+flag is equivalent to specifying
+.BR "-bBdqrRSvwWy -I SUM -I XALL -n ALL -u ALL -P ALL".
+
+The default version of the
+.B sar
+command (CPU utilization report) might be one of the first facilities
+the user runs to begin system activity investigation, because it
+monitors major system resources. If CPU utilization is near 100 percent
+(user + nice + system), the workload sampled is CPU-bound.
+
+If multiple samples and multiple reports are desired, it is convenient
+to specify an output file for the
+.B sar
+command. 
+Run the
+.B sar
+command as a background process. The syntax for this is:
+
+.B sar -o datafile interval count >/dev/null 2>&1 &
+
+All data are captured in binary form and saved to a file (datafile).
+The data can then be selectively displayed with the
+.B sar
+command using the
+.B -f
+option. Set the
+.I interval
+and
+.I count
+parameters to select
+.I count
+records at
+.I interval
+second intervals. If the
+.I count
+parameter is not set, all the records saved in the
+file will be selected.
+Collection of data in this manner is useful to characterize
+system usage over a period of time and determine peak usage hours.
+
+Note:  The
+.B sar
+command only reports on local activities.
+
+.SH OPTIONS
+.IP -A
+This is equivalent to specifying
+.BR "-bBdqrRSuvwWy -I SUM -I XALL -n ALL -u ALL -P ALL".
+.IP -b
+Report I/O and transfer rate statistics.
+The following values are displayed:
+
+.B tps
+.RS
+.RS
+Total number of transfers per second that were issued to physical devices.
+A transfer is an I/O request to a physical device. Multiple logical
+requests can be combined into a single I/O request to the device.
+A transfer is of indeterminate size.
+.RE
+
+.B rtps
+.RS
+Total number of read requests per second issued to physical devices.
+.RE
+
+.B wtps
+.RS
+Total number of write requests per second issued to physical devices.
+.RE
+
+.B bread/s
+.RS
+Total amount of data read from the devices in blocks per second.
+Blocks are equivalent to sectors
+and therefore have a size of 512 bytes.
+.RE
+
+.B bwrtn/s
+.RS
+Total amount of data written to devices in blocks per second.
+.RE
+.RE
+.IP -B
+Report paging statistics.
+The following values are displayed:
+
+.B pgpgin/s
+.RS
+.RS
+Total number of kilobytes the system paged in from disk per second.
+.RE
+
+.B pgpgout/s
+.RS
+Total number of kilobytes the system paged out to disk per second.
+.RE
+
+.B fault/s
+.RS
+Number of page faults (major + minor) made by the system per second.
+This is not a count of page faults that generate I/O, because some page
+faults can be resolved without I/O.
+.RE
+
+.B majflt/s
+.RS
+Number of major faults the system has made per second, those which
+have required loading a memory page from disk.
+.RE
+
+.B pgfree/s
+.RS
+Number of pages placed on the free list by the system per second.
+.RE
+
+.B pgscank/s
+.RS
+Number of pages scanned by the kswapd daemon per second.
+.RE
+
+.B pgscand/s
+.RS
+Number of pages scanned directly per second.
+.RE
+
+.B pgsteal/s
+.RS
+Number of pages the system has reclaimed from cache (pagecache and
+swapcache) per second to satisfy its memory demands.
+.RE
+
+.B %vmeff
+.RS
+Calculated as pgsteal / pgscan, this is a metric of the efficiency of
+page reclaim. If it is near 100% then almost every page coming off the
+tail of the inactive list is being reaped. If it gets too low (e.g. less
+than 30%) then the virtual memory is having some difficulty.
+This field is displayed as zero if no pages have been scanned during the
+interval of time.
+.RE
+.RE
+.IP -C
+When reading data from a file, tell
+.B sar
+to display comments that have been inserted by
+.BR sadc .
+.IP -d
+Report activity for each block device.
+When data are displayed, the device specification
+.I dev m-n
+is generally used (
+.B DEV
+column).
+.B m
+is the major number of the device and
+.B n
+its minor number.
+Device names may also be pretty-printed if option -p
+is used (see below).
+Note that disk activity depends on sadc options "-S DISK" and "-S XDISK"
+to be collected. The following values are displayed:
+
+.B tps
+.RS
+.RS
+Indicate the number of transfers per second that were issued to the device.
+Multiple logical requests can be combined into a single I/O request to the
+device. A transfer is of indeterminate size.
+.RE
+
+.B rd_sec/s
+.RS
+Number of sectors read from the device. The size of a sector is 512 bytes.
+.RE
+
+.B wr_sec/s
+.RS
+Number of sectors written to the device. The size of a sector is 512 bytes.
+.RE
+
+.B avgrq-sz
+.RS
+The average size (in sectors) of the requests that were issued to the device.
+.RE
+
+.B avgqu-sz
+.RS
+The average queue length of the requests that were issued to the device.
+.RE
+
+.B await
+.RS
+The average time (in milliseconds) for I/O requests issued to the device
+to be served. This includes the time spent by the requests in queue and
+the time spent servicing them.
+.RE
+
+.B svctm
+.RS
+The average service time (in milliseconds) for I/O requests that were issued
+to the device. Warning! Do not trust this field any more. This field will be
+removed in a future sysstat version.
+.RE
+
+.B %util
+.RS
+Percentage of CPU time during which I/O requests were issued to the device
+(bandwidth utilization for the device). Device saturation occurs when this
+value is close to 100%.
+.RE
+.RE
+.IP "-e [ hh:mm:ss ]"
+Set the ending time of the report. The default ending time is
+18:00:00. Hours must be given in 24-hour format.
+This option can be used when data are read from
+or written to a file (options
+.B -f
+or
+.B -o
+).
+.IP "-f [ filename ]"
+Extract records from
+.I filename
+(created by the
+.B -o filename
+flag). The default value of the
+.B filename
+parameter is the current daily data file, the
+.IR @SA_DIR@/sa dd
+file. The -f option is exclusive of the -o option.
+.IP -h
+Display a short help message then exit.
+.IP "-i interval"
+Select data records at seconds as close as possible to the number specified
+by the
+.I interval
+parameter.
+.IP "-I { int [,...] | SUM | ALL | XALL }"
+Report statistics for a given interrupt.
+.B int
+is the interrupt number. Specifying multiple
+.B -I int
+parameters on the command line will look at multiple independent interrupts.
+The
+.B SUM
+keyword indicates that the total number of interrupts received per second
+is to be displayed. The
+.B ALL
+keyword indicates that statistics from
+the first 16 interrupts are to be reported, whereas the
+.B XALL
+keyword indicates that statistics from all interrupts, including potential
+APIC interrupt sources, are to be reported.
+Note that interrupt statistics depend on sadc option "-S INT" to be collected.
+.IP "-m { keyword [,...] | ALL }"
+Report power management statistics.
+Note that these statistics depend on sadc option "-S POWER" to be collected.
+
+Possible keywords are
+.BR CPU ,
+.BR FAN ,
+.BR IN
+and
+.BR TEMP .
+
+With the
+.B CPU
+keyword, statistics about CPU clock frequency are reported.
+The following value is displayed:
+
+.B MHz
+.RS
+.RS
+CPU clock frequency in MHz.
+.RE
+
+With the
+.B FAN
+keyword, statistics about fans speed are reported.
+The following values are displayed:
+
+.B rpm
+.RS
+Fan speed expressed in revolutions per minute.
+.RE
+
+.B drpm
+.RS
+This field is calculated as the difference between current fan speed (rpm)
+and its low limit (fan_min).
+.RE
+
+.B DEVICE
+.RS
+Sensor device name.
+.RE
+
+With the
+.B IN
+keyword, statistics about voltage inputs are reported.
+The following values are displayed:
+
+.B inV
+.RS
+Voltage input expressed in Volts.
+.RE
+
+.B %in
+.RS
+Relative input value. A value of 100% means that
+voltage input has reached its high limit (in_max) whereas
+a value of 0% means that it has reached its low limit (in_min).
+.RE
+
+.B DEVICE
+.RS
+Sensor device name.
+.RE
+
+With the
+.B TEMP
+keyword, statistics about devices temperature are reported.
+The following values are displayed:
+
+.B degC
+.RS
+Device temperature expressed in degrees Celsius.
+.RE
+
+.B %temp
+.RS
+Relative device temperature. A value of 100% means that
+temperature has reached its high limit (temp_max).
+.RE
+
+.B DEVICE
+.RS
+Sensor device name.
+.RE
+.RE
+.IP "-n { keyword [,...] | ALL }"
+Report network statistics.
+
+Possible keywords are
+.BR DEV ,
+.BR EDEV ,
+.BR NFS ,
+.BR NFSD ,
+.BR SOCK ,
+.BR IP ,
+.BR EIP ,
+.BR ICMP ,
+.BR EICMP ,
+.BR TCP ,
+.BR ETCP ,
+.BR UDP ,
+.BR SOCK6 ,
+.BR IP6 ,
+.BR EIP6 ,
+.BR ICMP6 ,
+.BR EICMP6
+and
+.BR UDP6 .
+
+With the
+.B DEV
+keyword, statistics from the network devices are reported.
+The following values are displayed:
+
+.B IFACE
+.RS
+.RS
+Name of the network interface for which statistics are reported.
+.RE
+
+.B rxpck/s
+.RS
+Total number of packets received per second.
+.RE
+
+.B txpck/s
+.RS
+Total number of packets transmitted per second.
+.RE
+
+.B rxkB/s
+.RS
+Total number of kilobytes received per second.
+.RE
+
+.B txkB/s
+.RS
+Total number of kilobytes transmitted per second.
+.RE
+
+.B rxcmp/s
+.RS
+Number of compressed packets received per second (for cslip etc.).
+.RE
+
+.B txcmp/s
+.RS
+Number of compressed packets transmitted per second.
+.RE
+
+.B rxmcst/s
+.RS
+Number of multicast packets received per second.
+.RE
+
+With the
+.B EDEV
+keyword, statistics on failures (errors) from the network devices are reported.
+The following values are displayed:
+
+.B IFACE
+.RS
+Name of the network interface for which statistics are reported.
+.RE
+
+.B rxerr/s
+.RS
+Total number of bad packets received per second.
+.RE
+
+.B txerr/s
+.RS
+Total number of errors that happened per second while transmitting packets.
+.RE
+
+.B coll/s
+.RS
+Number of collisions that happened per second while transmitting packets.
+.RE
+
+.B rxdrop/s
+.RS
+Number of received packets dropped per second because of a lack of space in linux buffers.
+.RE
+
+.B txdrop/s
+.RS
+Number of transmitted packets dropped per second because of a lack of space in linux buffers.
+.RE
+
+.B txcarr/s
+.RS
+Number of carrier-errors that happened per second while transmitting packets.
+.RE
+
+.B rxfram/s
+.RS
+Number of frame alignment errors that happened per second on received packets.
+.RE
+
+.B rxfifo/s
+.RS
+Number of FIFO overrun errors that happened per second on received packets.
+.RE
+
+.B txfifo/s
+.RS
+Number of FIFO overrun errors that happened per second on transmitted packets.
+.RE
+
+With the
+.B NFS
+keyword, statistics about NFS client activity are reported.
+The following values are displayed:
+
+.B call/s
+.RS
+Number of RPC requests made per second.
+.RE
+
+.B retrans/s
+.RS
+Number of RPC requests per second, those which needed to be retransmitted (for
+example because of a server timeout).
+.RE
+
+.B read/s
+.RS
+Number of 'read' RPC calls made per second.
+.RE
+
+.B write/s
+.RS
+Number of 'write' RPC calls made per second.
+.RE
+
+.B access/s
+.RS
+Number of 'access' RPC calls made per second.
+.RE
+
+.B getatt/s
+.RS
+Number of 'getattr' RPC calls made per second.
+.RE
+
+With the
+.B NFSD
+keyword, statistics about NFS server activity are reported.
+The following values are displayed:
+
+.B scall/s
+.RS
+Number of RPC requests received per second.
+.RE
+
+.B badcall/s
+.RS
+Number of bad RPC requests received per second, those whose
+processing generated an error.
+.RE
+
+.B packet/s
+.RS
+Number of network packets received per second.
+.RE
+
+.B udp/s
+.RS
+Number of UDP packets received per second.
+.RE
+
+.B tcp/s
+.RS
+Number of TCP packets received per second.
+.RE
+
+.B hit/s
+.RS
+Number of reply cache hits per second.
+.RE
+
+.B miss/s
+.RS
+Number of reply cache misses per second.
+.RE
+
+.B sread/s
+.RS
+Number of 'read' RPC calls received per second.
+.RE
+
+.B swrite/s
+.RS
+Number of 'write' RPC calls received per second.
+.RE
+
+.B saccess/s
+.RS
+Number of 'access' RPC calls received per second.
+.RE
+
+.B sgetatt/s
+.RS
+Number of 'getattr' RPC calls received per second.
+.RE
+
+With the
+.B SOCK
+keyword, statistics on sockets in use are reported
+(IPv4).
+The following values are displayed:
+
+.B totsck
+.RS
+Total number of sockets used by the system.
+.RE
+
+.B tcpsck
+.RS
+Number of TCP sockets currently in use.
+.RE
+
+.B udpsck
+.RS
+Number of UDP sockets currently in use.
+.RE
+
+.B rawsck
+.RS
+Number of RAW sockets currently in use.
+.RE
+
+.B ip-frag
+.RS
+Number of IP fragments currently in use.
+.RE
+
+.B tcp-tw
+.RS
+Number of TCP sockets in TIME_WAIT state.
+.RE
+
+With the
+.B IP
+keyword, statistics about IPv4 network traffic are reported.
+Note that IPv4 statistics depend on sadc option "-S SNMP" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B irec/s
+.RS
+The total number of input datagrams received from interfaces
+per second, including those received in error [ipInReceives].
+.RE
+
+.B fwddgm/s
+.RS
+The 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 find a route to forward them to that final
+destination [ipForwDatagrams].
+.RE
+
+.B idel/s
+.RS
+The total number of input datagrams successfully delivered per second
+to IP user-protocols (including ICMP) [ipInDelivers].
+.RE
+
+.B orq/s
+.RS
+The total number of IP datagrams which local IP user-protocols (including ICMP)
+supplied per second to IP in requests for transmission [ipOutRequests].
+Note that this counter does not include any datagrams counted in fwddgm/s.
+.RE
+
+.B asmrq/s
+.RS
+The number of IP fragments received per second which needed to be
+reassembled at this entity [ipReasmReqds].
+.RE
+
+.B asmok/s
+.RS
+The number of IP datagrams successfully re-assembled per second [ipReasmOKs].
+.RE
+
+.B fragok/s
+.RS
+The number of IP datagrams that have been successfully
+fragmented at this entity per second [ipFragOKs].
+.RE
+
+.B fragcrt/s
+.RS
+The number of IP datagram fragments that have been
+generated per second as a result of fragmentation at this entity [ipFragCreates].
+.RE
+
+With the
+.B EIP
+keyword, statistics about IPv4 network errors are reported.
+Note that IPv4 statistics depend on sadc option "-S SNMP" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B ihdrerr/s
+.RS
+The number of input datagrams discarded per second due to errors in
+their IP headers, including bad checksums, version number
+mismatch, other format errors, time-to-live exceeded, errors
+discovered in processing their IP options, etc. [ipInHdrErrors]
+.RE
+
+.B iadrerr/s
+.RS
+The number of input datagrams discarded per second because the IP
+address in their IP header's destination field was not a
+valid address to be received at this entity. This count
+includes invalid addresses (e.g., 0.0.0.0) and addresses of
+unsupported Classes (e.g., Class E). For entities which are
+not IP routers and therefore do not forward datagrams, this
+counter includes datagrams discarded because the destination
+address was not a local address [ipInAddrErrors].
+.RE
+
+.B iukwnpr/s
+.RS
+The number of locally-addressed datagrams received
+successfully but discarded per second because of an unknown or
+unsupported protocol [ipInUnknownProtos].
+.RE
+
+.B idisc/s
+.RS
+The number of input IP datagrams per second for which no problems were
+encountered to prevent their continued processing, but which
+were discarded (e.g., for lack of buffer space) [ipInDiscards].
+Note that this counter does not include any datagrams discarded while
+awaiting re-assembly.
+.RE
+
+.B odisc/s
+.RS
+The number of output IP datagrams per second for which no problem was
+encountered to prevent their transmission to their
+destination, but which were discarded (e.g., for lack of
+buffer space) [ipOutDiscards].
+Note that this counter would include
+datagrams counted in fwddgm/s if any such packets met
+this (discretionary) discard criterion.
+.RE
+
+.B onort/s
+.RS
+The number of IP datagrams discarded per second because no route could
+be found to transmit them to their destination [ipOutNoRoutes].
+Note that this counter includes any packets counted in fwddgm/s
+which meet this 'no-route' criterion.
+Note that this includes any datagrams which a host cannot route because all
+of its default routers are down.
+.RE
+
+.B asmf/s
+.RS
+The number of failures detected per second by the IP re-assembly
+algorithm (for whatever reason: timed out, errors, etc) [ipReasmFails].
+Note that this is not necessarily a count of discarded IP
+fragments since some algorithms can lose track of the number of
+fragments by combining them as they are received.
+.RE
+
+.B fragf/s
+.RS
+The number of IP datagrams that have been discarded per second because
+they needed to be fragmented at this entity but could not
+be, e.g., because their Don't Fragment flag was set [ipFragFails].
+.RE
+
+With the
+.B ICMP
+keyword, statistics about ICMPv4 network traffic are reported.
+Note that ICMPv4 statistics depend on sadc option "-S SNMP" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B imsg/s
+.RS
+The total number of ICMP messages which the entity
+received per second [icmpInMsgs].
+Note that this counter includes all those counted by ierr/s.
+.RE
+
+.B omsg/s
+.RS
+The total number of ICMP messages which this entity
+attempted to send per second [icmpOutMsgs].
+Note that this counter includes all those counted by oerr/s.
+.RE
+
+.B iech/s
+.RS
+The number of ICMP Echo (request) messages received per second [icmpInEchos].
+.RE
+
+.B iechr/s
+.RS
+The number of ICMP Echo Reply messages received per second [icmpInEchoReps].
+.RE
+
+.B oech/s
+.RS
+The number of ICMP Echo (request) messages sent per second [icmpOutEchos].
+.RE
+
+.B oechr/s
+.RS
+The number of ICMP Echo Reply messages sent per second [icmpOutEchoReps].
+.RE
+
+.B itm/s
+.RS
+The number of ICMP Timestamp (request) messages received per second [icmpInTimestamps].
+.RE
+
+.B itmr/s
+.RS
+The number of ICMP Timestamp Reply messages received per second [icmpInTimestampReps].
+.RE
+
+.B otm/s
+.RS
+The number of ICMP Timestamp (request) messages sent per second [icmpOutTimestamps].
+.RE
+
+.B otmr/s
+.RS
+The number of ICMP Timestamp Reply messages sent per second [icmpOutTimestampReps].
+.RE
+
+.B iadrmk/s
+.RS
+The number of ICMP Address Mask Request messages received per second [icmpInAddrMasks].
+.RE
+
+.B iadrmkr/s
+.RS
+The number of ICMP Address Mask Reply messages received per second [icmpInAddrMaskReps].
+.RE
+
+.B oadrmk/s
+.RS
+The number of ICMP Address Mask Request messages sent per second [icmpOutAddrMasks].
+.RE
+
+.B oadrmkr/s
+.RS
+The number of ICMP Address Mask Reply messages sent per second [icmpOutAddrMaskReps].
+.RE
+
+With the
+.B EICMP
+keyword, statistics about ICMPv4 error messages are reported.
+Note that ICMPv4 statistics depend on sadc option "-S SNMP" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B ierr/s
+.RS
+The number of ICMP messages per second which the entity received but
+determined as having ICMP-specific errors (bad ICMP
+checksums, bad length, etc.) [icmpInErrors].
+.RE
+
+.B oerr/s
+.RS
+The number of ICMP messages per second which this entity did not send
+due to problems discovered within ICMP such as a lack of buffers [icmpOutErrors].
+.RE
+
+.B idstunr/s
+.RS
+The number of ICMP Destination Unreachable messages
+received per second [icmpInDestUnreachs].
+.RE
+
+.B odstunr/s
+.RS
+The number of ICMP Destination Unreachable messages sent per second [icmpOutDestUnreachs].
+.RE
+
+.B itmex/s
+.RS
+The number of ICMP Time Exceeded messages received per second [icmpInTimeExcds].
+.RE
+
+.B otmex/s
+.RS
+The number of ICMP Time Exceeded messages sent per second [icmpOutTimeExcds].
+.RE
+
+.B iparmpb/s
+.RS
+The number of ICMP Parameter Problem messages received per second [icmpInParmProbs].
+.RE
+
+.B oparmpb/s
+.RS
+The number of ICMP Parameter Problem messages sent per second [icmpOutParmProbs].
+.RE
+
+.B isrcq/s
+.RS
+The number of ICMP Source Quench messages received per second [icmpInSrcQuenchs].
+.RE
+
+.B osrcq/s
+.RS
+The number of ICMP Source Quench messages sent per second [icmpOutSrcQuenchs].
+.RE
+
+.B iredir/s
+.RS
+The number of ICMP Redirect messages received per second [icmpInRedirects].
+.RE
+
+.B oredir/s
+.RS
+The number of ICMP Redirect messages sent per second [icmpOutRedirects].
+.RE
+
+With the
+.B TCP
+keyword, statistics about TCPv4 network traffic are reported.
+Note that TCPv4 statistics depend on sadc option "-S SNMP" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B active/s
+.RS
+The number of times TCP connections have made a direct
+transition to the SYN-SENT state from the CLOSED state per second [tcpActiveOpens].
+.RE
+
+.B passive/s
+.RS
+The number of times TCP connections have made a direct
+transition to the SYN-RCVD state from the LISTEN state per second [tcpPassiveOpens].
+.RE
+
+.B iseg/s
+.RS
+The total number of segments received per second, including those
+received in error [tcpInSegs].  This count includes segments received on
+currently established connections.
+.RE
+
+.B oseg/s
+.RS
+The total number of segments sent per second, including those on
+current connections but excluding those containing only
+retransmitted octets [tcpOutSegs].
+.RE
+
+With the
+.B ETCP
+keyword, statistics about TCPv4 network errors are reported.
+Note that TCPv4 statistics depend on sadc option "-S SNMP" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B atmptf/s
+.RS
+The number of times per second TCP connections have made a direct
+transition to the CLOSED state from either the SYN-SENT
+state or the SYN-RCVD state, plus the number of times per second TCP
+connections have made a direct transition to the LISTEN
+state from the SYN-RCVD state [tcpAttemptFails].
+.RE
+
+.B estres/s
+.RS
+The number of times per second TCP connections have made a direct
+transition to the CLOSED state from either the ESTABLISHED
+state or the CLOSE-WAIT state [tcpEstabResets].
+.RE
+
+.B retrans/s
+.RS
+The total number of segments retransmitted per second - that is, the
+number of TCP segments transmitted containing one or more
+previously transmitted octets [tcpRetransSegs].
+.RE
+
+.B isegerr/s
+.RS
+The total number of segments received in error (e.g., bad
+TCP checksums) per second [tcpInErrs].
+.RE
+
+.B orsts/s
+.RS
+The number of TCP segments sent per second containing the RST flag [tcpOutRsts].
+.RE
+
+With the
+.B UDP
+keyword, statistics about UDPv4 network traffic are reported.
+Note that UDPv4 statistics depend on sadc option "-S SNMP" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B idgm/s
+.RS
+The total number of UDP datagrams delivered per second to UDP users [udpInDatagrams].
+.RE
+
+.B odgm/s
+.RS
+The total number of UDP datagrams sent per second from this entity [udpOutDatagrams].
+.RE
+
+.B noport/s
+.RS
+The total number of received UDP datagrams per second for which there
+was no application at the destination port [udpNoPorts].
+.RE
+
+.B idgmerr/s
+.RS
+The 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].
+.RE
+
+With the
+.B SOCK6
+keyword, statistics on sockets in use are reported (IPv6).
+Note that IPv6 statistics depend on sadc option "-S IPV6" to be
+collected.
+The following values are displayed:
+
+.B tcp6sck
+.RS
+Number of TCPv6 sockets currently in use.
+.RE
+
+.B udp6sck
+.RS
+Number of UDPv6 sockets currently in use.
+.RE
+
+.B raw6sck
+.RS
+Number of RAWv6 sockets currently in use.
+.RE
+
+.B ip6-frag
+.RS
+Number of IPv6 fragments currently in use.
+.RE
+
+With the
+.B IP6
+keyword, statistics about IPv6 network traffic are reported.
+Note that IPv6 statistics depend on sadc option "-S IPV6" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B irec6/s
+.RS
+The total number of input datagrams received from
+interfaces per second, including those received in error
+[ipv6IfStatsInReceives].
+.RE
+
+.B fwddgm6/s
+.RS
+The number of output datagrams per second which this
+entity received and forwarded to their final
+destinations [ipv6IfStatsOutForwDatagrams].
+.RE
+
+.B idel6/s
+.RS
+The total number of datagrams successfully
+delivered per second to IPv6 user-protocols (including ICMP)
+[ipv6IfStatsInDelivers].
+.RE
+
+.B orq6/s
+.RS
+The total number of IPv6 datagrams which local IPv6
+user-protocols (including ICMP) supplied per second to IPv6 in
+requests for transmission [ipv6IfStatsOutRequests].
+Note that this counter
+does not include any datagrams counted in fwddgm6/s.
+.RE
+
+.B asmrq6/s
+.RS
+The number of IPv6 fragments received per second which needed
+to be reassembled at this interface [ipv6IfStatsReasmReqds].
+.RE
+
+.B asmok6/s
+.RS
+The number of IPv6 datagrams successfully
+reassembled per second [ipv6IfStatsReasmOKs].
+.RE
+
+.B imcpck6/s
+.RS
+The number of multicast packets received per second
+by the interface [ipv6IfStatsInMcastPkts].
+.RE
+
+.B omcpck6/s
+.RS
+The number of multicast packets transmitted per second
+by the interface [ipv6IfStatsOutMcastPkts].
+.RE
+
+.B fragok6/s
+.RS
+The number of IPv6 datagrams that have been
+successfully fragmented at this output interface per second
+[ipv6IfStatsOutFragOKs].
+.RE
+
+.B fragcr6/s
+.RS
+The number of output datagram fragments that have
+been generated per second as a result of fragmentation at
+this output interface [ipv6IfStatsOutFragCreates].
+.RE
+
+With the
+.B EIP6
+keyword, statistics about IPv6 network errors are reported.
+Note that IPv6 statistics depend on sadc option "-S IPV6" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B ihdrer6/s
+.RS
+The number of input datagrams discarded per second due to
+errors in their IPv6 headers, including version
+number mismatch, other format errors, hop count
+exceeded, errors discovered in processing their
+IPv6 options, etc. [ipv6IfStatsInHdrErrors]
+.RE
+
+.B iadrer6/s
+.RS
+The number of input datagrams discarded per second because
+the IPv6 address in their IPv6 header's destination
+field was not a valid address to be received at
+this entity. This count includes invalid
+addresses (e.g., ::0) and unsupported addresses
+(e.g., addresses with unallocated prefixes). For
+entities which are not IPv6 routers and therefore
+do not forward datagrams, this counter includes
+datagrams discarded because the destination address
+was not a local address [ipv6IfStatsInAddrErrors].
+.RE
+
+.B iukwnp6/s
+.RS
+The number of locally-addressed datagrams
+received successfully but discarded per second because of an
+unknown or unsupported protocol [ipv6IfStatsInUnknownProtos].
+.RE
+
+.B i2big6/s
+.RS
+The number of input datagrams that could not be
+forwarded per second because their size exceeded the link MTU
+of outgoing interface [ipv6IfStatsInTooBigErrors].
+.RE
+
+.B idisc6/s
+.RS
+The number of input IPv6 datagrams per second for which no
+problems were encountered to prevent their
+continued processing, but which were discarded
+(e.g., for lack of buffer space)
+[ipv6IfStatsInDiscards]. Note that this
+counter does not include any datagrams discarded
+while awaiting re-assembly.
+.RE
+
+.B odisc6/s
+.RS
+The number of output IPv6 datagrams per second for which no
+problem was encountered to prevent their
+transmission to their destination, but which were
+discarded (e.g., for lack of buffer space)
+[ipv6IfStatsOutDiscards]. Note
+that this counter would include datagrams counted
+in fwddgm6/s if any such packets
+met this (discretionary) discard criterion.
+.RE
+
+.B inort6/s
+.RS
+The number of input datagrams discarded per second because no
+route could be found to transmit them to their
+destination [ipv6IfStatsInNoRoutes].
+.RE
+
+.B onort6/s
+.RS
+The number of locally generated IP datagrams discarded per second
+because no route could be found to transmit them to their
+destination [unknown formal SNMP name].
+.RE
+
+.B asmf6/s
+.RS
+The number of failures detected per second by the IPv6
+re-assembly algorithm (for whatever reason: timed
+out, errors, etc.) [ipv6IfStatsReasmFails].
+Note that this is not
+necessarily a count of discarded IPv6 fragments
+since some algorithms
+can lose track of the number of fragments
+by combining them as they are received.
+.RE
+
+.B fragf6/s
+.RS
+The number of IPv6 datagrams that have been
+discarded per second because they needed to be fragmented
+at this output interface but could not be
+[ipv6IfStatsOutFragFails].
+.RE
+
+.B itrpck6/s
+.RS
+The number of input datagrams discarded per second because
+datagram frame didn't carry enough data
+[ipv6IfStatsInTruncatedPkts].
+.RE
+
+With the
+.B ICMP6
+keyword, statistics about ICMPv6 network traffic are reported.
+Note that ICMPv6 statistics depend on sadc option "-S IPV6" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B imsg6/s
+.RS
+The total number of ICMP messages received
+by the interface per second which includes all those
+counted by ierr6/s [ipv6IfIcmpInMsgs].
+.RE
+
+.B omsg6/s
+.RS
+The total number of ICMP messages which this
+interface attempted to send per second [ipv6IfIcmpOutMsgs].
+.RE
+
+.B iech6/s
+.RS
+The number of ICMP Echo (request) messages
+received by the interface per second [ipv6IfIcmpInEchos].
+.RE
+
+.B iechr6/s
+.RS
+The number of ICMP Echo Reply messages received
+by the interface per second [ipv6IfIcmpInEchoReplies].
+.RE
+
+.B oechr6/s
+.RS
+The number of ICMP Echo Reply messages sent
+by the interface per second [ipv6IfIcmpOutEchoReplies].
+.RE
+
+.B igmbq6/s
+.RS
+The number of ICMPv6 Group Membership Query
+messages received by the interface per second
+[ipv6IfIcmpInGroupMembQueries].
+.RE
+
+.B igmbr6/s
+.RS
+The number of ICMPv6 Group Membership Response messages
+received by the interface per second
+[ipv6IfIcmpInGroupMembResponses].
+.RE
+
+.B ogmbr6/s
+.RS
+The number of ICMPv6 Group Membership Response
+messages sent per second
+[ipv6IfIcmpOutGroupMembResponses].
+.RE
+
+.B igmbrd6/s
+.RS
+The number of ICMPv6 Group Membership Reduction messages
+received by the interface per second
+[ipv6IfIcmpInGroupMembReductions].
+.RE
+
+.B ogmbrd6/s
+.RS
+The number of ICMPv6 Group Membership Reduction
+messages sent per second
+[ipv6IfIcmpOutGroupMembReductions].
+.RE
+
+.B irtsol6/s
+.RS
+The number of ICMP Router Solicit messages
+received by the interface per second
+[ipv6IfIcmpInRouterSolicits].
+.RE
+
+.B ortsol6/s
+.RS
+The number of ICMP Router Solicitation messages
+sent by the interface per second
+[ipv6IfIcmpOutRouterSolicits].
+.RE
+
+.B irtad6/s
+.RS
+The number of ICMP Router Advertisement messages
+received by the interface per second
+[ipv6IfIcmpInRouterAdvertisements].
+.RE
+
+.B inbsol6/s
+.RS
+The number of ICMP Neighbor Solicit messages
+received by the interface per second
+[ipv6IfIcmpInNeighborSolicits].
+.RE
+
+.B onbsol6/s
+.RS
+The number of ICMP Neighbor Solicitation
+messages sent by the interface per second
+[ipv6IfIcmpOutNeighborSolicits].
+.RE
+
+.B inbad6/s
+.RS
+The number of ICMP Neighbor Advertisement
+messages received by the interface per second
+[ipv6IfIcmpInNeighborAdvertisements].
+.RE
+
+.B onbad6/s
+.RS
+The number of ICMP Neighbor Advertisement
+messages sent by the interface per second
+[ipv6IfIcmpOutNeighborAdvertisements].
+.RE
+
+With the
+.B EICMP6
+keyword, statistics about ICMPv6 error messages are reported.
+Note that ICMPv6 statistics depend on sadc option "-S IPV6" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B ierr6/s
+.RS
+The number of ICMP messages per second which the interface
+received but determined as having ICMP-specific
+errors (bad ICMP checksums, bad length, etc.)
+[ipv6IfIcmpInErrors]
+.RE
+
+.B idtunr6/s
+.RS
+The number of ICMP Destination Unreachable
+messages received by the interface per second
+[ipv6IfIcmpInDestUnreachs].
+.RE
+
+.B odtunr6/s
+.RS
+The number of ICMP Destination Unreachable
+messages sent by the interface per second
+[ipv6IfIcmpOutDestUnreachs].
+.RE
+
+.B itmex6/s
+.RS
+The number of ICMP Time Exceeded messages
+received by the interface per second
+[ipv6IfIcmpInTimeExcds].
+.RE
+
+.B otmex6/s
+.RS
+The number of ICMP Time Exceeded messages sent
+by the interface per second
+[ipv6IfIcmpOutTimeExcds].
+.RE
+
+.B iprmpb6/s
+.RS
+The number of ICMP Parameter Problem messages
+received by the interface per second
+[ipv6IfIcmpInParmProblems].
+.RE
+
+.B oprmpb6/s
+.RS
+The number of ICMP Parameter Problem messages
+sent by the interface per second
+[ipv6IfIcmpOutParmProblems].
+.RE
+
+.B iredir6/s
+.RS
+The number of Redirect messages received
+by the interface per second
+[ipv6IfIcmpInRedirects].
+.RE
+
+.B oredir6/s
+.RS
+The number of Redirect messages sent by
+the interface by second
+[ipv6IfIcmpOutRedirects].
+.RE
+
+.B ipck2b6/s
+.RS
+The number of ICMP Packet Too Big messages
+received by the interface per second
+[ipv6IfIcmpInPktTooBigs].
+.RE
+
+.B opck2b6/s
+.RS
+The number of ICMP Packet Too Big messages sent
+by the interface per second
+[ipv6IfIcmpOutPktTooBigs].
+.RE
+
+With the
+.B UDP6
+keyword, statistics about UDPv6 network traffic are reported.
+Note that UDPv6 statistics depend on sadc option "-S IPV6" to be
+collected.
+The following values are displayed (formal SNMP names between
+square brackets):
+
+.B idgm6/s
+.RS
+The total number of UDP datagrams delivered per second to UDP users
+[udpInDatagrams].
+.RE
+
+.B odgm6/s
+.RS
+The total number of UDP datagrams sent per second from this
+entity [udpOutDatagrams].
+.RE
+
+.B noport6/s
+.RS
+The total number of received UDP datagrams per second for which there
+was no application at the destination port [udpNoPorts].
+.RE
+
+.B idgmer6/s
+.RS
+The 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].
+.RE
+
+The
+.B ALL
+keyword is equivalent to specifying all the keywords above and therefore all the network
+activities are reported.
+.RE
+.RE
+.IP "-o [ filename ]"
+Save the readings in the file in binary form. Each reading
+is in a separate record. The default value of the
+.B filename
+parameter is the current daily data file, the
+.IR @SA_DIR@/sa dd
+file. The -o option is exclusive of the -f option.
+All the data available from the kernel are saved in the file (in fact,
+.B sar
+calls its data collector
+.B sadc
+with the option "-S ALL". See sadc(8) manual page).
+.IP "-P { cpu [,...] | ALL }"
+Report per-processor statistics for the specified processor or processors.
+Specifying the
+.B ALL
+keyword reports statistics for each individual processor, and globally for
+all processors.
+Note that processor 0 is the first processor.
+.IP -p
+Pretty-print device names. Use this option in conjunction with option -d.
+By default names are printed as
+.B dev m-n
+where m and n are the major and minor numbers for the device.
+Use of this option displays the names of the devices as they (should) appear
+in /dev. Name mappings are controlled by
+.B @SYSCONFIG_DIR@/sysstat.ioconf.
+.IP -q
+Report queue length and load averages. The following values are displayed:
+
+.B runq-sz
+.RS
+.RS
+Run queue length (number of tasks waiting for run time). 
+.RE
+
+.B plist-sz
+.RS
+Number of tasks in the task list.
+.RE
+
+.B ldavg-1
+.RS
+System load average for the last minute.
+The load average is calculated as the average number of runnable or
+running tasks (R state), and the number of tasks in uninterruptible
+sleep (D state) over the specified interval.
+.RE
+
+.B ldavg-5
+.RS
+System load average for the past 5 minutes.
+.RE
+
+.B ldavg-15
+.RS
+System load average for the past 15 minutes.
+.RE
+.RE
+.IP -r
+Report memory utilization statistics.
+The following values are displayed:
+
+.B kbmemfree
+.RS
+.RS
+Amount of free memory available in kilobytes.
+.RE
+
+.B kbmemused
+.RS
+Amount of used memory in kilobytes. This does not take into account memory
+used by the kernel itself.
+.RE
+
+.B %memused
+.RS
+Percentage of used memory.
+.RE
+
+.B kbbuffers
+.RS
+Amount of memory used as buffers by the kernel in kilobytes.
+.RE
+
+.B kbcached
+.RS
+Amount of memory used to cache data by the kernel in kilobytes.
+.RE
+
+.B kbcommit
+.RS
+Amount of memory in kilobytes needed for current workload. This is an estimate of how much
+RAM/swap is needed to guarantee that there never is out of memory.
+.RE
+
+.B %commit
+.RS
+Percentage of memory needed for current workload in relation to the total amount of memory (RAM+swap).
+This number may be greater than 100% because the kernel usually overcommits memory.
+
+.RE
+.RE
+.IP -R
+Report memory statistics. The following values are displayed:
+
+.B frmpg/s
+.RS
+.RS
+Number of memory pages freed by the system per second.
+A negative value represents a number of pages allocated by the system.
+Note that a page has a size of 4 kB or 8 kB according to the machine architecture.
+.RE
+
+.B bufpg/s
+.RS
+Number of additional memory pages used as buffers by the system per second.
+A negative value means fewer pages used as buffers by the system.
+.RE
+
+.B campg/s
+.RS
+Number of additional memory pages cached by the system per second.
+A negative value means fewer pages in the cache.
+.RE
+.RE
+.IP "-s [ hh:mm:ss ]"
+Set the starting time of the data, causing the
+.B sar
+command to extract records time-tagged at, or following, the time
+specified. The default starting time is 08:00:00.
+Hours must be given in 24-hour format. This option can be
+used only when data are read from a file (option
+.B -f
+).
+.IP -S
+Report swap space utilization statistics.
+The following values are displayed:
+
+.B kbswpfree
+.RS
+.RS
+Amount of free swap space in kilobytes.
+.RE
+
+.B kbswpused
+.RS
+Amount of used swap space in kilobytes.
+.RE
+
+.B %swpused
+.RS
+Percentage of used swap space.
+.RE
+
+.B kbswpcad
+.RS
+Amount of cached swap memory in kilobytes.
+This is memory that once was swapped out, is swapped back in
+but still also is in the swap area (if memory is needed it doesn't need
+to be swapped out again because it is already in the swap area. This
+saves I/O).
+.RE
+
+.B %swpcad
+.RS
+Percentage of cached swap memory in relation to the amount of used swap space.
+.RE
+.RE
+.IP -t
+When reading data from a daily data file, indicate that
+.B sar
+should display the timestamps in the original locale time of
+the data file creator. Without this option, the
+.B sar
+command displays the timestamps in the user's locale time.
+.IP "-u [ ALL ]"
+Report CPU utilization. The
+.B ALL
+keyword indicates that all the CPU fields should be displayed.
+The report may show the following fields:
+
+.B %user
+.RS
+.RS
+Percentage of CPU utilization that occurred while executing at the user
+level (application). Note that this field includes time spent running
+virtual processors.
+.RE
+
+.B %usr
+.RS
+Percentage of CPU utilization that occurred while executing at the user
+level (application). Note that this field does NOT include time spent
+running virtual processors.
+.RE
+
+.B %nice
+.RS
+Percentage of CPU utilization that occurred while executing at the user
+level with nice priority.
+.RE
+
+.B %system
+.RS
+Percentage of CPU utilization that occurred while executing at the system
+level (kernel). Note that this field includes time spent servicing
+hardware and software interrupts.
+.RE
+
+.B %sys
+.RS
+Percentage of CPU utilization that occurred while executing at the system
+level (kernel). Note that this field does NOT include time spent servicing
+hardware or software interrupts.
+.RE
+
+.B %iowait
+.RS
+Percentage of time that the CPU or CPUs were idle during which
+the system had an outstanding disk I/O request.
+.RE
+
+.B %steal
+.RS
+Percentage of time spent in involuntary wait by the virtual CPU
+or CPUs while the hypervisor was servicing another virtual processor.
+.RE
+
+.B %irq
+.RS
+Percentage of time spent by the CPU or CPUs to service hardware interrupts.
+.RE
+
+.B %soft
+.RS
+Percentage of time spent by the CPU or CPUs to service software interrupts.
+.RE
+
+.B %guest
+.RS
+Percentage of time spent by the CPU or CPUs to run a virtual processor.
+.RE
+
+.B %idle
+.RS
+Percentage of time that the CPU or CPUs were idle and the system
+did not have an outstanding disk I/O request.
+.RE
+
+Note: On SMP machines a processor that does not have any activity at all
+(0.00 for every field) is a disabled (offline) processor.
+.RE
+.IP -v
+Report status of inode, file and other kernel tables.
+The following values are displayed:
+
+.B dentunusd
+.RS
+.RS
+Number of unused cache entries in the directory cache.
+.RE
+
+.B file-nr
+.RS
+Number of file handles used by the system.
+.RE
+
+.B inode-nr
+.RS
+Number of inode handlers used by the system.
+.RE
+
+.B pty-nr
+.RS
+Number of pseudo-terminals used by the system.
+.RE
+.RE
+.IP -V
+Print version number then exit.
+.IP -w
+Report task creation and system switching activity.
+
+.B proc/s
+.RS
+.RS
+Total number of tasks created per second.
+.RE
+
+.B cswch/s
+.RS
+Total number of context switches per second.
+.RE
+.RE
+.IP -W
+Report swapping statistics. The following values are displayed:
+
+.B pswpin/s
+.RS
+.RS
+Total number of swap pages the system brought in per second.
+.RE
+
+.B pswpout/s
+.RS
+Total number of swap pages the system brought out per second.
+.RE
+.RE
+.IP -y
+Report TTY device activity. The following values are displayed:
+
+.B rcvin/s
+.RS
+.RS
+Number of receive interrupts per second for current serial line. Serial line number
+is given in the TTY column.
+.RE
+
+.B xmtin/s
+.RS
+Number of transmit interrupts per second for current serial line.
+.RE
+
+.B framerr/s
+.RS
+Number of frame errors per second for current serial line.
+.RE
+
+.B prtyerr/s
+.RS
+Number of parity errors per second for current serial line.
+.RE
+
+.B brk/s
+.RS
+Number of breaks per second for current serial line.
+.RE
+
+.B ovrun/s
+.RS
+Number of overrun errors per second for current serial line.
+.RE
+.RE
+
+.SH ENVIRONMENT
+The
+.B sar
+command takes into account the following environment variables:
+
+.IP S_TIME_FORMAT
+If this variable exists and its value is
+.BR ISO
+then the current locale will be ignored when printing the date in the report header.
+The
+.B sar
+command will use the ISO 8601 format (YYYY-MM-DD) instead.
+
+.IP S_TIME_DEF_TIME
+If this variable exists and its value is
+.BR UTC
+then
+.B sar
+will save its data in UTC time (data will still be displayed in local time).
+.B sar
+will also use UTC time instead of local time to determine the current daily
+data file located in the
+.IR @SA_DIR@
+directory. This variable may be useful for servers with users located across
+several timezones.
+.SH EXAMPLES
+.B sar -u 2 5
+.RS
+Report CPU utilization for each 2 seconds. 5 lines are displayed.
+.RE
+
+.B sar -I 14 -o int14.file 2 10
+.RS
+Report statistics on IRQ 14 for each 2 seconds. 10 lines are displayed.
+Data are stored in a file called
+.IR int14.file .
+.RE
+
+.B sar -r -n DEV -f @SA_DIR@/sa16
+.RS
+Display memory and network statistics saved in daily data file 'sa16'.
+.RE
+
+.B sar -A
+.RS
+Display all the statistics saved in current daily data file.
+.SH BUGS
+.I /proc
+filesystem must be mounted for the
+.B sar
+command to work.
+
+All the statistics are not necessarily available, depending on the kernel version used.
+.B sar
+assumes that you are using at least a 2.6 kernel.
+.SH FILES
+.IR @SA_DIR@/sa dd
+.RS
+Indicate the daily data file, where the
+.B dd
+parameter is a number representing the day of the month.
+
+.RE
+.IR /proc
+contains various files with system statistics.
+.SH AUTHOR
+Sebastien Godard (sysstat <at> orange.fr)
+.SH SEE ALSO
+.BR sadc (8),
+.BR sa1 (8),
+.BR sa2 (8),
+.BR sadf (1),
+.BR pidstat (1),
+.BR mpstat (1),
+.BR iostat (1),
+.BR vmstat (8)
+
+.I http://pagesperso-orange.fr/sebastien.godard/
diff --git a/mpstat.c b/mpstat.c
new file mode 100644 (file)
index 0000000..f410c92
--- /dev/null
+++ b/mpstat.c
@@ -0,0 +1,984 @@
+/*
+ * mpstat: per-processor statistics
+ * (C) 2000-2009 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+#include <ctype.h>
+#include <sys/utsname.h>
+
+#include "version.h"
+#include "mpstat.h"
+#include "common.h"
+#include "rd_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": "  __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+unsigned long long uptime[3] = {0, 0, 0};
+unsigned long long uptime0[3] = {0, 0, 0};
+
+/* NOTE: Use array of _char_ for bitmaps to avoid endianness problems...*/
+unsigned char *cpu_bitmap;     /* Bit 0: Global; Bit 1: 1st proc; etc. */
+
+/* Structures used to store stats */
+struct stats_cpu *st_cpu[3];
+struct stats_irq *st_irq[3];
+struct stats_irqcpu *st_irqcpu[3];
+struct stats_irqcpu *st_softirqcpu[3];
+
+struct tm mp_tstamp[3];
+
+/* Activity flag */
+unsigned int actflags = 0;
+
+unsigned int flags = 0;
+
+/* Interval and count parameters */
+long interval = -1, count = 0;
+
+/* Nb of processors on the machine */
+int cpu_nr = 0;
+/* Nb of interrupts per processor */
+int irqcpu_nr = 0;
+/* Nb of soft interrupts per processor */
+int softirqcpu_nr = 0;
+
+/*
+ ***************************************************************************
+ * Print usage and exit
+ *
+ * IN:
+ * @progname   Name of sysstat command
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+       fprintf(stderr, _("Usage: %s [ options ] [ <interval> [ <count> ] ]\n"),
+               progname);
+
+       fprintf(stderr, _("Options are:\n"
+                         "[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * SIGALRM signal handler
+ *
+ * IN:
+ * @sig        Signal number. Set to 0 for the first time, then to SIGALRM.
+ ***************************************************************************
+ */
+void alarm_handler(int sig)
+{
+       signal(SIGALRM, alarm_handler);
+       alarm(interval);
+}
+
+/*
+ ***************************************************************************
+ * Allocate stats structures and cpu bitmap.
+ *
+ * IN:
+ * @nr_cpus    Number of CPUs. This is the real number of available CPUs + 1
+ *             because we also have to allocate a structure for CPU 'all'.
+ ***************************************************************************
+ */
+void salloc_mp_struct(int nr_cpus)
+{
+       int i;
+
+       for (i = 0; i < 3; i++) {
+
+               if ((st_cpu[i] = (struct stats_cpu *) malloc(STATS_CPU_SIZE * nr_cpus))
+                   == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(st_cpu[i], 0, STATS_CPU_SIZE * nr_cpus);
+
+               if ((st_irq[i] = (struct stats_irq *) malloc(STATS_IRQ_SIZE * nr_cpus))
+                   == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(st_irq[i], 0, STATS_IRQ_SIZE * nr_cpus);
+
+               if ((st_irqcpu[i] = (struct stats_irqcpu *) malloc(STATS_IRQCPU_SIZE * nr_cpus * irqcpu_nr))
+                   == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(st_irqcpu[i], 0, STATS_IRQCPU_SIZE * nr_cpus * irqcpu_nr);
+
+               if ((st_softirqcpu[i] = (struct stats_irqcpu *) malloc(STATS_IRQCPU_SIZE * nr_cpus * softirqcpu_nr))
+                    == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(st_softirqcpu[i], 0, STATS_IRQCPU_SIZE * nr_cpus * softirqcpu_nr);
+       }
+
+       if ((cpu_bitmap = (unsigned char *) malloc((nr_cpus >> 3) + 1)) == NULL) {
+               perror("malloc");
+               exit(4);
+       }
+       memset(cpu_bitmap, 0, (nr_cpus >> 3) + 1);
+}
+
+/*
+ ***************************************************************************
+ * Free structures and bitmap.
+ ***************************************************************************
+ */
+void sfree_mp_struct(void)
+{
+       int i;
+
+       for (i = 0; i < 3; i++) {
+
+               if (st_cpu[i]) {
+                       free(st_cpu[i]);
+               }
+               if (st_irq[i]) {
+                       free(st_irq[i]);
+               }
+               if (st_irqcpu[i]) {
+                       free(st_irqcpu[i]);
+               }
+               if (st_softirqcpu[i]) {
+                       free(st_softirqcpu[i]);
+               }
+       }
+
+       if (cpu_bitmap) {
+               free(cpu_bitmap);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display per CPU statistics.
+ *
+ * IN:
+ * @st_ic      Array for per-CPU statistics.
+ * @ic_nr      Number of interrupts (hard or soft) per CPU.
+ * @dis                TRUE if a header line must be printed.
+ * @itv                Interval value.
+ * @prev       Position in array where statistics used as reference are.
+ *             Stats used as reference may be the previous ones read, or
+ *             the very first ones when calculating the average.
+ * @curr       Position in array where current statistics will be saved.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ ***************************************************************************
+ */
+void write_irqcpu_stats(struct stats_irqcpu *st_ic[], int ic_nr, int dis,
+                       unsigned long long itv, int prev, int curr,
+                       char *prev_string, char *curr_string)
+{
+       int j = 0, offset, cpu;
+       struct stats_irqcpu *p, *q, *p0, *q0;
+
+       /*
+       * Check if number of interrupts has changed.
+       * NB: A null interval value indicates that we are
+        * displaying statistics since system startup.
+        */
+       if (!dis && interval) {
+               do {
+                       p0 = st_ic[curr] + j;
+                       if (p0->irq_name[0] != '\0') {
+                               q0 = st_ic[prev] + j;
+                               if (strcmp(p0->irq_name, q0->irq_name)) {
+                                       /* These are two different irq */
+                                       j = -2;
+                               }
+                       }
+                       j++;
+               }
+               while ((j > 0) && (j <= ic_nr));
+       }
+
+       if (dis || (j < 0)) {
+               /* Print header */
+               printf("\n%-11s  CPU", prev_string);
+               for (j = 0; j < ic_nr; j++) {
+                       p0 = st_ic[curr] + j;
+                       if (p0->irq_name[0] != '\0') {  /* Nb of irq per proc may have varied... */
+                               printf(" %8s/s", p0->irq_name);
+                       }
+               }
+               printf("\n");
+       }
+
+       for (cpu = 1; cpu <= cpu_nr; cpu++) {
+
+               /*
+               * Check if we want stats about this CPU.
+                * CPU must have been explicitly selected using option -P,
+                * else we display every CPU.
+                */
+               if (!(*(cpu_bitmap + (cpu >> 3)) & (1 << (cpu & 0x07))) && USE_P_OPTION(flags))
+                       continue;
+
+               printf("%-11s  %3d", curr_string, cpu - 1);
+
+               for (j = 0; j < ic_nr; j++) {
+                       p0 = st_ic[curr] + j;   /* irq field set only for proc #0 */
+                       /*
+                        * An empty string for irq name means it is a remaining interrupt
+                        * which is no longer used, for example because the
+                        * number of interrupts has decreased in /proc/interrupts.
+                        */
+                       if (p0->irq_name[0] != '\0') {
+                               q0 = st_ic[prev] + j;
+                               offset = j;
+
+                               /*
+                                * If we want stats for the time since system startup,
+                                * we have p0->irq != q0->irq, since q0 structure is
+                                * completely set to zero.
+                                */
+                               if (strcmp(p0->irq_name, q0->irq_name) && interval) {
+                                       if (j)
+                                               offset = j - 1;
+                                       q0 = st_ic[prev] + offset;
+                                       if (strcmp(p0->irq_name, q0->irq_name) && (j + 1 < ic_nr))
+                                               offset = j + 1;
+                                       q0 = st_ic[prev] + offset;
+                               }
+
+                               if (!strcmp(p0->irq_name, q0->irq_name) || !interval) {
+                                       p = st_ic[curr] + (cpu - 1) * ic_nr + j;
+                                       q = st_ic[prev] + (cpu - 1) * ic_nr + offset;
+                                       printf(" %10.2f",
+                                              S_VALUE(q->interrupt, p->interrupt, itv));
+                               }
+                               else
+                                       printf("        N/A");
+                       }
+               }
+               printf("\n");
+       }
+}
+
+/*
+ ***************************************************************************
+ * Core function used to display statistics
+ *
+ * IN:
+ * @prev       Position in array where statistics used as reference are.
+ *             Stats used as reference may be the previous ones read, or
+ *             the very first ones when calculating the average.
+ * @curr       Position in array where statistics for current sample are.
+ * @dis                TRUE if a header line must be printed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ ***************************************************************************
+ */
+void write_stats_core(int prev, int curr, int dis,
+                     char *prev_string, char *curr_string)
+{
+       struct stats_cpu *scc, *scp;
+       unsigned long long itv, pc_itv, g_itv;
+       int cpu;
+
+       /* Test stdout */
+       TEST_STDOUT(STDOUT_FILENO);
+
+       /* Compute time interval */
+       g_itv = get_interval(uptime[prev], uptime[curr]);
+
+       /* Reduce interval value to one processor */
+       if (cpu_nr > 1) {
+               itv = get_interval(uptime0[prev], uptime0[curr]);
+       }
+       else {
+               itv = g_itv;
+       }
+
+       /* Print CPU stats */
+       if (DISPLAY_CPU(actflags)) {
+               if (dis) {
+                       printf("\n%-11s  CPU    %%usr   %%nice    %%sys %%iowait    %%irq   "
+                              "%%soft  %%steal  %%guest   %%idle\n",
+                              prev_string);
+               }
+
+               /* Check if we want global stats among all proc */
+               if (*cpu_bitmap & 1) {
+
+                       printf("%-11s  all", curr_string);
+
+                       printf("  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f\n",
+                              ll_sp_value(st_cpu[prev]->cpu_user - st_cpu[prev]->cpu_guest,
+                                          st_cpu[curr]->cpu_user - st_cpu[curr]->cpu_guest,
+                                          g_itv),
+                              ll_sp_value(st_cpu[prev]->cpu_nice,
+                                          st_cpu[curr]->cpu_nice,
+                                          g_itv),
+                              ll_sp_value(st_cpu[prev]->cpu_sys,
+                                          st_cpu[curr]->cpu_sys,
+                                          g_itv),
+                              ll_sp_value(st_cpu[prev]->cpu_iowait,
+                                          st_cpu[curr]->cpu_iowait,
+                                          g_itv),
+                              ll_sp_value(st_cpu[prev]->cpu_hardirq,
+                                          st_cpu[curr]->cpu_hardirq,
+                                          g_itv),
+                              ll_sp_value(st_cpu[prev]->cpu_softirq,
+                                          st_cpu[curr]->cpu_softirq,
+                                          g_itv),
+                              ll_sp_value(st_cpu[prev]->cpu_steal,
+                                          st_cpu[curr]->cpu_steal,
+                                          g_itv),
+                              ll_sp_value(st_cpu[prev]->cpu_guest,
+                                          st_cpu[curr]->cpu_guest,
+                                          g_itv),
+                              (st_cpu[curr]->cpu_idle < st_cpu[prev]->cpu_idle) ?
+                              0.0 :    /* Handle buggy kernels */
+                              ll_sp_value(st_cpu[prev]->cpu_idle,
+                                          st_cpu[curr]->cpu_idle,
+                                          g_itv));
+               }
+
+               for (cpu = 1; cpu <= cpu_nr; cpu++) {
+
+                       scc = st_cpu[curr] + cpu;
+                       scp = st_cpu[prev] + cpu;
+
+                       /* Check if we want stats about this proc */
+                       if (!(*(cpu_bitmap + (cpu >> 3)) & (1 << (cpu & 0x07))))
+                               continue;
+                       
+                       printf("%-11s %4d", curr_string, cpu - 1);
+
+                       /*
+                        * If the CPU is offline then it is omited from /proc/stat
+                        * and the sum of all values is zero.
+                        * (Remember that guest time is already included in user mode.)
+                        */
+                       if ((scc->cpu_user    + scc->cpu_nice + scc->cpu_sys   +
+                            scc->cpu_iowait  + scc->cpu_idle + scc->cpu_steal +
+                            scc->cpu_hardirq + scc->cpu_softirq) == 0) {
+                               /*
+                                * Set current struct fields (which have been set to zero)
+                                * to values from previous iteration. Hence their values won't
+                                * jump from zero when the CPU comes back online.
+                                */
+                               *scc = *scp;
+
+                               printf("  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f"
+                                      "  %6.2f  %6.2f  %6.2f\n",
+                                      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+                               continue;
+                       }
+
+                       /* Recalculate itv for current proc */
+                       pc_itv = get_per_cpu_interval(scc, scp);
+                       
+                       if (!pc_itv) {
+                               /*
+                                * If the CPU is tickless then there is no change in CPU values
+                                * but the sum of values is not zero.
+                                */
+                               printf("  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f"
+                                      "  %6.2f  %6.2f  %6.2f\n",
+                                      0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0);
+                       }
+
+                       else {
+                               printf("  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f  %6.2f"
+                                      "  %6.2f  %6.2f  %6.2f\n",
+                                      ll_sp_value(scp->cpu_user - scp->cpu_guest,
+                                                  scc->cpu_user - scc->cpu_guest,
+                                                  pc_itv),
+                                      ll_sp_value(scp->cpu_nice,
+                                                  scc->cpu_nice,
+                                                  pc_itv),
+                                      ll_sp_value(scp->cpu_sys,
+                                                  scc->cpu_sys,
+                                                  pc_itv),
+                                      ll_sp_value(scp->cpu_iowait,
+                                                  scc->cpu_iowait,
+                                                  pc_itv),
+                                      ll_sp_value(scp->cpu_hardirq,
+                                                  scc->cpu_hardirq,
+                                                  pc_itv),
+                                      ll_sp_value(scp->cpu_softirq,
+                                                  scc->cpu_softirq,
+                                                  pc_itv),
+                                      ll_sp_value(scp->cpu_steal,
+                                                  scc->cpu_steal,
+                                                  pc_itv),
+                                      ll_sp_value(scp->cpu_guest,
+                                                  scc->cpu_guest,
+                                                  pc_itv),
+                                      (scc->cpu_idle < scp->cpu_idle) ?
+                                      0.0 :
+                                      ll_sp_value(scp->cpu_idle,
+                                                  scc->cpu_idle,
+                                                  pc_itv));
+                       }
+               }
+       }
+
+       /* Print total number of interrupts per processor */
+       if (DISPLAY_IRQ_SUM(actflags)) {
+               struct stats_irq *sic, *sip;
+
+               if (dis) {
+                       printf("\n%-11s  CPU    intr/s\n", prev_string);
+               }
+
+               if (*cpu_bitmap & 1) {
+                       printf("%-11s  all %9.2f\n", curr_string,
+                              ll_s_value(st_irq[prev]->irq_nr, st_irq[curr]->irq_nr, itv));
+               }
+
+               for (cpu = 1; cpu <= cpu_nr; cpu++) {
+
+                       sic = st_irq[curr] + cpu;
+                       sip = st_irq[prev] + cpu;
+
+                       scc = st_cpu[curr] + cpu;
+                       scp = st_cpu[prev] + cpu;
+
+                       /* Check if we want stats about this proc */
+                       if (!(*(cpu_bitmap + (cpu >> 3)) & (1 << (cpu & 0x07))))
+                               continue;
+
+                       printf("%-11s %4d", curr_string, cpu - 1);
+
+                       /* Recalculate itv for current proc */
+                       pc_itv = get_per_cpu_interval(scc, scp);
+
+                       if (!pc_itv) {
+                               /* Current CPU is offline */
+                               printf(" %9.2f\n", 0.0);
+                       }
+                       else {
+                               printf(" %9.2f\n",
+                                      ll_s_value(sip->irq_nr, sic->irq_nr, itv));
+                       }
+               }
+       }
+
+       if (DISPLAY_IRQ_CPU(actflags)) {
+               write_irqcpu_stats(st_irqcpu, irqcpu_nr, dis, itv, prev, curr,
+                                  prev_string, curr_string);
+       }
+
+       if (DISPLAY_SOFTIRQS(actflags)) {
+               write_irqcpu_stats(st_softirqcpu, softirqcpu_nr, dis, itv, prev, curr,
+                                  prev_string, curr_string);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Print statistics average
+ *
+ * IN:
+ * @curr       Position in array where statistics for current sample are.
+ * @dis                TRUE if a header line must be printed.
+ ***************************************************************************
+ */
+void write_stats_avg(int curr, int dis)
+{
+       char string[16];
+
+       strncpy(string, _("Average:"), 16);
+       string[15] = '\0';
+       write_stats_core(2, curr, dis, string, string);
+}
+
+/*
+ ***************************************************************************
+ * Print statistics
+ *
+ * IN:
+ * @curr       Position in array where statistics for current sample are.
+ * @dis                TRUE if a header line must be printed.
+ ***************************************************************************
+ */
+void write_stats(int curr, int dis)
+{
+       char cur_time[2][16];
+
+       /* Get previous timestamp */
+       strftime(cur_time[!curr], 16, "%X", &(mp_tstamp[!curr]));
+
+       /* Get current timestamp */
+       strftime(cur_time[curr], 16, "%X", &(mp_tstamp[curr]));
+
+       write_stats_core(!curr, curr, dis, cur_time[!curr], cur_time[curr]);
+}
+
+/*
+ ***************************************************************************
+ * Read stats from /proc/interrupts or /proc/softirqs.
+ *
+ * IN:
+ * @file       /proc file to read (interrupts or softirqs).
+ * @ic_nr      Number of interrupts (hard or soft) per CPU.
+ * @curr       Position in array where current statistics will be saved.
+ *
+ * OUT:
+ * @st_ic      Array for per-CPU statistics.
+ ***************************************************************************
+ */
+void read_interrupts_stat(char *file, struct stats_irqcpu *st_ic[], int ic_nr, int curr)
+{
+       FILE *fp;
+       struct stats_irq *st_irq_i;
+       struct stats_irqcpu *p;
+       char *line = NULL;
+       unsigned long irq = 0;
+       unsigned int cpu;
+       int cpu_index[cpu_nr], index = 0, dgt, len;
+       char *cp, *next;
+
+       for (cpu = 0; cpu < cpu_nr; cpu++) {
+               st_irq_i = st_irq[curr] + cpu + 1;
+               st_irq_i->irq_nr = 0;
+       }
+
+       if ((fp = fopen(file, "r")) != NULL) {
+
+               SREALLOC(line, char, INTERRUPTS_LINE + 11 * cpu_nr);
+
+               /*
+                * Parse header line to see which CPUs are online
+                */
+               while (fgets(line, INTERRUPTS_LINE + 11 * cpu_nr, fp) != NULL) {
+                       next = line;
+                       while (((cp = strstr(next, "CPU")) != NULL) && (index < cpu_nr)) {
+                               cpu = strtol(cp + 3, &next, 10);
+                               cpu_index[index++] = cpu;
+                       }
+                       if (index)
+                               /* Header line found */
+                               break;
+               }
+
+               while ((fgets(line, INTERRUPTS_LINE + 11 * cpu_nr, fp) != NULL) &&
+                      (irq < ic_nr)) {
+
+                       /* Skip over "<irq>:" */
+                       if ((cp = strchr(line, ':')) == NULL)
+                               continue;
+                       cp++;
+
+                       p = st_ic[curr] + irq;
+                       len = strcspn(line, ":");
+                       if (len >= MAX_IRQ_LEN) {
+                               len = MAX_IRQ_LEN - 1;
+                       }
+                       strncpy(p->irq_name, line, len);
+                       p->irq_name[len] = '\0';
+                       dgt = isdigit(line[len - 1]);
+
+                       for (cpu = 0; cpu < index; cpu++) {
+                               p = st_ic[curr] + cpu_index[cpu] * ic_nr + irq;
+                               st_irq_i = st_irq[curr] + cpu_index[cpu] + 1;
+                               /*
+                                * No need to set (st_irqcpu + cpu * irqcpu_nr)->irq:
+                                * This is the same as st_irqcpu->irq.
+                                */
+                               p->interrupt = strtoul(cp, &next, 10);
+                               if (dgt) {
+                                       /* Sum only numerical irq (and not NMI, LOC, etc.) */
+                                       st_irq_i->irq_nr += p->interrupt;
+                               }
+                               cp = next;
+                       }
+                       irq++;
+               }
+
+               fclose(fp);
+               
+               if (line) {
+                       free(line);
+               }
+       }
+
+       while (irq < ic_nr) {
+               /* Nb of interrupts per processor has changed */
+               p = st_ic[curr] + irq;
+               p->irq_name[0] = '\0';  /* This value means this is a dummy interrupt */
+               irq++;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Main loop: Read stats from the relevant sources, and display them.
+ *
+ * IN:
+ * @dis_hdr    Set to TRUE if the header line must always be printed.
+ * @rows       Number of rows of screen.
+ ***************************************************************************
+ */
+void rw_mpstat_loop(int dis_hdr, int rows)
+{
+       struct stats_cpu *scc;
+       int cpu;
+       int curr = 1, dis = 1;
+       unsigned long lines = rows;
+
+       /* Dont buffer data if redirected to a pipe */
+       setbuf(stdout, NULL);
+
+       /* Read stats */
+       if (cpu_nr > 1) {
+               /*
+                * Init uptime0. So if /proc/uptime cannot fill it,
+                * this will be done by /proc/stat.
+                */
+               uptime0[0] = 0;
+               read_uptime(&(uptime0[0]));
+       }
+       read_stat_cpu(st_cpu[0], cpu_nr + 1, &(uptime[0]), &(uptime0[0]));
+
+       if (DISPLAY_IRQ_SUM(actflags)) {
+               read_stat_irq(st_irq[0], 1);
+       }
+
+       if (DISPLAY_IRQ_SUM(actflags) || DISPLAY_IRQ_CPU(actflags)) {
+               /* Read this file to display int per CPU or total nr of int per CPU */
+               read_interrupts_stat(INTERRUPTS, st_irqcpu, irqcpu_nr, 0);
+       }
+       
+       if (DISPLAY_SOFTIRQS(actflags)) {
+               read_interrupts_stat(SOFTIRQS, st_softirqcpu, softirqcpu_nr, 0);
+       }
+
+       if (!interval) {
+               /* Display since boot time */
+               mp_tstamp[1] = mp_tstamp[0];
+               memset(st_cpu[1], 0, STATS_CPU_SIZE * (cpu_nr + 1));
+               memset(st_irq[1], 0, STATS_IRQ_SIZE * (cpu_nr + 1));
+               memset(st_irqcpu[1], 0, STATS_IRQCPU_SIZE * (cpu_nr + 1) * irqcpu_nr);
+               if (DISPLAY_SOFTIRQS(actflags)) {
+                       memset(st_softirqcpu[1], 0, STATS_IRQCPU_SIZE * (cpu_nr + 1) * softirqcpu_nr);
+               }
+               write_stats(0, DISP_HDR);
+               exit(0);
+       }
+
+       /* Set a handler for SIGALRM */
+       alarm_handler(0);
+
+       /* Save the first stats collected. Will be used to compute the average */
+       mp_tstamp[2] = mp_tstamp[0];
+       uptime[2] = uptime[0];
+       uptime0[2] = uptime0[0];
+       memcpy(st_cpu[2], st_cpu[0], STATS_CPU_SIZE * (cpu_nr + 1));
+       memcpy(st_irq[2], st_irq[0], STATS_IRQ_SIZE * (cpu_nr + 1));
+       memcpy(st_irqcpu[2], st_irqcpu[0], STATS_IRQCPU_SIZE * (cpu_nr + 1) * irqcpu_nr);
+       if (DISPLAY_SOFTIRQS(actflags)) {
+               memcpy(st_softirqcpu[2], st_softirqcpu[0],
+                      STATS_IRQCPU_SIZE * (cpu_nr + 1) * softirqcpu_nr);
+       }
+
+       pause();
+
+       do {
+               /*
+                * Resetting the structure not needed since every fields will be set.
+                * Exceptions are per-CPU structures: Some of them may not be filled
+                * if corresponding processor is disabled (offline). We set them to zero
+                * to be able to distinguish between offline and tickless CPUs.
+                */
+               for (cpu = 1; cpu <= cpu_nr; cpu++) {
+                       scc = st_cpu[curr] + cpu;
+                       memset(scc, 0, STATS_CPU_SIZE);
+               }
+
+               /* Get time */
+               get_localtime(&(mp_tstamp[curr]));
+
+               /* Read stats */
+               if (cpu_nr > 1) {
+                       uptime0[curr] = 0;
+                       read_uptime(&(uptime0[curr]));
+               }
+               read_stat_cpu(st_cpu[curr], cpu_nr + 1, &(uptime[curr]), &(uptime0[curr]));
+
+               if (DISPLAY_IRQ_SUM(actflags)) {
+                       read_stat_irq(st_irq[curr], 1);
+               }
+
+               if (DISPLAY_IRQ_SUM(actflags) || DISPLAY_IRQ_CPU(actflags)) {
+                       read_interrupts_stat(INTERRUPTS, st_irqcpu, irqcpu_nr, curr);
+               }
+
+               if (DISPLAY_SOFTIRQS(actflags)) {
+                       read_interrupts_stat(SOFTIRQS, st_softirqcpu, softirqcpu_nr, curr);
+               }
+
+               /* Write stats */
+               if (!dis_hdr) {
+                       dis = lines / rows;
+                       if (dis) {
+                               lines %= rows;
+                       }
+                       lines++;
+               }
+               write_stats(curr, dis);
+
+               if (count > 0) {
+                       count--;
+               }
+               if (count) {
+                       curr ^= 1;
+                       pause();
+               }
+       }
+       while (count);
+
+       /* Write stats average */
+       write_stats_avg(curr, dis_hdr);
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the program
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int opt = 0, i, actset = FALSE;
+       struct utsname header;
+       int dis_hdr = -1;
+       int rows = 23;
+       char *t;
+
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       /* Get HZ */
+       get_HZ();
+
+       /* How many processors on this machine ? */
+       cpu_nr = get_cpu_nr(~0);
+       
+       /* Calculate number of interrupts per processor */
+       irqcpu_nr = get_irqcpu_nr(INTERRUPTS, NR_IRQS, cpu_nr) +
+                   NR_IRQCPU_PREALLOC;
+       /* Calculate number of soft interrupts per processor */
+       softirqcpu_nr = get_irqcpu_nr(SOFTIRQS, NR_IRQS, cpu_nr) +
+                       NR_IRQCPU_PREALLOC;
+
+       /*
+        * cpu_nr: a value of 2 means there are 2 processors (0 and 1).
+        * In this case, we have to allocate 3 structures: global, proc0 and proc1.
+        */
+       salloc_mp_struct(cpu_nr + 1);
+
+       while (++opt < argc) {
+
+               if (!strcmp(argv[opt], "-I")) {
+                       if (argv[++opt]) {
+                               actset = TRUE;
+                               if (!strcmp(argv[opt], K_SUM)) {
+                                       /* Display total number of interrupts per CPU */
+                                       actflags |= M_D_IRQ_SUM;
+                               }
+                               else if (!strcmp(argv[opt], K_CPU)) {
+                                       /* Display interrupts per CPU */
+                                       actflags |= M_D_IRQ_CPU;
+                               }
+                               else if (!strcmp(argv[opt], K_SCPU)) {
+                                       /* Display soft interrupts per CPU */
+                                       actflags |= M_D_SOFTIRQS;
+                               }
+                               else if (!strcmp(argv[opt], K_ALL)) {
+                                       actflags |= M_D_IRQ_SUM + M_D_IRQ_CPU + M_D_SOFTIRQS;
+                               }
+                               else {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-P")) {
+                       /* '-P ALL' can be used on UP machines */
+                       if (argv[++opt]) {
+                               flags |= F_P_OPTION;
+                               dis_hdr++;
+                               
+                               for (t = strtok(argv[opt], ","); t; t = strtok(NULL, ",")) {
+                                       if (!strcmp(t, K_ALL)) {
+                                               if (cpu_nr) {
+                                                       dis_hdr = 9;
+                                               }
+                                               /*
+                                                * Set bit for every processor.
+                                                * Also indicate to display stats for CPU 'all'.
+                                                */
+                                               memset(cpu_bitmap, 0xff, ((cpu_nr + 1) >> 3) + 1);
+                                       }
+                                       else {
+                                               if (strspn(t, DIGITS) != strlen(t)) {
+                                                       usage(argv[0]);
+                                               }
+                                               i = atoi(t);    /* Get cpu number */
+                                               if (i >= cpu_nr) {
+                                                       fprintf(stderr, _("Not that many processors!\n"));
+                                                       exit(1);
+                                               }
+                                               i++;
+                                               *(cpu_bitmap + (i >> 3)) |= 1 << (i & 0x07);
+                                       }
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strncmp(argv[opt], "-", 1)) {
+                       for (i = 1; *(argv[opt] + i); i++) {
+
+                               switch (*(argv[opt] + i)) {
+
+                               case 'A':
+                                       actflags |= M_D_CPU + M_D_IRQ_SUM + M_D_IRQ_CPU + M_D_SOFTIRQS;
+                                       actset = TRUE;
+                                       /* Select all processors */
+                                       flags |= F_P_OPTION;
+                                       memset(cpu_bitmap, 0xff, ((cpu_nr + 1) >> 3) + 1);
+                                       break;
+                                       
+                               case 'u':
+                                       /* Display CPU */
+                                       actflags |= M_D_CPU;
+                                       break;
+
+                               case 'V':
+                                       /* Print version number */
+                                       print_version();
+                                       break;
+
+                               default:
+                                       usage(argv[0]);
+                               }
+                       }
+               }
+
+               else if (interval < 0) {
+                       /* Get interval */
+                       if (strspn(argv[opt], DIGITS) != strlen(argv[opt])) {
+                               usage(argv[0]);
+                       }
+                       interval = atol(argv[opt]);
+                       if (interval < 0) {
+                               usage(argv[0]);
+                       }
+                       count = -1;
+               }
+
+               else if (count <= 0) {
+                       /* Get count value */
+                       if ((strspn(argv[opt], DIGITS) != strlen(argv[opt])) ||
+                           !interval) {
+                               usage(argv[0]);
+                       }
+                       count = atol(argv[opt]);
+                       if (count < 1) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else {
+                       usage(argv[0]);
+               }
+       }
+
+       /* Default: Display CPU */
+       if (!actset) {
+               actflags |= M_D_CPU;
+       }
+
+       if (count_bits(&actflags, sizeof(unsigned int)) > 1) {
+               dis_hdr = 9;
+       }
+       
+       if (!USE_P_OPTION(flags)) {
+               /* Option -P not used: Set bit 0 (global stats among all proc) */
+               *cpu_bitmap = 1;
+       }
+       if (dis_hdr < 0) {
+               dis_hdr = 0;
+       }
+       if (!dis_hdr) {
+               /* Get window size */
+               rows = get_win_height();
+       }
+       if (interval < 0) {
+               /* Interval not set => display stats since boot time */
+               interval = 0;
+       }
+
+       /* Get time */
+       get_localtime(&(mp_tstamp[0]));
+
+       /* Get system name, release number and hostname */
+       uname(&header);
+       print_gal_header(&(mp_tstamp[0]), header.sysname, header.release,
+                        header.nodename, header.machine, cpu_nr);
+
+       /* Main loop */
+       rw_mpstat_loop(dis_hdr, rows);
+
+       /* Free structures */
+       sfree_mp_struct();
+
+       return 0;
+}
diff --git a/mpstat.h b/mpstat.h
new file mode 100644 (file)
index 0000000..99d86ce
--- /dev/null
+++ b/mpstat.h
@@ -0,0 +1,77 @@
+/*
+ * mpstat: per-processor statistics
+ * (C) 2000-2009 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _MPSTAT_H
+#define _MPSTAT_H
+
+/*
+ ***************************************************************************
+ * mpstat's specific system files.
+ ***************************************************************************
+ */
+
+#define SOFTIRQS       "/proc/softirqs"
+
+/*
+ ***************************************************************************
+ * Activities definitions.
+ ***************************************************************************
+ */
+
+#define M_D_CPU                0x0001
+#define M_D_IRQ_SUM    0x0002
+#define M_D_IRQ_CPU    0x0004
+#define M_D_SOFTIRQS   0x0008
+
+#define DISPLAY_CPU(m)         (((m) & M_D_CPU) == M_D_CPU)
+#define DISPLAY_IRQ_SUM(m)     (((m) & M_D_IRQ_SUM) == M_D_IRQ_SUM)
+#define DISPLAY_IRQ_CPU(m)     (((m) & M_D_IRQ_CPU) == M_D_IRQ_CPU)
+#define DISPLAY_SOFTIRQS(m)    (((m) & M_D_SOFTIRQS) == M_D_SOFTIRQS)
+
+/*
+ ***************************************************************************
+ * Keywords and constants.
+ ***************************************************************************
+ */
+
+/* Indicate that option -P has been used */
+#define F_P_OPTION     0x01
+
+#define USE_P_OPTION(m)        (((m) & F_P_OPTION) == F_P_OPTION)
+
+#define K_SUM  "SUM"
+#define K_CPU  "CPU"
+#define K_SCPU "SCPU"
+
+#define NR_IRQCPU_PREALLOC     3
+
+#define MAX_IRQ_LEN            16
+
+/*
+ ***************************************************************************
+ * Structures used to store statistics.
+ ***************************************************************************
+ */
+
+/*
+ * stats_irqcpu->irq:       IRQ#-A
+ * stats_irqcpu->interrupt: number of IRQ#-A for proc 0
+ * stats_irqcpu->irq:       IRQ#-B
+ * stats_irqcpu->interrupt: number of IRQ#-B for proc 0
+ * ...
+ * stats_irqcpu->irq:       (undef'd)
+ * stats_irqcpu->interrupt: number of IRQ#-A for proc 1
+ * stats_irqcpu->irq:       (undef'd)
+ * stats_irqcpu->interrupt: number of IRQ#-B for proc 1
+ * ...
+ */
+struct stats_irqcpu {
+       unsigned int interrupt        __attribute__ ((aligned (4)));
+       char         irq_name[MAX_IRQ_LEN];
+};
+
+#define STATS_IRQCPU_SIZE      (sizeof(struct stats_irqcpu))
+
+#endif
diff --git a/nfsiostat.c b/nfsiostat.c
new file mode 100644 (file)
index 0000000..05a7dfa
--- /dev/null
@@ -0,0 +1,653 @@
+/*
+ * nfsiostat: report NFS I/O statistics
+ * Copyright (C) 2010 Red Hat, Inc. All Rights Reserved
+ * Written by Ivana Varekova <varekova@redhat.com>
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/utsname.h>
+
+#include "version.h"
+#include "nfsiostat.h"
+#include "common.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": " __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+unsigned long long uptime[2]  = {0, 0};
+unsigned long long uptime0[2] = {0, 0};
+struct io_nfs_stats *st_ionfs[2];
+struct io_hdr_stats *st_hdr_ionfs;
+
+int ionfs_nr = 0;      /* Nb of NFS mounted directories found */
+int cpu_nr = 0;                /* Nb of processors on the machine */
+int flags = 0;         /* Flag for common options and system state */
+
+long interval = 0;
+char timestamp[64];
+
+
+/*
+ ***************************************************************************
+ * Print usage and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command.
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+       fprintf(stderr, _("Usage: %s [ options ] [ <interval> [ <count> ] ]\n"),
+               progname);
+
+       fprintf(stderr, _("Options are:\n"
+                         "[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * SIGALRM signal handler.
+ *
+ * IN:
+ * @sig        Signal number. Set to 0 for the first time, then to SIGALRM.
+ ***************************************************************************
+ */
+void alarm_handler(int sig)
+{
+       signal(SIGALRM, alarm_handler);
+       alarm(interval);
+}
+
+/*
+ ***************************************************************************
+ * Find number of NFS-mounted points that are registered in
+ * /proc/self/mountstats.
+ *
+ * RETURNS:
+ * Number of NFS-mounted points.
+ ***************************************************************************
+ */
+int get_nfs_mount_nr(void)
+{
+       FILE *fp;
+       char line[8192];
+       char type_name[10];
+       unsigned int nfs = 0;
+
+       if ((fp = fopen(NFSMOUNTSTATS, "r")) == NULL)
+               /* File non-existent */
+               return 0;
+
+       while (fgets(line, 8192, fp) != NULL) {
+
+               if ((strstr(line, "mounted")) && (strstr(line, "on")) &&
+                   (strstr(line, "with")) && (strstr(line, "fstype"))) {
+
+                       sscanf(strstr(line, "fstype") + 6, "%10s", type_name);
+                       if ((!strncmp(type_name, "nfs", 3)) && (strncmp(type_name, "nfsd", 4))) {
+                               nfs ++;
+                       }
+               }
+       }
+
+       fclose(fp);
+
+       return nfs;
+}
+
+/*
+ ***************************************************************************
+ * Set every nfs_io entry to inactive state (unregistered).
+ ***************************************************************************
+ */
+void set_entries_inactive(void)
+{
+       int i;
+       struct io_hdr_stats *shi = st_hdr_ionfs;
+
+       for (i = 0; i < ionfs_nr; i++, shi++) {
+               shi->active = FALSE;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free inactive entries (mark them as unused).
+ ***************************************************************************
+ */
+void free_inactive_entries(void)
+{
+       int i;
+       struct io_hdr_stats *shi = st_hdr_ionfs;
+
+       for (i = 0; i < ionfs_nr; i++, shi++) {
+               if (!shi->active) {
+                       shi->used = FALSE;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Allocate and init structures, according to system state.
+ ***************************************************************************
+ */
+void io_sys_init(void)
+{
+       int i;
+       
+       /* How many processors on this machine? */
+       cpu_nr = get_cpu_nr(~0);
+
+       /* Get number of NFS directories in /proc/self/mountstats */
+       if ((ionfs_nr = get_nfs_mount_nr()) > 0) {
+               ionfs_nr += NR_NFS_PREALLOC;
+       }
+       st_hdr_ionfs = (struct io_hdr_stats *) calloc(ionfs_nr, IO_HDR_STATS_SIZE);
+       
+       /* Allocate structures for number of NFS directories found */
+       for (i = 0; i < 2; i++) {
+               if ((st_ionfs[i] =
+                   (struct io_nfs_stats *) calloc(ionfs_nr, IO_NFS_STATS_SIZE)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free various structures.
+ ***************************************************************************
+*/
+void io_sys_free(void)
+{
+       int i;
+
+       /* Free I/O NFS directories structures */
+       for (i = 0; i < 2; i++) {
+
+               if (st_ionfs[i]) {
+                       free(st_ionfs[i]);
+               }
+       }
+       
+       if (st_hdr_ionfs) {
+               free(st_hdr_ionfs);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Save stats for current NFS filesystem.
+ *
+ * IN:
+ * @name               Name of NFS filesystem.
+ * @curr               Index in array for current sample statistics.
+ * @st_io              Structure with NFS statistics to save.
+ * @ionfs_nr           Number of NFS filesystems.
+ * @st_hdr_ionfs       Pointer on structures describing an NFS filesystem.
+ *
+ * OUT:
+ * @st_hdr_ionfs       Pointer on structures describing an NFS filesystem.
+ ***************************************************************************
+ */
+void save_stats(char *name, int curr, void *st_io, int ionfs_nr,
+               struct io_hdr_stats *st_hdr_ionfs)
+{
+       int i;
+       struct io_hdr_stats *st_hdr_ionfs_i;
+       struct io_nfs_stats *st_ionfs_i;
+
+       /* Look for NFS directory in data table */
+       for (i = 0; i < ionfs_nr; i++) {
+               st_hdr_ionfs_i = st_hdr_ionfs + i;
+               if (!strcmp(st_hdr_ionfs_i->name, name)) {
+                       break;
+               }
+       }
+       
+       if (i == ionfs_nr) {
+               /*
+                * This is a new filesystem: Look for an unused entry to store it.
+                */
+               for (i = 0; i < ionfs_nr; i++) {
+                       st_hdr_ionfs_i = st_hdr_ionfs + i;
+                       if (!st_hdr_ionfs_i->used) {
+                               /* Unused entry found... */
+                               st_hdr_ionfs_i->used = TRUE; /* Indicate it is now used */
+                               strcpy(st_hdr_ionfs_i->name, name);
+                               st_ionfs_i = st_ionfs[!curr] + i;
+                               memset(st_ionfs_i, 0, IO_NFS_STATS_SIZE);
+                               break;
+                       }
+               }
+       }
+       if (i < ionfs_nr) {
+               st_hdr_ionfs_i = st_hdr_ionfs + i;
+               st_hdr_ionfs_i->active = TRUE;
+               st_ionfs_i = st_ionfs[curr] + i;
+               *st_ionfs_i = *((struct io_nfs_stats *) st_io);
+       }
+       /*
+        * else it was a new NFS directory
+        * but there was no free structure to store it.
+        */
+}
+
+/*
+ ***************************************************************************
+ * Read NFS-mount directories stats from /proc/self/mountstats.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void read_nfs_stat(int curr)
+{
+       FILE *fp;
+       int sw = 0;
+       char line[256];
+       char *xprt_line;
+       char nfs_name[MAX_NAME_LEN];
+       char mount[10], on[10], prefix[10], aux[32];
+       char operation[16];
+       struct io_nfs_stats snfs;
+       long int v1;
+
+       /* Every I/O NFS entry is potentially unregistered */
+       set_entries_inactive();
+
+       if ((fp = fopen(NFSMOUNTSTATS, "r")) == NULL)
+               return;
+
+       sprintf(aux, "%%%ds %%10s %%10s",
+               MAX_NAME_LEN < 200 ? MAX_NAME_LEN : 200);
+
+       while (fgets(line, 256, fp) != NULL) {
+
+               /* Read NFS directory name */
+               if (!strncmp(line, "device", 6)) {
+                       sw = 0;
+                       sscanf(line + 6, aux, nfs_name, mount, on);
+                       if ((!strncmp(mount, "mounted", 7)) && (!strncmp(on, "on", 2))) {
+                               sw = 1;
+                       }
+               }
+
+               sscanf(line, "%10s", prefix);
+               if (sw && (!strncmp(prefix, "bytes:", 6))) {
+                       /* Read the stats for the last NFS-mounted directory */
+                       sscanf(strstr(line, "bytes:") + 6, "%llu %llu %llu %llu %llu %llu",
+                              &snfs.rd_normal_bytes, &snfs.wr_normal_bytes,
+                              &snfs.rd_direct_bytes, &snfs.wr_direct_bytes,
+                              &snfs.rd_server_bytes, &snfs.wr_server_bytes);
+                       sw = 2;
+               }
+
+               if ((sw == 2) && (!strncmp(prefix, "xprt:", 5))) {
+                       /*
+                        * Read extended statistic for the last NFS-mounted directory
+                        * - number of sent rpc requests.
+                        */
+                       xprt_line = (strstr(line, "xprt:") + 6);
+                       /* udp, tcp or rdma data */
+                       if (!strncmp(xprt_line, "udp", 3)) {
+                               /* port bind_count sends recvs (bad_xids req_u bklog_u) */
+                               sscanf(strstr(xprt_line, "udp") + 4, "%*u %*u %lu",
+                                      &snfs.rpc_sends);
+                       }
+                       if (!strncmp(xprt_line, "tcp", 3)) {
+                               /*
+                                * port bind_counter connect_count connect_time idle_time
+                                * sends recvs (bad_xids req_u bklog_u)
+                                */
+                               sscanf(strstr(xprt_line, "tcp") + 4,
+                                      "%*u %*u %*u %*u %*d %lu",
+                                      &snfs.rpc_sends);
+                       }
+                       if (!strncmp(xprt_line,"rdma", 4)) {
+                               /*
+                                * 0(port) bind_count connect_count connect_time idle_time
+                                * sends recvs (bad_xids req_u bklog_u...)
+                                */
+                               sscanf(strstr(xprt_line, "rdma") + 5,
+                                      "%*u %*u %*u %*u %*d %lu",
+                                      &snfs.rpc_sends);
+                       }
+                       sw = 3;
+               }
+
+               if ((sw == 3) && (!strncmp(prefix, "per-op", 6))) {
+                       sw = 4;
+                       while (sw == 4) {
+                               fgets(line, 256, fp);
+                               sscanf(line, "%15s %lu", operation, &v1);
+                               if (!strncmp(operation, "READ:", 5)) {
+                                       snfs.nfs_rops = v1;
+                               }
+                               else if (!strncmp(operation, "WRITE:", 6)) {
+                                       snfs.nfs_wops = v1;
+                                       save_stats(nfs_name, curr, &snfs, ionfs_nr, st_hdr_ionfs);
+                                       sw = 0;
+                               }
+                       }
+               }
+       }
+
+       fclose(fp);
+
+       /* Free structures corresponding to unregistered filesystems */
+       free_inactive_entries();
+}
+
+/*
+ ***************************************************************************
+ * Display NFS stats header.
+ *
+ * OUT:
+ * @fctr       Conversion factor.
+ ***************************************************************************
+ */
+void write_nfs_stat_header(int *fctr)
+{
+       printf("Filesystem:           ");
+       if (DISPLAY_KILOBYTES(flags)) {
+               printf("    rkB_nor/s    wkB_nor/s    rkB_dir/s    wkB_dir/s"
+                      "    rkB_svr/s    wkB_svr/s");
+               *fctr = 1024;
+       }
+       else if (DISPLAY_MEGABYTES(flags)) {
+               printf("    rMB_nor/s    wMB_nor/s    rMB_dir/s    wMB_dir/s"
+                      "    rMB_svr/s    wMB_svr/s");
+               *fctr = 1024 * 1024;
+       }
+       else {
+               printf("   rBlk_nor/s   wBlk_nor/s   rBlk_dir/s   wBlk_dir/s"
+                      "   rBlk_svr/s   wBlk_svr/s");
+               *fctr = 512;
+       }
+       printf("     ops/s    rops/s    wops/s\n");
+}
+
+/*
+ ***************************************************************************
+ * Write NFS stats read from /proc/self/mountstats.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time.
+ * @fctr       Conversion factor.
+ * @shi                Structures describing the NFS filesystems.
+ * @ioi                Current sample statistics.
+ * @ioj                Previous sample statistics.
+ ***************************************************************************
+ */
+void write_nfs_stat(int curr, unsigned long long itv, int fctr,
+                   struct io_hdr_stats *shi, struct io_nfs_stats *ioni,
+                   struct io_nfs_stats *ionj)
+{
+       if (DISPLAY_HUMAN_READ(flags)) {
+               printf("%-22s\n%23s", shi->name, "");
+       }
+       else {
+               printf("%-22s ", shi->name);
+       }
+       printf("%12.2f %12.2f %12.2f %12.2f %12.2f %12.2f %9.2f %9.2f %9.2f\n",
+              S_VALUE(ionj->rd_normal_bytes, ioni->rd_normal_bytes, itv) / fctr,
+              S_VALUE(ionj->wr_normal_bytes, ioni->wr_normal_bytes, itv) / fctr,
+              S_VALUE(ionj->rd_direct_bytes, ioni->rd_direct_bytes, itv) / fctr,
+              S_VALUE(ionj->wr_direct_bytes, ioni->wr_direct_bytes, itv) / fctr,
+              S_VALUE(ionj->rd_server_bytes, ioni->rd_server_bytes, itv) / fctr,
+              S_VALUE(ionj->wr_server_bytes, ioni->wr_server_bytes, itv) / fctr,
+              S_VALUE(ionj->rpc_sends, ioni->rpc_sends, itv),
+              S_VALUE(ionj->nfs_rops,  ioni->nfs_rops,  itv),
+              S_VALUE(ionj->nfs_wops,  ioni->nfs_wops,  itv));
+}
+
+/*
+ ***************************************************************************
+ * Print everything now (stats and uptime).
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @rectime    Current date and time.
+ ***************************************************************************
+ */
+void write_stats(int curr, struct tm *rectime)
+{
+       int i, fctr = 1;
+       unsigned long long itv;
+       struct io_hdr_stats *shi;
+       struct io_nfs_stats *ioni, *ionj;
+
+       /* Test stdout */
+       TEST_STDOUT(STDOUT_FILENO);
+
+       /* Print time stamp */
+       if (DISPLAY_TIMESTAMP(flags)) {
+               if (DISPLAY_ISO(flags)) {
+                       strftime(timestamp, sizeof(timestamp), "%FT%T%z", rectime);
+               }
+               else {
+                       strftime(timestamp, sizeof(timestamp), "%x %X", rectime);
+               }
+               printf("%s\n", timestamp);
+       }
+
+       /* Interval is multiplied by the number of processors */
+       itv = get_interval(uptime[!curr], uptime[curr]);
+
+       if (cpu_nr > 1) {
+               /* On SMP machines, reduce itv to one processor (see note above) */
+               itv = get_interval(uptime0[!curr], uptime0[curr]);
+       }
+
+       shi = st_hdr_ionfs;
+
+       /* Display NFS stats header */
+       write_nfs_stat_header(&fctr);
+
+       for (i = 0; i < ionfs_nr; i++, shi++) {
+               if (shi->used) {
+                       ioni = st_ionfs[curr]  + i;
+                       ionj = st_ionfs[!curr] + i;
+                       write_nfs_stat(curr, itv, fctr, shi, ioni, ionj);
+               }
+       }
+       printf("\n");
+}
+
+/*
+ ***************************************************************************
+ * Main loop: Read stats from the relevant sources and display them.
+ *
+ * IN:
+ * @count      Number of lines of stats to print.
+ * @rectime    Current date and time.
+ ***************************************************************************
+ */
+void rw_io_stat_loop(long int count, struct tm *rectime)
+{
+       int curr = 1;
+
+       /* Don't buffer data if redirected to a pipe */
+       setbuf(stdout, NULL);
+       
+       do {
+               if (cpu_nr > 1) {
+                       /*
+                        * Read system uptime (only for SMP machines).
+                        * Init uptime0. So if /proc/uptime cannot fill it,
+                        * this will be done by /proc/stat.
+                        */
+                       uptime0[curr] = 0;
+                       read_uptime(&(uptime0[curr]));
+               }
+
+               /* Read NFS directories stats */
+               read_nfs_stat(curr);
+
+               /* Get time */
+               get_localtime(rectime);
+
+               /* Print results */
+               write_stats(curr, rectime);
+
+               if (count > 0) {
+                       count--;
+               }
+               if (count) {
+                       curr ^= 1;
+                       pause();
+               }
+       }
+       while (count);
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the nfsiostat program.
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int it = 0;
+       int opt = 1;
+       int i;
+       long count = 1;
+       struct utsname header;
+       struct tm rectime;
+
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       /* Get HZ */
+       get_HZ();
+
+       /* Process args... */
+       while (opt < argc) {
+
+               if (!strncmp(argv[opt], "-", 1)) {
+                       for (i = 1; *(argv[opt] + i); i++) {
+
+                               switch (*(argv[opt] + i)) {
+
+                               case 'h':
+                                       /* Display an easy-to-read NFS report */
+                                       flags |= I_D_HUMAN_READ;
+                                       break;
+       
+                               case 'k':
+                                       if (DISPLAY_MEGABYTES(flags)) {
+                                               usage(argv[0]);
+                                       }
+                                       /* Display stats in kB/s */
+                                       flags |= I_D_KILOBYTES;
+                                       break;
+
+                               case 'm':
+                                       if (DISPLAY_KILOBYTES(flags)) {
+                                               usage(argv[0]);
+                                       }
+                                       /* Display stats in MB/s */
+                                       flags |= I_D_MEGABYTES;
+                                       break;
+
+                               case 't':
+                                       /* Display timestamp */
+                                       flags |= I_D_TIMESTAMP;
+                                       break;
+
+                               case 'V':
+                                       /* Print version number and exit */
+                                       print_version();
+                                       break;
+       
+                               default:
+                                       usage(argv[0]);
+                               }
+                       }
+                       opt++;
+               }
+
+               else if (!it) {
+                       interval = atol(argv[opt++]);
+                       if (interval < 0) {
+                               usage(argv[0]);
+                       }
+                       count = -1;
+                       it = 1;
+               }
+
+               else if (it > 0) {
+                       count = atol(argv[opt++]);
+                       if ((count < 1) || !interval) {
+                               usage(argv[0]);
+                       }
+                       it = -1;
+               }
+               else {
+                       usage(argv[0]);
+               }
+       }
+
+       if (!interval) {
+               count = 1;
+       }
+
+       /* Init structures according to machine architecture */
+       io_sys_init();
+
+       get_localtime(&rectime);
+
+       /* Get system name, release number and hostname */
+       uname(&header);
+       if (print_gal_header(&rectime, header.sysname, header.release,
+                            header.nodename, header.machine, cpu_nr)) {
+               flags |= I_D_ISO;
+       }
+       printf("\n");
+
+       /* Set a handler for SIGALRM */
+       alarm_handler(0);
+
+       /* Main loop */
+       rw_io_stat_loop(count, &rectime);
+
+       /* Free structures */
+       io_sys_free();
+
+       return 0;
+}
diff --git a/nfsiostat.h b/nfsiostat.h
new file mode 100644 (file)
index 0000000..6315e89
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * nfsiostat: Report NFS I/O statistics
+ * Copyright (C) 2010 Red Hat, Inc. All Rights Reserved
+ * Written by Ivana Varekova <varekova@redhat.com>
+ */
+
+#ifndef _NFSIOSTAT_H
+#define _NFSIOSTAT_H
+
+#include "common.h"
+
+#define NFSMOUNTSTATS  "/proc/self/mountstats"
+
+/* I_: iostat - D_: Display - F_: Flag */
+#define I_D_TIMESTAMP          0x001
+#define I_D_KILOBYTES          0x002
+#define I_D_MEGABYTES          0x004
+#define I_D_ISO                        0x008
+#define I_D_HUMAN_READ         0x010
+
+#define DISPLAY_TIMESTAMP(m)   (((m) & I_D_TIMESTAMP)     == I_D_TIMESTAMP)
+#define DISPLAY_KILOBYTES(m)   (((m) & I_D_KILOBYTES)     == I_D_KILOBYTES)
+#define DISPLAY_MEGABYTES(m)   (((m) & I_D_MEGABYTES)     == I_D_MEGABYTES)
+#define DISPLAY_ISO(m)         (((m) & I_D_ISO)           == I_D_ISO)
+#define DISPLAY_HUMAN_READ(m)  (((m) & I_D_HUMAN_READ)    == I_D_HUMAN_READ)
+
+/* Preallocation constats */
+#define NR_NFS_PREALLOC        2
+
+struct io_nfs_stats {
+       unsigned long long rd_normal_bytes      __attribute__ ((aligned (8)));
+       unsigned long long wr_normal_bytes      __attribute__ ((packed));
+       unsigned long long rd_direct_bytes      __attribute__ ((packed));
+       unsigned long long wr_direct_bytes      __attribute__ ((packed));
+       unsigned long long rd_server_bytes      __attribute__ ((packed));
+       unsigned long long wr_server_bytes      __attribute__ ((packed));
+       unsigned long rpc_sends                 __attribute__ ((packed));
+       unsigned long nfs_rops                  __attribute__ ((packed));
+       unsigned long nfs_wops                  __attribute__ ((packed));
+};
+
+#define IO_NFS_STATS_SIZE      (sizeof(struct io_nfs_stats))
+
+struct io_hdr_stats {
+       unsigned int active             __attribute__ ((aligned (4)));
+       unsigned int used               __attribute__ ((packed));
+       char name[MAX_NAME_LEN];
+};
+
+#define IO_HDR_STATS_SIZE      (sizeof(struct io_hdr_stats))
+
+#endif  /* _NFSIOSTAT_H */
diff --git a/nls/README-nls b/nls/README-nls
new file mode 100644 (file)
index 0000000..cbfb242
--- /dev/null
@@ -0,0 +1,69 @@
+WHAT IS NLS?
+------------
+NLS stands for National Language Support. It encompasses the features that make
+a program able to support different languages and cultural habits.
+This touches the messages displayed on the screen, but also the format used to
+display the dates or the numbers for example.
+
+
+HOW I ENABLE NLS WITH SYSSTAT?
+------------------------------
+NLS is enabled by default when you configure sysstat (running "./configure").
+But you can disable it if you want: Use the option "--disable-nls" with
+./configure or answer 'y' (for 'yes') to the question:
+"Disable National Language Support (NLS)? (y/n) [--disable-nls]"
+if you use the interactive configuration script (iconfig).
+
+
+OK, BUT HOW DO I USE IT NOW?
+----------------------------
+To see sysstat's messages in your own language, you have to set your LANG
+environment variable to the proper value. For example, in France you may
+want to set it to "fr_FR", although other possibilities exist. If this does
+not work for your language, see below for how to add a new translation.
+
+If you use bash and you want to configure your system for a French environment,
+enter:
+
+$ export LANG=fr_FR
+
+('$' is the prompt).
+If you use the (Tab) C shell, you would have entered:
+
+% setenv LANG fr_FR
+
+('%' is the prompt).
+Here is a complete example with iostat:
+
+$ export LANG=en_US
+$ iostat -V 
+sysstat version 5.1.4
+(C) Sebastien Godard
+Usage: iostat [ options... ] [ <interval> [ <count> ] ]
+Options are:
+[ -c | -d ] [ -k ] [ -m ] [ -t ] [ -V ] [ -x ]
+[ { <device> [ ... ] | ALL } ] [ -p [ { <device> | ALL } ] ]
+
+$ export LANG=fr_FR
+$ iostat -V
+sysstat version 5.1.4
+(C) Sebastien Godard
+Utilisation: iostat [ options... ] [ <intervalle> [ <itérations> ] ]
+Options possibles:
+[ -c | -d ] [ -k ] [ -m ] [ -t ] [ -V ] [ -x ]
+[ { <device> [ ... ] | ALL } ] [ -p [ { <device> | ALL } ] ]
+
+
+HOW CAN I ADD OR UPDATE A TRANSLATION?
+--------------------------------------
+At the present time, sysstat is already translated into several languages.
+If, however, the translation to your language is incomplete or entirely
+missing, you can update it or add a new one by contacting the team for
+your language at the Translation Project -- http://translationproject.org/ .
+There you can get the latest sysstat PO file for your language, or the
+latest blank POT file. When you have made the translation complete, send it
+to your team leader or to the team's mailing list.
+
+--
+Sebastien Godard (sysstat <at> orange.fr)
+
diff --git a/nls/af.po b/nls/af.po
new file mode 100644 (file)
index 0000000..8bdbd4b
--- /dev/null
+++ b/nls/af.po
@@ -0,0 +1,195 @@
+# NLS support for the sysstat package.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 3.0\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 2000-01-12 20:17\n"
+"Last-Translator: Gert Brits <webmaster@linuxhelp.za.net>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat weergawe %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Probleem met oopmaak van %s: %s\n"
+
+#: common.c:199
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Kan nie soveel proseseerders hanteer nie !\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Gebruik: %s [ opsies... ] [ <interval> [ <nommer> ] ]\n"
+"Opsies moontlik:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Tyd:  %s\n"
+
+#: iostat.c:1435
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "Opsies -x en -p is beide uitgesluit\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Gebruik: %s [ opsies... ] [ <interval> [ <nommer> ] ]\n"
+"Opsies moontlik:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Gemideld:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Nie soveel proseseerders nie !\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Gebruik: %s [ opsies... ] [ <interval> [ <nommer> ] ]\n"
+"Opsies moontlik:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Aangevraagte aktiviteite nie beskikbaar nie\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Probleem gekry met die lees van die sisteem aktiviteit leer: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Einde van sisteem aktiviteit leer onbeplan geeindig\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Ongemagtige aktiviteit proses: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "Aangevraagte data is nie beskikbaar in leer nie\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Gebruik: %s [ opsies... ] [ <interval> [ <nommer> ] ] [ <uitleer> ]\n"
+"Opsies moontlik:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Probleem met skryf van sisteem aktiviteit leer: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Probleem met skryf van sisteem aktiviteit hoof: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "Kan nie data byskryf by die file nie\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Gebruik: %s [ opsies... ] [ <interval> [ <nommer> ] ] [ <leer> ]\n"
+"Opsies moontlik:\n"
+"[ -d [ -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_opsies...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Gebruik: %s [ opsies... ] [ <interval> [ <nommer> ] ]\n"
+"Opsies moontlik:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <leer> ] | -f [ <leer> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Nie 'n SMP rekenaar nie...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Verkeerde data formaat\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Opsies -f en -o is beide uitgesluit\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Kan nie van sisteem aktiviteit leer lees nie (gebruik opsie -f)\n"
diff --git a/nls/cs.po b/nls/cs.po
new file mode 100644 (file)
index 0000000..2fcfb49
--- /dev/null
+++ b/nls/cs.po
@@ -0,0 +1,408 @@
+# Czech translations for sysstat package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the sysstat package.
+#
+# Marek Černocký <marek@manet.cz>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-08-23 22:41+0200\n"
+"Last-Translator: Marek Černocký <marek@manet.cz>\n"
+"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Použití: %s [přepínače] [<interval> [<počet>]]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-h] [-k|-m] [-t] [-V]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat verze %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nelze otevřít %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-c] [-d] [-N] [-k|-m] [-t] [-V] [-x] [-z]\n"
+"[<zařízení> […]|ALL] [-p [<zařízení>[,…]|ALL]] [--debuginfo]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-c] [-d] [-N] [-k|-m] [-t] [-V] [-x] [-z]\n"
+"[<zařízení> […]|ALL] [-p [<zařízení>[,…]|ALL]]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Nelze najít data na disku\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-A] [-I {SUM|CPU|SCPU|ALL}] [-u] [-P {<procesor>[,…]|ALL}] [-V]\n"
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Průměr:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Tolik procesorů není!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-C <příkaz>] [-d] [-h] [-I] [-l] [-r] [-s]\n"
+"[-t] [-u] [-V] [-w]\n"
+"[-p {<pid>[,…]|SELF|ALL}] [-T {TASK|CHILD|ALL}]\n"
+
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Požadované aktivity nejsou dostupné\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Nelze obsloužit tolik procesorů!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Chyba při čtení souboru se systémovými aktivitami: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Neočekávaný konec souboru se systémovými aktivitami\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Soubor vytvořen pomocí sar/sadc z balíku sysstat verze %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Neplatný soubor se systémovými aktivitami: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Současná verze sysstat již neumí číst formát tohoto souboru (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Požadované aktivity nejsou v souboru %s dostupné\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Použití: %s [přepínače] [<interval> [<počet>]] [<vstupní_soubor>]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-C <komentář>] [-F] [-L] [-V]\n"
+"[-S {INT|DISK|IPV6|POWER|SNMP|XDISK|ALL|XALL}]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Nelze zapsat data do souboru se systémovými aktivitami: %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Nelze zapsat hlavičku souboru se systémovými aktivitami: %s\n"
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Nelze připojit data do tohoto souboru (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Použití: %s [přepínače] [<interval> [<počet>]] [<datový_soubor>]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-d|-D|-H|-p|-x] [-C] [-h] [-t] [-V]\n"
+"[-P {<cpu>[,…]|ALL}] [-s [<hh:mm:ss>]] [-e [<hh:mm:ss>]]\n"
+"[-- <přepínače_sar>]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Datový soubor se systémovými aktivitami: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Počítač: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Velikost „long int“: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Seznam aktivit:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Přepínače jsou:\n"
+"[-A] [-b] [-B] [-C] [-d] [-h] [-p] [-q] [-r]\n"
+"[-R] [-S] [-t] [-u [ALL]] [-v] [-V] [-w] [-W] [-y]\n"
+"[-I {<přerušení>[,…]|SUM|ALL|XALL}] [-P {<procesor>[,…]|ALL}]\n"
+"[-m {<klíčové_slovo>[,…]|ALL}] [-n {<klíčové_slovo>[,…]|ALL}]\n"
+"[-o [<název_souboru>]|-f [<název_souboru>]]\n"
+"[-i <interval>] [-s [<hh:mm:ss>]] [-e [<hh:mm:ss>]]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Hlavní přepínače a výstupní sestavy:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tStatistiky přenosové rychlosti V/V\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tStatistiky stránkování\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tStatistiky blokového zařízení\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I {<přerušení>|SUM|ALL|XALL}\n"
+"\t\tStatistiky přerušení\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m {<klíčové_slovo>[,…]|ALL}\n"
+"\t\tStatistiky správy napájení\n"
+"\t\tKlíčová slova jsou:\n"
+"\t\tCPU\tFrekvence procesoru\n"
+"\t\tFAN\tRychlost ventilátoru\n"
+"\t\tTEMP\tTeplota zařízení\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n {<klíčové_slovo>[,…]|ALL}\n"
+"\t\tStatistiky sítě\n"
+"\t\tKlíčová slova jsou:\n"
+"\t\tDEV\tSíťové rozhraní\n"
+"\t\tEDEV\tSíťové rozhraní (chyby)\n"
+"\t\tNFS\tKlient NFS\n"
+"\t\tNFSD\tServer NFS\n"
+"\t\tSOCK\tSokety\t(v4)\n"
+"\t\tIP\tProvoz IP\t(v4)\n"
+"\t\tEIP\tProvoz IP\t(v4) (chyby)\n"
+"\t\tICMP\tProvoz ICMP\t(v4)\n"
+"\t\tEICMP\tProvoz ICMP\t(v4) (chyby)\n"
+"\t\tTCP\tProvoz TCP\t(v4)\n"
+"\t\tETCP\tProvoz TCP\t(v4) (chyby)\n"
+"\t\tUDP\tProvoz UDP\t(v4)\n"
+"\t\tSOCK6\tSokety\t(v6)\n"
+"\t\tIP6\tProvoz IP\t(v6)\n"
+"\t\tEIP6\tProvoz IP\t(v6) (chyby)\n"
+"\t\tICMP6\tProvoz ICMP\t(v6)\n"
+"\t\tEICMP6\tProvoz ICMP\t(v6) (chyby)\n"
+"\t\tUDP6\tProvoz UDP\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tStatistiky délky fronty a průměrného vytížení\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tStatistiky využití paměti\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tStatistiky paměti\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatistiky využití odkládacího prostoru\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ALL]\n"
+"\t\tStatistiky využití procesoru\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatistiky tabulky jádra\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tStatistiky vytváření úloh a systémového přepínání\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tStatistiky odkládání na disk\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tStatistiky zařízení TTY\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Neočekávaný konec sbírání dat\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Neplatný formát dat\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Používání nesprávného sběrače dat z jiné verze sysstat\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Nekonzistentní vstupní data\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Přepínače -f a -o se navzájem vylučují\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Nečte se ze souboru se systémovými aktivitami (použijte přepínač -f)\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Nelze najít sběrač dat (%s)\n"
diff --git a/nls/da.po b/nls/da.po
new file mode 100644 (file)
index 0000000..a7a6694
--- /dev/null
+++ b/nls/da.po
@@ -0,0 +1,413 @@
+# Danish translation of the sysstat package.
+# Copyright (C) 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the sysstat package.
+#
+# John Damm Soerensen <john@hovedpuden.dk>, 2007.
+# Keld Simonsen <keld@dkuug.dk>, 2009.
+# Joe Hansen <joedalton2@yahoo.dk>, 2008, 2009, 2010.
+#
+# power management -> strømstyring
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat-9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-08-01 09:19+0200\n"
+"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Brug: %s [ flag ] [ <interval> [ <count> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat version %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan ikke åbne %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <enhed> [...] | ALL ] [ -p [ <enhed> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <enhed> [...] | ALL ] [ -p [ <enhed> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Kan ikke lokalisere diskdata\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Middel:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Der er ikke så mange cpuer!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -C <kommando> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Angivne aktiviteter er ikke tilgængelig\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Kan ikke håndtere så mange cpuer!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Læsefejl ved indlæsning af aktivitetsfil: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Uventet afslutning på systemaktivitetsfil\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Fil oprettet ved brug af sar/sadc fra sysstat version %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Ugyldig systemaktivitetsfil: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Nuværende sysstat version kan ikke længere læse formatet på denne fil (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Angivne aktiviteter findes ikke i filen %s\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Brug: %s [ flag ] [ <interval> [ <count> ] ] [ <uddatafil> ]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -C <kommentar> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Kan ikke skrive data til systemaktivitetsfil: %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Kan ikke skrive systemaktivitetsfilhoved: %s\n"
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Kan ikke tilføje data til den fil (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Brug: %s [ flag... ] [ <interval> [ <count> ] ] [ <datafil> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <tt:mm:ss> ] ] [ -e [ <tt:mm:ss> ] ]\n"
+"[ -- <sar_flag...> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Systemaktivitetsdatafil: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Vært: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Størrelse på en lang int: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Oversigt over aktiviteter:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Flag er:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <nøgleord> [,...] | ALL } ] [ -n { <nøgleord> [,...] | ALL } ]\n"
+"[ -o [ <filnavn> ] | -f [ <filnavn> ] ]\n"
+"[ -i <interval> ] [ -s [ <tt:mm:ss> ] ] [ -e [ <tt:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Vigtigste flag og rapporter:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O og statistik for overførelsesrate\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tPagingstatistik\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tStatistik for blokenhed\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tStatistik for afbrydelser\n"
+
+# clock ? tog fra KDE ksysguard (klok)
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tStatistik for strømstyring\n"
+"\t\tNøgleord er:\n"
+"\t\tCPU\tCPU-klokfrekvens\n"
+"\t\tFAN\tBlæserhastighed\n"
+"\t\tTEMP\tEnheders temperatur\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <nøgleord> [,...] | ALL }\n"
+"\t\tNetværksstatistik\n"
+"\t\tNøgleord er:\n"
+"\t\tDEV\tNetværksgrænseflader\n"
+"\t\tEDEV\tNetværksgrænseflader (fejl)\n"
+"\t\tNFS\tNFS-klient\n"
+"\t\tNFSD\tNFS-server\n"
+"\t\tSOCK\tSokler\t(v4)\n"
+"\t\tIP\tIP-trafik\t(v4)\n"
+"\t\tEIP\tIP-trafik\t(v4) (fejl)\n"
+"\t\tICMP\tICMP-trafik\t(v4)\n"
+"\t\tEICMP\tICMP-trafik\t(v4) (fejl)\n"
+"\t\tTCP\tTCP-trafik\t(v4)\n"
+"\t\tETCP\tTCP-trafik\t(v4) (fejl)\n"
+"\t\tUDP\tUDP-trafik\t(v4)\n"
+"\t\tSOCK6\tSokler\t(v6)\n"
+"\t\tIP6\tIP-trafik\t(v6)\n"
+"\t\tEIP6\tIP-trafik\t(v6) (fejl)\n"
+"\t\tICMP6\tICMP-trafik\t(v6)\n"
+"\t\tEICMP6\tICMP-trafik\t(v6) (fejl)\n"
+"\t\tUDP6\tUDP-trafik\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tStatistik for kølængde og gennemsnitlig belastning\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tStatistik for hukommelsesforbrug\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tHukommelsesstatistik\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatistik for swappladsforbrug\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tStatistik for CPU-forbrug\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatistik for kernetabel\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tOpgaveoprettelse og statistik for systemskift\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tStatistik for swapping\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tTTY enhedsstatistik\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Uventet afslutning på dataindsamling\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Ugyldig dataformat\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Bruger en forkert dataindsamler fra en anden sysstat version\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Inkonsistent inddata\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "flagene -f og -o udelukker hinanden\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Læsning sker ikke fra en systemaktivitetsfil (brug flaget -f)\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Kan ikke lokalisere dataindsamleren (%s)\n"
diff --git a/nls/de.po b/nls/de.po
new file mode 100644 (file)
index 0000000..8af934e
--- /dev/null
+++ b/nls/de.po
@@ -0,0 +1,414 @@
+# NLS support for the sysstat package.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# This file is distributed under the same license as the sysstat package.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+# Roland Illig <roland.illig@gmx.de>, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.3\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-06-26 09:01+0200\n"
+"PO-Revision-Date: 2010-06-29 23:54+0100\n"
+"Last-Translator: Roland Illig <roland.illig@gmx.de>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: German\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Aufruf: %s [ optionen... ] [ <intervall> [ <anzahl> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat version %s\n"
+
+#: ioconf.c:490 rd_stats.c:69 rd_stats.c:1842 sa_common.c:1052 sadc.c:586
+#: sadc.c:595 sadc.c:655
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kann nicht öffnen %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <gerät> [...] | ALL ] [ -p [ <gerät> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <gerät> [...] | ALL ] [ -p [ <gerät> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Kann die Plattendaten nicht finden\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:530 pidstat.c:1806 sar.c:354
+msgid "Average:"
+msgstr "Durchschn.:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Nicht so viel Prozessoren!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -C <befehl> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:972
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Die angeforderte Aktion ist nicht verfügbar.\n"
+
+#: rd_stats.c:1888
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Es sind zuviele Prozessoren vorhanden!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Fehler beim lesen der Systemaktivitätendatei: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Unerwartetes Ende der Systemaktivitätendatei\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Diese Datei wurde erzeugt mit sar/sadc von sysstat Version %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Ungültige Systemaktivitätendatei: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Diese Version von sysstat kann das Format dieser Datei (%#x) nicht mehr lesen\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Angeforderte Aktivität ist nicht verfügbar in Datei %s\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Aufruf: %s [ optionen... ] [ <intervall> [ <anzahl> ] ] [ <ausgabedatei> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Kann keine Daten in die Systemaktivitätendatei schreiben: %s\n"
+
+#: sadc.c:473
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Kann den Kopf der Systemaktivitätendatei nicht schreiben: %s\n"
+
+#: sadc.c:749
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "An die Datei \"%s\" können keine Daten angehängt werden\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Aufruf: %s [ optionen ] [ <intervall> [ <anzahl> ] ] [ <datendatei> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_optionen> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Systemaktivitätendatei: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Rechner: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Größe eines Longint: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Liste der Aktivitäten:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Optionen sind:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <wort> [,...] | ALL } ]\n"
+"[ -o [ <dateiname> ] | -f [ <dateiname> ] ]\n"
+"[ -i <intervall> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Hauptoptionen und Berichte:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O- und Transferraten-Statistik\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tPaging-Statistik\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tBlockgeräte-Statistik\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupt-Statistik\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-m\tEnergieverwaltungs-Statistik\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <wort> [,...] | ALL }\n"
+"\t\tNetzwerk-Statistik\n"
+"\t\tWörter sind:\n"
+"\t\tDEV\tNetzwerkschnittstellen\n"
+"\t\tEDEV\tNetzwerkschnittstellen (Fehler)\n"
+"\t\tNFS\tNFS-Client\n"
+"\t\tNFSD\tNFS-Server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP-Verkehr\t(v4)\n"
+"\t\tEIP\tIP-Verkehr\t(v4) (Fehler)\n"
+"\t\tICMP\tICMP-Verkehr\t(v4)\n"
+"\t\tEICMP\tICMP-Verkehr\t(v4) (Fehler)\n"
+"\t\tTCP\tTCP-Verkehr\t(v4)\n"
+"\t\tETCP\tTCP-Verkehr\t(v4) (Fehler)\n"
+"\t\tUDP\tUDP-Verkehr\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP-Verkehr\t(v6)\n"
+"\t\tEIP6\tIP-Verkehr\t(v6) (Fehler)\n"
+"\t\tICMP6\tICMP-Verkehr\t(v6)\n"
+"\t\tEICMP6\tICMP-Verkehr\t(v6) (Fehler)\n"
+"\t\tUDP6\tUDP-Verkehr\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tWarteschlangen- und Systemauslastungs-Statistik\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tSpeicherverbrauchs-Statistik\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tSpeicher-Statistik\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tAuslagerungsspeicher-Statistik\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tCPU-Verbrauchs-Statistik\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tKernel-Tabellen-Statistik\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tTask-Erzeugungs- und Systemwechsel-Statistik\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tAuslagerungs-Statistik\n"
+
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tTTY-Geräte-Statistik\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Unerwartetes Ende der gesammelten Daten\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "ungültiges Datenformat\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Datensammler von einer anderen sysstat-Version in Benutzung\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Inkonsistente Eingabedaten\n"
+
+#: sar.c:1207
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Die Optionen -f und -o schließen sich gegenseitig aus\n"
+
+#: sar.c:1213
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Bitte -f Option zur Angabe der Systemaktivitätendatei verwenden\n"
+
+#: sar.c:1314
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Kann den Datensammler \"%s\" nicht finden\n"
+
+#~ msgid "Time: %s\n"
+#~ msgstr "Zeit: %s\n"
+
+#~ msgid "-x and -p options are mutually exclusive\n"
+#~ msgstr "Die Optionen -x und -p schließen sich gegenseitig aus\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+#~ "Options are:\n"
+#~ "[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+#~ msgstr ""
+#~ "Aufruf: %s [ optionen... ] [ <intervall> [ <anzahl> ] ] [ <dateiname> ]\n"
+#~ "mögliche Optionen:\n"
+#~ "[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#~ msgid "Not an SMP machine...\n"
+#~ msgstr "Keine SMP-Maschine...\n"
diff --git a/nls/es.po b/nls/es.po
new file mode 100644 (file)
index 0000000..c0f6d20
--- /dev/null
+++ b/nls/es.po
@@ -0,0 +1,195 @@
+# NLS support for the sysstat package.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 1999-11-11 19:00\n"
+"Last-Translator: Fernando Félix Redondo <fernando.felix@rediris.es>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versión %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Imposible abrir %s: %s\n"
+
+#: common.c:199
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "¡No pueden manejarse tantos procesadores!\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Uso: %s [ opciones... ] [ <intervalo> [ <número_de_muestras> ] ]\n"
+"Opciones posibles:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <dispositivo> [ ... ] | ALL ] [ -p [ <dispositivo> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Tiempo: %s\n"
+
+#: iostat.c:1435
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "-x y -p son opciones mutuamente excluyentes\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Uso: %s [ opciones... ] [ <intervalo> [ <número_de_muestras> ] ]\n"
+"Opciones posibles:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Media:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "No hay tantos procesadores!\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Uso: %s [ opciones... ] [ <intervalo> [ <número_de_muestras> ] ]\n"
+"Opciones posibles:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Las actividades solicitadas no están disponibles\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Error en la lectura del fichero de actividad del sistema: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Final inesperado del fichero de actividad del sistema\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Fichero de actividad del sistema inválido: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "La actividad demandada no está disponible en el fichero\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Uso: %s [ opciones... ] [ <intervalo> [ <número_de_muestras> ] ] [ <fichero> ]\n"
+"Opciones posibles:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Imposible escribir los datos en el fichero de actividad del sistema: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Imposible escribir la cabecera del fichero de actividad del sistema: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "No pueden añadirse datos a ese fichero\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Uso: %s [ opciones... ] [ <intervalo> [ <número_de_muestras> ] ] [ <fichero> ]\n"
+"Opciones posibles:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_opciones...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Uso: %s [ opciones... ] [ <intervalo> [ <número_de_muestras> ] ]\n"
+"Opciones posibles:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <intervalo> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <fichero> ] | -f [ <fichero> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "No es un multiprocesador...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Formato de datos inválido\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "-f y -o son opciones mutuamente excluyentes\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "No se esta leyendo de un fichero de actividad del sistema (utilice la opción -f)\n"
diff --git a/nls/eu.po b/nls/eu.po
new file mode 100644 (file)
index 0000000..89493a6
--- /dev/null
+++ b/nls/eu.po
@@ -0,0 +1,370 @@
+# Basque translation of sysstat.
+# Copyright (C) 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the sysstat package.
+# Mikel Olasagasti Uranga <hey_neken@mundurat.net>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat-9.1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-02-21 11:47+0100\n"
+"PO-Revision-Date: 2010-03-16 10:32+0100\n"
+"Last-Translator: Mikel Olasagasti <hey_neken@mundurat.net>\n"
+"Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat %s bertsioa\n"
+
+#: ioconf.c:490 rd_stats.c:69 rd_stats.c:1842 sa_common.c:1052 sadc.c:589
+#: sadc.c:598 sadc.c:658
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ezin da %s ireki: %s\n"
+
+#: iostat.c:81 mpstat.c:86 pidstat.c:77 sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Erabilera: %s [ aukerak ] [ <tartea> [ <kopurua> ] ]\n"
+
+#: iostat.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Aukerak:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <gailua> [...] | ALL ] [ -p [ <gailua> [,...] | ALL ] ]\n"
+
+#: iostat.c:340
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Ezin da diska data aurkitu\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Aukerak:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+#: mpstat.c:504 pidstat.c:1683 sar.c:354
+msgid "Average:"
+msgstr "Batezbestekoa:"
+
+#: mpstat.c:847
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Ez daude horrenbeste prozesadore!\n"
+
+#: pidstat.c:80
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Aukerak:\n"
+"[ -C <komandoa> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:197 sar.c:972
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Eskatutako jarduera ez dago eskuragarri\n"
+
+#: rd_stats.c:1888
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Ezin dira horrenbeste prozesadore kudeatu!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Arazoren bat gertatu da sistemako jarduera fitxategia irakurtzean: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Ustekabeko sistema jarduera fitxategi amaiera\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "sysstat %d.%d.%d bertsioko sar/sadc erabiliaz sortutako fitxategia"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Baliogabeko sistema jarduera fitxategia: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Uneko sysstat bertsioak ez da dagoeneko gai fitxategi honen formatua irakurtzeko (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Eskatutako jarduerak ez daude eskuragarri %s fitxategian\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Erabilera: %s [ aukerak ] [ <tartea> [ <kopurua> ] ] [ <irteera fitxategia> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Aukerak:\n"
+"[ -C <iruzkina> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Ezin da daturik idatzi sistema jarduera fitxategian: %s\n"
+
+#: sadc.c:476
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Ezin da sistema jarduera fitxategi goiburua idatzi: %s\n"
+
+#: sadc.c:752
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Ezin da daturik erantsi fitxategi horri (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Erabilera: %s [ aukerak ] [ <tartea> [ <kopurua> ] ] [ <datu fitxategia> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Aukerak:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar-en aukerak> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Sistema jarduera datu fitxategia: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Ostalaria:"
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Long int baten tamaina: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Jarduera zerrenda:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Aukerak:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <tartea> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <gakoa> [,...] | ALL } ]\n"
+"[ -o [ <fitxategia> ] | -f [ <fitxategia> ] ]\n"
+"[ -i <tartea> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Aukera eta txosten nagusiak:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O eta transferentzia tasa estatistikak\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tOrrikatze estatistikak\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tBloke gailu estatistikak\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <tartea> | SUM | ALL | XALL }\n"
+"\t\tEtendura estatistikak\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-m\tEnergia-kudeaketa estatistikak\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <gako-hitza> [,...] | ALL }\n"
+"\t\tSare estatistikak statistics\n"
+"\t\tGako-hitzak:\n"
+"\t\tDEV\tSare-interfazeak\n"
+"\t\tEDEV\tSare-interfazeak (erroreak)\n"
+"\t\tNFS\tNFS bezeroa\n"
+"\t\tNFSD\tNFS zerbitzaria\n"
+"\t\tSOCK\tSocket-ak\t(v4)\n"
+"\t\tIP\tIP trafikoa\t(v4)\n"
+"\t\tEIP\tIP trafikoa\t(v4) (erroreak)\n"
+"\t\tICMP\tICMP trafikoa\t(v4)\n"
+"\t\tEICMP\tICMP trafikoa\t(v4) (erroreak)\n"
+"\t\tTCP\tTCP trafikoa\t(v4)\n"
+"\t\tETCP\tTCP trafikoa\t(v4) (erroreak)\n"
+"\t\tUDP\tUDP trafikoa\t(v4)\n"
+"\t\tSOCK6\tSocket-ak\t(v6)\n"
+"\t\tIP6\tIP trafikoa\t(v6)\n"
+"\t\tEIP6\tIP trafikoa\t(v6) (erroreak)\n"
+"\t\tICMP6\tICMP trafikoa\t(v6)\n"
+"\t\tEICMP6\tICMP trafikoa\t(v6) (erroreak)\n"
+"\t\tUDP6\tUDP trafikoa\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tIlera luzeera eta karga batezbestekoaren estatistikak\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tMemoria erabilera estatistikak\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tMemoria estatistikak\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tSwap espazio erabileraren estatistikak\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tPUZ erabilera estatistikak\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tKernel taula estatistikak\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tAtaza sortze eta sistema kommutazio estatistikak\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tSwapping estatistikak\n"
+
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tTTY gailu estatistikak\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Ustekabeko datu biltze amaiera\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Baliogabeko datu formatua\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "sysstat bertsio ezberdin bateko datu biltzaile okerra erabiltzen\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Kontraesankor datu sarrera\n"
+
+#: sar.c:1207
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "-f eta -o aukerak elkar-ukatzaileak dira\n"
+
+#: sar.c:1213
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Ez da sistema jarduera fitxategi batetik irakurtzen (erabili -f aukera)\n"
+
+#: sar.c:1314
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Ezin da datu biltzailea aurkitu (%s)\n"
diff --git a/nls/fi.po b/nls/fi.po
new file mode 100644 (file)
index 0000000..d7bb53f
--- /dev/null
+++ b/nls/fi.po
@@ -0,0 +1,491 @@
+# Finnish messages for sysstat.
+# Copyright © 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the sysstat package.
+# Jorma Karvonen <karvjorm@users.sf.net>, 2008.
+# Jorma Karvonen <karvonen.jorma@gmail.com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-07-30 14:43+0200\n"
+"Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Käyttö: %s [ valitsimet ] [ <aikaväli> [ <lukumäärä> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat-versio %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ei voida avata %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <laite> [...] | ALL ] [ -p [ <laite> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <laite> [...] | ALL ] [ -p [ <laite> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Levydataa ei löydy\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <suoritin> [,...] | ALL } ] [ -V ]\n"
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Keskiarvo:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Ei niin monta suoritinta!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -C <komento> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <prosessitunniste> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#  Pyydetyt voi olla tilanteesta riippuen halutut, tiedustellut, kyseiset, haetut tms.
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Pyydetyt toiminnot eivät ole käytettävissä\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Ei voida käsitellä niin montaa suoritinta!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Virhe luettaessa järjestelmätoimintojen lokitiedostoa: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Järjestelmätoimintojen lokitiedoston loppu odottamaton\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Tiedosto luotu käyttäen ”sar”- tai ”sadc”-käskyä sysstat-versiosta %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Virheellinen järjestelmätoimintojen lokitiedosto: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Nykyinen sysstat-versio ei voi enää lukea tämän tiedoston (%#x) muotoa\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Pyydetyt toiminnot eivät ole käytettävissä tiedostossa %s\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Käyttö: %s [ valitsimet ] [ <aikaväli> [ <lukumäärä> ] ] [ <tulostetiedosto> ]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -C <kommentti> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Ei voida kirjoittaa tietoja järjestelmätoimintojen lokitiedostoon: %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Ei voida kirjoittaa järjestelmätoimintojen lokitiedoston otsaketta: %s\n"
+
+#  Tässä haluttuun sana voidaan korvata tilanteessa osuvammalla sanalla,  esim. pyydettyyn, toivottuun, valittuun, kyseiseen tms.
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Tietoja ei voida liittää haluttuun tiedostoon (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Käyttö: %s [ valitsimet ] [ <aikaväli> [ <lukumäärä> ] ] [ <datatiedosto> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <suoritin> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_valitsimet...> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Järjestelmätoimintojen lokitiedosto: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Tietokone: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Muuttujatyypin ”long int” koko: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Toimintojen luettelo:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Valitsimet ovat:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <keskeytyspyyntö> [,...] | SUM | ALL | XALL } ] [ -P { <suoritin> [,...] | ALL } ]\n"
+"[ -n { <avainsana> [,...] | ALL } ] [ -n { <avainsana> [,...] | ALL } ]\n"
+"[ -o [ <tiedostonimi> ] | -f [ <tiedostonimi> ] ]\n"
+"[ -i <aikaväli> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Päävalitsimet ja -ilmoitukset ovat:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tSiirräntä- ja siirtonopeustilastot\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tSivutustilastot\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tLohkolaitetilastot\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <keskeytyspyyntö> | SUM | ALL | XALL }\n"
+"\t\tKeskeytysten tilasto\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m { <avainsana> [,...] | ALL }\n"
+"\t\tTehonhallntatilastot\n"
+"\t\tAvainsanoja ovat:\n"
+"\t\tCPU\tProsessorin kellotaajuus\n"
+"\t\tFAN\tTuulettimen nopeus\n"
+"\t\tTEMP\tLaitteen lämpötila\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <avainsana> [,...] | ALL }\n"
+"\t\tVerkkotilastot\n"
+"\t\tAvainsanoja ovat:\n"
+"\t\tDEV\tVerkkoliittymät\n"
+"\t\tEDEV\tVerkkoliittymät (virheet)\n"
+"\t\tNFS\tNFS-asiakas\n"
+"\t\tNFSD\tNFS-palvelin\n"
+"\t\tSOCK\tPistokkeet\t(v4)\n"
+"\t\tIP\tIP-liikenne\t(v4)\n"
+"\t\tEIP\tIP-liikenne\t(v4) (virheet)\n"
+"\t\tICMP\tICMP-liikenne\t(v4)\n"
+"\t\tEICMP\tICMP-liikenne\t(v4) (virheet)\n"
+"\t\tTCP\tTCP-liikenne\t(v4)\n"
+"\t\tETCP\tTCP-liikenne\t(v4) (virheet)\n"
+"\t\tUDP\tUDP-liikenne\t(v4)\n"
+"\t\tSOCK6\tPistokkeet\t(v6)\n"
+"\t\tIP6\tIP-liikenne\t(v6)\n"
+"\t\tEIP6\tIP-liikenne\t(v6) (virheet)\n"
+"\t\tICMP6\tICMP-liikenne\t(v6)\n"
+"\t\tEICMP6\tICMP-liikenne\t(v6) (virheet)\n"
+"\t\tUDP6\tUDP-liikenne\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tJonopituus- ja latauskeskiarvotilastot\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tMuistin käyttöastetilastot\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tMuistitilastot\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tNäennäismuistitilan käyttöastetilastot\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tSuorittimen käyttöastetilastot\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tKäyttöjärjestelmäytimen taulutilastot\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tTehtävän luonti- ja järjestelmänvaihtotilastot\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tNäennäismuisti vaihtamistilastot\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tTTY-laitetilastot\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Tiedonkeräyksen loppu odottamaton\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Virheellinen datamuoto\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Käytetään väärää datakerääjää eri sysstat-versiosta\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Epäjohdonmukainen syötedata\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "valitsimet ”-f” ja ”-o” ovat vastavuoroisesti poissulkevia\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Ei lueta järjestelmätoimintojen lokitiedostosta (käytä valitsinta ”-f”)\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Datakerääjää (%s) ei löydy\n"
+
+#~ msgid "\t-m\tPower management statistics\n"
+#~ msgstr "\t-m\tTehonhallintatilastot\n"
+
+#~ msgid "Usage:"
+#~ msgstr "Käyttö:"
+
+#~ msgid "options..."
+#~ msgstr "valitsimet..."
+
+#~ msgid "interval"
+#~ msgstr "aikaväli"
+
+#~ msgid "count"
+#~ msgstr "lukumäärä"
+
+#~ msgid "device"
+#~ msgstr "laite"
+
+#~ msgid "Time: %s\n"
+#~ msgstr "Aika: %s\n"
+
+#~ msgid "-x and -p options are mutually exclusive\n"
+#~ msgstr "valitsimet ”-x” ja ”-p” ovat keskenään poissulkevia\n"
+
+#~ msgid "cpu"
+#~ msgstr "suoritin"
+
+#~ msgid "command"
+#~ msgstr "käsky"
+
+#~ msgid "outfile"
+#~ msgstr "tulostetiedosto"
+
+#~ msgid "comment"
+#~ msgstr "kommentti"
+
+#~ msgid "datafile"
+#~ msgstr "datatiedosto"
+
+#~ msgid "hh:mm:ss"
+#~ msgstr "hh.mm.ss"
+
+#~ msgid "sar_options..."
+#~ msgstr "sar_valitsimet..."
+
+#~ msgid "Activity flag: %#x\n"
+#~ msgstr "Toimintolippu: %#x\n"
+
+#~ msgid "Number of CPU: %u\n"
+#~ msgstr "Suorittimien lukumäärä: %u\n"
+
+#~ msgid "Number of interrupts per CPU: %u\n"
+#~ msgstr "Keskeytysten lukumäärä suoritinta kohden: %u\n"
+
+#~ msgid "Number of disks: %u\n"
+#~ msgstr "Levyjen lukumäärä: %u\n"
+
+#~ msgid "Number of serial lines: %u\n"
+#~ msgstr "Sarjalinjojen lukumäärä: %u\n"
+
+#~ msgid "Number of network interfaces: %u\n"
+#~ msgstr "Verkkoliitäntöjen lukumäärä: %u\n"
+
+#~ msgid "int"
+#~ msgstr "keskeytyspyyntö"
+
+#~ msgid "filename"
+#~ msgstr "tiedostonimi"
+
+#~ msgid "Not an SMP machine...\n"
+#~ msgstr "Ei ole symmetrinen monisuoritinkone...\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+#~ "Options are:\n"
+#~ "[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+#~ msgstr ""
+#~ "Käyttö: %s [ valitsimet... ] [ <aikaväli> [ <lukumäärä> ] ] [ <tulostetiedosto> ]\n"
+#~ "Valitsimet ovat:\n"
+#~ "[ -C <kommentti> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
diff --git a/nls/fr.po b/nls/fr.po
new file mode 100644 (file)
index 0000000..83eb89e
--- /dev/null
+++ b/nls/fr.po
@@ -0,0 +1,428 @@
+# NLS support for the sysstat package.
+# Copyright (C) 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the sysstat package.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+# Nicolas Provost <nprovost AT quadriv DOT com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-08-01 09:28+0100\n"
+"Last-Translator: Nicolas Provost <nprovost@quadriv.com>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Utilisation : %s [ options... ] [ <intervalle> [ <itérations> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat version %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Impossible d'ouvrir %s : %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <périph.> [...] | ALL ] [ -p [ <périph.> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <périph> [...] | ALL ] [ -p [ <périph> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Impossible de trouver les données du disque\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Moyenne :"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Pas tant de processeurs !\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -C <commande> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Statistiques demandées non disponibles\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Impossible de gérer autant de processeurs !\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Erreur lors de la lecture du fichier d'activité système : %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Fin du fichier d'activité système inattendue\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Fichier créé par sar/sadc depuis la version %d.%d.%d de sysstat"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Fichier d'activité système non valide : %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "La version courante de sysstat ne peut plus lire le format de ce fichier (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Activités demandées non enregistrées dans le fichier %s\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Utilisation : %s [ options... ] [ <intervalle> [ <itérations> ] ] [ <fichier_de_sortie> ]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -C <commentaire> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Impossible d'écrire les données dans le fichier d'activité système : %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Impossible d'écrire l'entête du fichier d'activité système : %s\n"
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Impossible d'ajouter des données à la fin de ce fichier (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Utilisation: %s [ options... ] [ <intervalle> [ <itérations> ] ] [ <fichier_données> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <options_sar...> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Fichier des données d'activité système : %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Hôte : "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Taille d'un \"long int\" : %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Liste de statistiques :\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Options possibles :\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <entier> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <mot-clef> [,...] | ALL } ] [ -n { <mot-clef> [,...] | ALL } ]\n"
+"[ -o [ <nom_fichier> ] | -f [ <nom_fichier> ] ]\n"
+"[ -i <intervalle> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Options principales et rapports :\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tStatistiques entrées/sorties et taux de transfert\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tStatistiques pages mémoire\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tStatistiques périphériques par blocs\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tStatistiques interruptions\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m { <motclef> [,...] | ALL }\n"
+"\t\tStatistiques de gestion énergie\n"
+"\t\tMots-clefs possibles :\n"
+"\t\tCPU\tfréquence CPU\n"
+"\t\tFAN\tvitesse ventilateurs\n"
+"\t\tTEMP\ttempérature périphériques\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <mot_clé> [,...] | ALL }\n"
+"\t\tStatistiques réseau\n"
+"\t\tMots-clés possibles :\n"
+"\t\tDEV\tInterfaces réseau\n"
+"\t\tEDEV\tInterfaces réseau (erreurs)\n"
+"\t\tNFS\tClient NFS\n"
+"\t\tNFSD\tServeur NFS\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tTrafic IP\t(v4)\n"
+"\t\tEIP\tTrafic IP\t(v4) (erreurs)\n"
+"\t\tICMP\tTrafic ICMP\t(v4)\n"
+"\t\tEICMP\tTrafic ICMP\t(v4) (erreurs)\n"
+"\t\tTCP\tTrafic TCP\t(v4)\n"
+"\t\tETCP\tTrafic TCP\t(v4) (erreurs)\n"
+"\t\tUDP\tTrafic UDP\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tTrafic IP\t(v6)\n"
+"\t\tEIP6\tTrafic\t(v6) (erreurs)\n"
+"\t\tICMP6\tTrafic ICMP\t(v6)\n"
+"\t\tEICMP6\tTrafic ICMP\t(v6) (erreurs)\n"
+"\t\tUDP6\tTrafic UDP\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tStatistiques longueur de queue et charge moyenne\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tStatistiques d'utilisation mémoire\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tStatistiques mémoire\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatistiques d'utilisation de l'espace d'échange\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tStatistiques d'utlisation CPU\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatistiques table noyau\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tStatistiques de création et commutation de tâches par le système\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tStatistiques d'échange (mémoire)\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tStatistiques périph. consoles (TTY)\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Fin inattendue de collecte des données\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Format de données non valide\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Utilisation d'un mauvais collecteur de données venant d'une autre version de sysstat\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Données inconsistantes en entrée\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Les options -f et -o ne peuvent être utilisées ensemble\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Pas de fichier d'activité système lisible (utilisez l'option -f)\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Impossible de trouver le collecteur de données (%s)\n"
+
+#~ msgid "\t-m\tPower management statistics\n"
+#~ msgstr "\t-m\tStatistiques gestion d'énergie\n"
+
+#~ msgid "-x and -p options are mutually exclusive\n"
+#~ msgstr "Les options -x et -p ne peuvent être utilisées ensemble\n"
+
+#~ msgid "Time: %s\n"
+#~ msgstr "Heure : %s\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+#~ "Options are:\n"
+#~ "[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+#~ msgstr ""
+#~ "Utilisation: %s [ options... ] [ <intervalle> [ <itérations> ] ] [ <fichier> ]\n"
+#~ "Options possibles:\n"
+#~ "[ -C <commentaire> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#~ msgid "Not an SMP machine...\n"
+#~ msgstr "Pas une machine multiprocesseur...\n"
diff --git a/nls/id.po b/nls/id.po
new file mode 100644 (file)
index 0000000..c3105bc
--- /dev/null
+++ b/nls/id.po
@@ -0,0 +1,423 @@
+# Indonesian translations for sysstat package.
+# Copyright (C) 2008 THE sysstat'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the sysstat package.
+# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-07-31 21:51+0700\n"
+"Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Penggunaan: %s [ opsi ] [ <interval> [ <hitungan> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Opsinya adalah:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versi %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Tak dapat membuka %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Opsinya adalah:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <divais> [...] | ALL ] [ -p [ <divais> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Opsinya adalah:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <divais> [...] | ALL ] [ -p [ <divais> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Tak dapat menemukan data cakram\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Opsinya adalah:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Rata-rata:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Tidak sebanyak itu prosesor!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Opsinya adalah:\n"
+"[ -C <perintah> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Aktivitas yang diminta tak tersedia\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Tak dapat menangani begitu banyak prosesor!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Galat ketika membaca berkas aktivitas sistem: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Akhir berkas aktivitas sistem tak diharapkan\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Berkas dibuat menggunakan sar/sadc dari sysstat versi %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Berkas aktivitas sistem tak sah: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Versi sysstat saat ini tak dapat lagi membaca format berkas ini (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Aktivitas yang diminta tak tersedia di berkas %s\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Penggunaan: %s [ opsi... ] [ <interval> [ <hitungan> ] ] [ <berkas keluaran> ]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Opsinya adalah:\n"
+"[ -C <komentar> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Tak dapat menulis data ke berkas aktivitas sistem: %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Tak dapat menulis tajuk berkas aktivitas sistem: %s\n"
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Tak dapat menambah data ke berkas tersebut (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Penggunaan: %s [ opsi ] [ <interval> [ <hitungan> ] ] [ <berkas data> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Opsinya adalah:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <jj:mm:dd> ] ] [ -e [ <jj:mm:dd> ] ]\n"
+"[ -- <opsi_sar> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Berkas data aktivitas sistem: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Host: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Ukuran interval panjang: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Senarai aktivitas:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <kata kunci> [,...] | ALL } ] [ -n { <kata kunci> [,...] | ALL } ]\n"
+"[ -o [ <nama berkas> ] | -f [ <nama berkas> ] ]\n"
+"[ -i <interval> ] [ -s [ <jj:mm:dd> ] ] [ -e [ <jj:mm:dd> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Opsi utama dan laporan:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O dan statistik rasio transfer\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tStatistik halaman\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tStatistik divais blok\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterupsi statistik\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m { <kata kunci> [,...] | ALL }\n"
+"\t\tStatistik manajemen daya\n"
+"\t\tKata kuncinya adalah:\n"
+"\t\tCPU\tFrekuensi jam CPU\n"
+"\t\tFAN\tKecepatan kipas\n"
+"\t\tTEMP\tTemperatur divais\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <kata kunci> [,...] | ALL }\n"
+"\t\tStatistik jaringan\n"
+"\t\tKata kunci adalah:\n"
+"\t\tDEV\tAntarmuka jaringan\n"
+"\t\tEDEV\tAntarmuka jaringan (galat)\n"
+"\t\tNFS\tKlien NFS\n"
+"\t\tNFSD\tKlien NFS\n"
+"\t\tSOCK\tSoket\t(v4)\n"
+"\t\tIP\tLalu lintas IP\t(v4)\n"
+"\t\tEIP\tLalu lintas IP\t(v4) (galat)\n"
+"\t\tICMP\tLalu lintas ICMP\t(v4)\n"
+"\t\tEICMP\tLalu lintas ICMP\t(v4) (galat)\n"
+"\t\tTCP\tLalu lintas TCP\t(v4)\n"
+"\t\tETCP\tLalu lintas TCP\t(v4) (galat)\n"
+"\t\tUDP\tLalu lintas UDP\t(v4)\n"
+"\t\tSOCK6\tSoket\t(v6)\n"
+"\t\tIP6\tLalu lintas IP\t(v6)\n"
+"\t\tEIP6\tLalu lintas IP\t(v6) (galat)\n"
+"\t\tICMP6\tLalu lintas ICMP\t(v6)\n"
+"\t\tEICMP6\tLalu lintas ICMP\t(v6) (galat)\n"
+"\t\tUDP6\tLalu lintas UDP\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tPanjang antrean dan statistik rata-rata muatan\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tStatistik utilisasi memori\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tStatistik memori\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatistik utilisasi ruang swap\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tStatistik utilisasi CPU\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatistik tabel kernel\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tStatistik penukar sistem dan pembuatan tugas\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tStatistik swap\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tStatistik divais TTY\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Akhir pengumpulan data tak diharapkan\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Format data tak sah\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Menggunakan pengumpul data yang salah dari versi sysstat yang berbeda\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Data masukan tidak konsisten\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "opsi -f dan -o secara mutual eksklusif\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Tak membaca dari berkas aktivitas sistem (gunakan opsi -f)\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Tak dapat menemukan pengumpul data (%s)\n"
+
+#~ msgid "\t-m\tPower management statistics\n"
+#~ msgstr "\t-m\tStatistik manajemen daya\n"
+
+#~ msgid "-x and -p options are mutually exclusive\n"
+#~ msgstr "opsi -x dan -p secara mutual eksklusif\n"
+
+#~ msgid ""
+#~ "\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+#~ "\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+#~ "\t\tNetwork statistics\n"
+#~ msgstr ""
+#~ "\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+#~ "\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+#~ "\t\tStatistik jaringan\n"
+
+#~ msgid "Time: %s\n"
+#~ msgstr "Waktu: %s\n"
diff --git a/nls/it.po b/nls/it.po
new file mode 100644 (file)
index 0000000..9b9236b
--- /dev/null
+++ b/nls/it.po
@@ -0,0 +1,420 @@
+# ITALIAN TRANSLATION OF SYSSTAT
+# COPYRIGHT (C) 2008-2009-2010 THE SYSSTAT'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the sysstat package.
+#
+# Vincenzo Campanella <vinz65@gmail.com>, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat-9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-07-31 11:53+0200\n"
+"Last-Translator: Vincenzo Campanella <vinz65@gmail.com>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Uso: %s [ opzioni ] [ <intervallo> [ <iterazioni> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versione %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Impossibile aprire %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Impossibile trovare i dati concernenti il disco\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Media:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Non così tanti processori.\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Le statistiche richieste non sono disponibili\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Impossibile gestire così tanti processori.\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Errore durante la lettura del file delle statistiche del sistema: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Il file delle statistiche del sistema è terminato in modo inatteso\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "File creato usando sar/sadc da sysstat versione %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "File delle statistiche del sistema non valido: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "La versione attuale di sysstat non è più in grado di leggere il formato di questo file (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Le statistiche richieste non sono disponibili nel file %s\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Uso: %s [ opzioni ] [ <intervallo> [ <iterazioni> ] ] [ <filedioutput> ]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[ -C <commento> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Impossibile scrivere dati nel file delle statistiche del sistema: %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Impossibile scrivere l'intestazione del file delle statistiche del sistema: %s\n"
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Impossibile aggiungere dati a quel file (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Uso: %s [ opzioni ] [ <intervallo> [ <iterazioni> ] ] [ <filedeidati> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "File delle statistiche del sistema: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Host: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Dimensione di un «long int»: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Elenco delle statistiche:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Le opzioni sono:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Opzioni e rapporti principali:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tStatistiche sull'I/O e sulla velocità di trasferimento\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tStatistiche sulla paginazione\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tStatistiche sui device a blocco\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tStatistiche sugli interrupt\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m { <parola chiave> [,...] | ALL }\n"
+"\t\tStatistiche sulla gestione dell'alimentazione\n"
+"\t\tLe parole chiave sono:\n"
+"\t\tCPU\tfrequenza del clock della CPU\n"
+"\t\tFAN\tVelocità delle ventole\n"
+"\t\tTEMP\tTemperatura dei dispositivi\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <parolachiave> [,...] | ALL }\n"
+"\t\tStatistiche di rete\n"
+"\t\tLe parole chiave sono:\n"
+"\t\tDEV\tInterfacce di rete\n"
+"\t\tEDEV\tInterfacce di rete (errori)\n"
+"\t\tNFS\tClient NFS\n"
+"\t\tNFSD\tServer NFS\n"
+"\t\tSOCK\tSocket\t(v4)\n"
+"\t\tIP\tTraffico IP\t(v4)\n"
+"\t\tEIP\tTraffico IP\t(v4) (errori)\n"
+"\t\tICMP\tTraffico ICMP\t(v4)\n"
+"\t\tEICMP\tTraffico ICMP\t(v4) (errori)\n"
+"\t\tTCP\tTraffico TCP\t(v4)\n"
+"\t\tETCP\tTraffico TCP\t(v4) (errori)\n"
+"\t\tUDP\tTraffico UDP\t(v4)\n"
+"\t\tSOCK6\tSocket\t(v6)\n"
+"\t\tIP6\tTraffico IP\t(v6)\n"
+"\t\tEIP6\tTraffico IP\t(v6) (errori)\n"
+"\t\tICMP6\tTraffico ICMP\t(v6)\n"
+"\t\tEICMP6\tTraffico ICMP\t(v6) (errori)\n"
+"\t\tUDP6\tTraffico UDP\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tStatistiche sulla media della lunghezza della coda e del carico\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tStatistiche sull'uso della memoria\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tStatistiche sulla memoria\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatistiche sull'uso dello spazio di swap\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tStatistiche sull'uso della CPU\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatistiche sulla tabella del kernel\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tStatistiche sulla creazione di attività e sui cambiamenti del sistema\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tStatistiche sullo swap\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tStatistiche sui device TTY\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Fine inattesa della raccolta dei dati\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Formato dei dati non valido\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Utilizzo di un collettore di dati errato da una versione differente di sysstat\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Dati in ingresso inconsistenti\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Le opzioni -f e -o si escludono a vicenda\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "La lettura non avviene da un file delle statistiche del sistema (usare l'opzione -f)\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Impossibile trovare il collettore dei dati (%s)\n"
+
+#~ msgid "\t-m\tPower management statistics\n"
+#~ msgstr "\t-B\tStatistiche sulla gestione dell'energia\n"
+
+#~ msgid "-x and -p options are mutually exclusive\n"
+#~ msgstr "Le opzioni -x e -p si escludono a vicenda\n"
+
+#~ msgid ""
+#~ "\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+#~ "\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+#~ "\t\tNetwork statistics\n"
+#~ msgstr ""
+#~ "\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+#~ "\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+#~ "\t\tStatistiche sulla rete\n"
diff --git a/nls/ja.po b/nls/ja.po
new file mode 100644 (file)
index 0000000..40afd17
--- /dev/null
+++ b/nls/ja.po
@@ -0,0 +1,368 @@
+# NLS support for the sysstat package.
+# This file is distributed under the same license as the sysstat package.
+# Copyright (C) 1999-2009 Free Software Foundation, Inc.
+# Sebastien GODARD <sysstat [at] orange.fr>, 1999.
+# Japanese translation by Hideki Yamane (Debian-JP) <henrich@debian.or.jp>, 2008-2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.0.3\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2009-05-17 16:16+0200\n"
+"PO-Revision-Date: 2009-11-12 06:06+0900\n"
+"Last-Translator: Hideki Yamane (Debian-JP) <henrich@debian.or.jp>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat バージョン %s\n"
+
+#: ioconf.c:479 iostat.c:504 rd_stats.c:69 rd_stats.c:2126 rd_stats.c:2243
+#: sa_common.c:1052 sadc.c:591 sadc.c:600 sadc.c:660
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "%s を開けません: %s\n"
+
+#: iostat.c:81 mpstat.c:83 pidstat.c:77 sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "使い方: %s [ オプション ] [ <間隔> [ <回数> ] ]\n"
+
+#: iostat.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"利用可能なオプション:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <デバイス> [ ... ] | ALL ] [ -p [ <デバイス> [,...] | ALL ] ]\n"
+
+#: mpstat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"利用可能なオプション:\n"
+"[ -A ] [ -I { SUM | CPU | ALL } ] [ -u ] [ -P { <CPU> [,...] | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:457 pidstat.c:1683 sar.c:354
+msgid "Average:"
+msgstr "平均値:"
+
+#: mpstat.c:769
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "そんなに CPU はありません!\n"
+
+#: pidstat.c:80
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"利用可能なオプション:\n"
+"[ -C <コマンド> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:197 sar.c:968
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "要求された動作情報は利用できません\n"
+
+#: rd_stats.c:2289
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "そんなに大量のプロセッサは扱えません!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "システム動作情報ファイルの読み込み中にエラーが起きました: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "システム動作情報ファイルが途中で予期無く終了しました\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "sysstat バージョン %d.%d.%d の sar/sadc を使って作られたファイル"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "システム動作情報ファイルの形式が正しくありません: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "sysstat の現在のバージョンではこのデータファイル (%#x) の形式を読み込めなくなっています\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "要求された動作情報はファイル %s 内にはありません\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "使い方: %s [ オプション ] [ <間隔> [ <回数> ] ] [ <出力ファイル> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"利用可能なオプション:\n"
+"[ -C <コメント> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "システム動作情報ファイルに書き込みができません: %s\n"
+
+#: sadc.c:478
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "システム動作情報ファイルのヘッダに書き込みができません: %s\n"
+
+#: sadc.c:754
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "ファイル (%s) にデータを追加できません\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "使い方: %s [ オプション ] [ <間隔> [ <回数> ] ] [ <データファイル名> ]\n"
+
+#: sadf.c:88
+#, fuzzy, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"利用可能なオプション:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar のオプション...> ]\n"
+
+#: sadf.c:541
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "システム動作情報ファイル: %s (%#x)\n"
+
+#: sadf.c:550
+#, c-format
+msgid "Host: "
+msgstr "ホスト名: "
+
+#: sadf.c:556
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "long int のサイズ: %d\n"
+
+#: sadf.c:558
+#, c-format
+msgid "List of activities:\n"
+msgstr "動作情報のリスト:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]\n"
+"[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"利用可能なオプション:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]\n"
+"[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -o [ <ファイル名> ] | -f [ <ファイル名> ] ]\n"
+"[ -i <間隔> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "主要なオプションとその結果:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O と転送率の状況\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tページングの状態\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tブロックデバイスの状態\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\t割り込み状況\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-m\t電力管理状況\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <キーワード> [,...] | ALL }\n"
+"\t\tネットワークの状態\n"
+"\t\tキーワード一覧:\n"
+"\t\tDEV\tネットワークインターフェイス\n"
+"\t\tEDEV\tネットワークインターフェイス (エラー)\n"
+"\t\tNFS\tNFS クライアント\n"
+"\t\tNFSD\tNFS サーバ\n"
+"\t\tSOCK\tソケット\t(v4)\n"
+"\t\tIP\tIP トラフィック\t(v4)\n"
+"\t\tEIP\tIP トラフィック\t(v4) (エラー)\n"
+"\t\tICMP\tICMP トラフィック\t(v4)\n"
+"\t\tEICMP\tICMP トラフィック\t(v4) (エラー)\n"
+"\t\tTCP\tTCP トラフィック\t(v4)\n"
+"\t\tETCP\tTCP トラフィック\t(v4) (エラー)\n"
+"\t\tUDP\tUDP トラフィック\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP トラフィック\t(v6)\n"
+"\t\tEIP6\tIP トラフィック\t(v6) (エラー)\n"
+"\t\tICMP6\tICMP トラフィック\t(v6)\n"
+"\t\tEICMP6\tICMP トラフィック\t(v6) (エラー)\n"
+"\t\tUDP6\tUDP トラフィック\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tQキューの長さとロードアベレージの状態\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tメモリ利用率の状態\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tメモリの状況\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tスワップ領域の利用状況\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tCPU 利用の利用状況\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tカーネルのテーブル状態\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tタスクの作成とシステムスイッチの状態\n"
+
+# , c-format
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tスワップの状態\n"
+
+# , c-format
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tTTY デバイスの状態\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "データの収集が予期無く終了しました\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "データ形式が正しくありません\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "異なるバージョンの sysstat のデータ収集プログラムによる不正なデータを使っています\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "矛盾した入力データです\n"
+
+#: sar.c:1203
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "-f と -o オプションは相互に排他的です\n"
+
+#: sar.c:1209
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "システム動作情報ファイルの読み込みがありません (-f オプションを使ってください)\n"
+
+#: sar.c:1310
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "データ収集プログラム (%s) が見つかりません\n"
diff --git a/nls/ky.po b/nls/ky.po
new file mode 100644 (file)
index 0000000..0c174ab
--- /dev/null
+++ b/nls/ky.po
@@ -0,0 +1,196 @@
+# Translation of 'sysstat' messages to Kirghiz.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Ilyas Bakirov <just_ilyas@yahoo.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 8.0.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 2007-12-21 16:53+0600\n"
+"Last-Translator: Ilyas Bakirov <just_ilyas@yahoo.com>\n"
+"Language-Team: Kirghiz <i18n-team-ky-kyrgyz@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Kyrgyz\n"
+"X-Poedit-Country: KYRGYZSTAN\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat версиясы %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Cannot open %s: %s\n"
+
+#: common.c:199
+#, fuzzy, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Мынча көп процессор аткыраалынбайт!\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Колдонуу: %s [ опциялар... ] [ <интервал> [ <эсептегич> ] ]\n"
+"Опциялар төмөнкүдөй:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <жабдык> [ ... ] | ALL ] [ -p [ <жабдык> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Убакыт: %s\n"
+
+#: iostat.c:1435
+#, fuzzy, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "-x and -p options are mutually exclusive\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Колдонуу: %s [ опциялар... ] [ <интервал> [ <эсептегич> ] ]\n"
+"Опциялар төмөнкүдөй:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Орточо:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Мынча көп процессор эмес!\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Колдонуу: %s [ опциялар... ] [ <интервал> [ <эсептегич> ] ]\n"
+"Опциялар төмөнкүдөй:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Талап кылынган активдүүлүктөр жок\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Системдик активдүүлүктү окууда ката чыкты: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Системдик активдүүлүк файлдын күтүлбөгөн соңу\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Системдик активдүүлүк файлы туура эмес: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "Талап кылынган активдүүлүктөр жок\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Колдонуу: %s [ опциялар... ] [ <интервал> [ <эсептегич> ] ] [ <чыгыш_файлы> ]\n"
+"Опциялар төмөнкүдөй:\n"
+"[ -C <комментарий> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Берилиштер  системдик активдүүлүк файлга жазаалынган жок: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Системдик активдүүлүктүн башат файлы жазаалынган жок: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "Берилиштер тиги файлга кошоалынган жок\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Колдонуу: %s [ опциялар... ] [ <интервал> [ <эсептегич> ] ] [ <файл_аты> ]\n"
+"Опциялар төмөнкүдөй:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_опциялар...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Колдонуу: %s [ опциялар... ] [ <интервал> [ <эсептегич> ] ]\n"
+"Опциялар төмөнкүдөй:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <интервал> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <файл_аты> ] | -f [ <файл_аты> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Көп процессорлуу машина эмес...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Берилиштердин форматы туура эмес\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "-f жана -o опциялар бир бирин жойюшат\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Системдик активдүүлүктөн окуубай жатабыз (-f опциясын колдонуңуз)\n"
diff --git a/nls/lv.po b/nls/lv.po
new file mode 100644 (file)
index 0000000..249d104
--- /dev/null
+++ b/nls/lv.po
@@ -0,0 +1,395 @@
+# translation of sysstat to Latvian
+# Copyright (C) 2009 sysstat 
+# This file is distributed under the same license as the sysstat package.
+#
+# Rihards Prieditis <rprieditis@gmail.com>, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat-9.1.3\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-06-26 09:01+0200\n"
+"PO-Revision-Date: 2010-07-07 10:50+0100\n"
+"Last-Translator: Rihards Priedītis <rprieditis@gmail.com>\n"
+"Language-Team: Latvian <translation-team-lv@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Lietošana: %s [izvēles] [<intervāls> [<skaits>]]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versija %s\n"
+
+#: ioconf.c:490 rd_stats.c:69 rd_stats.c:1842 sa_common.c:1052 sadc.c:586
+#: sadc.c:595 sadc.c:655
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nevar atvērt %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <ierīce> [...] | ALL ] [ -p [ <ierīce> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <ierīce> [...] | ALL ] [ -p [ <ierīce> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Nevar atrast diska datus\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:354
+msgid "Average:"
+msgstr "Vidēji:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Ne tik daudz procesoru!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -C <kommanda> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:972
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Pieprasītās darbības nav pieejamas\n"
+
+#: rd_stats.c:1888
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Nevar vadīt tik daudz procesoru!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Kļūda lasot sistēmas aktivitātes failu: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Negaidītas beigas sistēmas aktivitātes failam\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Fails izveidots izmantojot sar/sadc no sysstat versijas %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Nederīgs sistēmas aktivitātes fails: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Patreizējā sysstat versija nav spējīga lasīt formātu šim failam (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Pieprasītās darbības nav pieejamas failā %s\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Lietošana: %s [ izvēles ] [ <intervāls> [ <skaits> ] ] [ <izejasfails> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -C <komentārs> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Nevar ierakstīt datus sistēmas aktivitātes failā: %s\n"
+
+#: sadc.c:473
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Nevar ierakstīt virsrakstu sistēmas aktivitātes failā: %s\n"
+
+#: sadc.c:749
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Nevar apvienot datus sistēmas aktivitātes failā: %s\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Lietošana: %s [ Izvēles ] [ <intervāls> [ <skaits> ] ] [ <datufails> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_iespējas> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Sistēmas aktivitātes datu fails: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Resursdators:"
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Izmērs lielajam int: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Darbību saraksts:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Izvēles ir:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <cipars> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <atslēgas_vārds> [,...] | ALL } ]\n"
+"[ -o [ <faila_nosaukums> ] | -f [ <faila_nosaukums> ] ]\n"
+"[ -i <intervāls> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Galvenās iespējas un ziņojumi:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O un pārraides ātrums statistika\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tLapošanas statistika\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tBloku ierīces statistika\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tPārtraukumu statistika\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-m\tEnerģijas pārvaldības statistika\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <atslēgas_vārds> [,...] | ALL }\n"
+"\t\tTīkla statistika\n"
+"\t\tAtslēgas vārdi ir:\n"
+"\t\tDEV\tTīkla interfeisi\n"
+"\t\tEDEV\tTīkla interfeisi (kļūdas)\n"
+"\t\tNFS\tNFS klienti\n"
+"\t\tNFSD\tNFS serveri\n"
+"\t\tSOCK\tSoketi\t(v4)\n"
+"\t\tIP\tIP plūsma\t(v4)\n"
+"\t\tEIP\tIP plūsma\t(v4) (kļūdas)\n"
+"\t\tICMP\tICMP plūsma\t(v4)\n"
+"\t\tEICMP\tICMP plūsma\t(v4) (kļūdas)\n"
+"\t\tTCP\tTCP plūsma\t(v4)\n"
+"\t\tETCP\tTCP plūsma\t(v4) (kļūdas)\n"
+"\t\tUDP\tUDP plūsma\t(v4)\n"
+"\t\tSOCK6\tSoketi\t(v6)\n"
+"\t\tIP6\tIP plūsma\t(v6)\n"
+"\t\tEIP6\tIP plūsma\t(v6) (kļūdas)\n"
+"\t\tICMP6\tICMP plūsma\t(v6)\n"
+"\t\tEICMP6\tICMP plūsam\t(v6) (kļūdas)\n"
+"\t\tUDP6\tUDP plūsmas\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tRindas garums un vidējās noslodzes statistika\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tAtmiņas izmantošanas statistika\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tAtmiņas statistika\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tApmaiņas vietas izmantošanas statistika\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tCPU izmantošanas statistika\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tKodola tabulas statistika\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tUzdevumu izveidošanas un sistemas pārslēgšanas statistika\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tApmaiņas statistika\n"
+
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tTTY ierīces statistika\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Negaidītas datu vākšanas beigas\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Nederīgs datu formāts\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Tiek izmantots nepareizs datu vācējs, no iepriekšējās sysstat versijas\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Nesaderīgs datu ievads\n"
+
+#: sar.c:1207
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "-f un -o iespējas ir savstarpēji izslēdzošas\n"
+
+#: sar.c:1213
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Netiek lasīts no sistēmas aktivitātes faila (izmantojies -f iespēju)\n"
+
+#: sar.c:1314
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Nevar atrast datu vācēju (%s)\n"
diff --git a/nls/mt.po b/nls/mt.po
new file mode 100644 (file)
index 0000000..3af3f5c
--- /dev/null
+++ b/nls/mt.po
@@ -0,0 +1,333 @@
+# Maltese translation for sysstat.
+# This file is distributed under the same license as the sysstat package.
+# NAME OF AUTHOR <michelbugeja@rabatmalta.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat-8.1.7\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2008-11-12 13:38+0100\n"
+"PO-Revision-Date: 2008-11-13 20:16+0100\n"
+"Last-Translator: Michel Bugeja <michelbugeja@rabatmalta.com>\n"
+"Language-Team: Maltese <translation-team-mt@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Maltese\n"
+"X-Poedit-Country: Malta\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat Verżjoni %s\n"
+
+#: ioconf.c:479 iostat.c:509 rd_stats.c:69 rd_stats.c:1791 rd_stats.c:1898
+#: sa_common.c:1033 sadc.c:498 sadc.c:507 sadc.c:567
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ma nistax niftaħ %s: %s\n"
+
+#: iostat.c:80 mpstat.c:83 pidstat.c:77 sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Użu: %s [ opzjonijiet ] [ <interval> [ <count> ] ]\n"
+
+#: iostat.c:83
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Opzjonijiet:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <apparat> [ ... ] | ALL ] [ -p [ <apparat> | ALL ] ]\n"
+
+#: iostat.c:1692
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "opzjonijiet -x u -p huma eskulissivi għal xulxin\n"
+
+#: mpstat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | ALL } ] [ -u ] [ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Opzjonijiet:\n"
+"[ -A ] [ -I { SUM | CPU | ALL } ] [ -u ] [ -P { <cpu> | ALL } ] [ -V ]\n"
+
+#: mpstat.c:433 pidstat.c:1681 sar.c:333
+msgid "Average:"
+msgstr "Medja:"
+
+#: mpstat.c:742
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Mhux daqstant processors!\n"
+
+#: pidstat.c:80
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Opzjonijiet:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:197 sar.c:943
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "L-attivita' rikjesti mhux disponibbli\n"
+
+#: rd_stats.c:1944
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Ma nistax inlaħħaq ma dawn il-processors kollha!\n"
+
+#: sa_common.c:847
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Problema waqt il-qari tal-fajl tal-attivita' tas-sistema: %s\n"
+
+#: sa_common.c:857
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Tmiem tal-fajl tal-attivita' tas-sistema bla mistenni\n"
+
+#: sa_common.c:875
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Fajl maħluq minn sar/sadc minn sysstat verżjoni %d.%d.%d"
+
+#: sa_common.c:906
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Fajl tal-attivita' tas-sistema mhux validu: %s\n"
+
+#: sa_common.c:913
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Il-verżjoni kurrenti ta' sysstat mhux kapaċi taqra aktar format ta' dan il-fajl (%#x)\n"
+
+#: sa_common.c:1116
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Attivitajiet rikjesti mhux disponibbil fil-fajl %s\n"
+
+#: sadc.c:78
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Użu: %s [ opzjonijiet ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+
+#: sadc.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -S { INT | DISK | SNMP | ALL } ] [ -F ] [ -L ] [ -V ]\n"
+msgstr ""
+"Opzjonijiet:\n"
+"[ -C <kumment> ] [ -S { INT | DISK | SNMP | ALL } ] [ -F ] [ -L ] [ -V ]\n"
+
+#: sadc.c:107
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Ma nistax nikteb data fil-fajl tal-attivita' tas-sistema: %s\n"
+
+#: sadc.c:385
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Ma nistax nikteb it-titlu fir-ras tal-fajl tal-attivita' tas-sistema: %s\n"
+
+#: sadc.c:661
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Ma nistax inżid data ġo dak il-fajl (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Użu: %s [ opzjonijiet ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Opzjonijiet:\n"
+"[ -d | -D | -H | -p | -x ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+
+#: sadf.c:527
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Fajl tad-data tal-attivita' tas-sistema: %s (%#x)\n"
+
+#: sadf.c:536
+#, c-format
+msgid "Host: "
+msgstr "Host: "
+
+#: sadf.c:542
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Qis ta' long int: %d\n"
+
+#: sadf.c:544
+#, c-format
+msgid "List of activities:\n"
+msgstr "Lista ta' attivita':\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ] [ -R ]\n"
+"[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Opzjonijiet:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ] [ -R ]\n"
+"[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid ""
+"\n"
+"Main options and reports:\n"
+msgstr ""
+"\n"
+"Opzjonijiet prinċipali u rapporti:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tStatistika fuq I/O u rata ta' transferiment\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tStatistika fuq Paging\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tStatistika fuq block device\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tStatistika fuq Interrupts\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+"\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+"\t\tNetwork statistics\n"
+msgstr ""
+"\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+"\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+"\t\tStatistika fuq Network\n"
+
+#: sar.c:135
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tStatistika fuq Queue length and load average\n"
+
+#: sar.c:136
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tStatistika fuq użu tal-memorja\n"
+
+#: sar.c:137
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tStatistika fuq Memorja\n"
+
+#: sar.c:138
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatistika fuq użu ta' Swap space\n"
+
+#: sar.c:139
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tStatistika fuq użu ta' CPU\n"
+
+#: sar.c:141
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatistika fuq Kernel table\n"
+
+#: sar.c:142
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tStatistika fuq Task creation and system switching\n"
+
+#: sar.c:143
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tStatistika fuq swapping\n"
+
+#: sar.c:144
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tStatistika fuq apparat TTY\n"
+
+#: sar.c:189
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Tmiem ta' ġbir tad-data bla mistenni\n"
+
+#: sar.c:749
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Format tad-data huwa nvalidu\n"
+
+#: sar.c:753
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Nuża data collector ħażin minn verżjoni differenti ta' sysstat\n"
+
+#: sar.c:773
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Data mdaħħla mijhiex konsistenti\n"
+
+#: sar.c:1178
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Opzjoni -f and -o huma esklussivi fil-konfront ta' xulxin\n"
+
+#: sar.c:1184
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Mhux naqra minn fajl ta' attivita tas-sistema (uża opzjoni -f)\n"
+
+#: sar.c:1285
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Ma nistax insib id-data collector (%s)\n"
diff --git a/nls/nb.po b/nls/nb.po
new file mode 100644 (file)
index 0000000..9ea8d4c
--- /dev/null
+++ b/nls/nb.po
@@ -0,0 +1,195 @@
+# NLS support for the sysstat package.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 1999-11-07 23:42\n"
+"Last-Translator: Roy Sigurd Karlsbakk <roy@karlsbakk.net>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versjon %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan ikke åpne %s: %s\n"
+
+#: common.c:199
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Kan ikke håndtere så mange prosessorer!\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Bruk: %s [ valg... ] [ <intervall> [ <antall> ] ]\n"
+"Mulige valg:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <enhet> [ ... ] | ALL ] [ -p [ <enhet> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Tid: %s\n"
+
+#: iostat.c:1435
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "Valgene -x og -p kan ikke brukes samtidig\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Bruk: %s [ valg... ] [ <intervall> [ <antall> ] ]\n"
+"Mulige valg:\n"
+"[ -P { <cpu> | alle } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Gj.snitt:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Ikke så mange prosessorer!\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Bruk: %s [ valg... ] [ <intervall> [ <antall> ] ]\n"
+"Mulige valg:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Forespurt statistikk ikke tilgjengelige\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Feil ved lesing av aktivitetslogg: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Uventet slutt på aktivitetslogg\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Ugyldig aktivitetslogg: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "Forespurt statistikk ikke tilgjengelig i aktivitetslogg\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Bruk: %s [ valg... ] [ <intervall> [ <antall> ] ] [ <utfil> ]\n"
+"Mulige valg:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Kan ikke skrive data til aktivitetslogg: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Kan ikke skrive hode for aktivitetslogg: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "Kan ikke skrive mer data til den filen\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Bruk: %s [ valg... ] [ <intervall> [ <antall> ] ] [ <filnavn> ]\n"
+"Mulige valg:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_valg...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Bruk: %s [ valg... ] [ <intervall> [ <antall> ] ]\n"
+"Mulige valg:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <intervall> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filnavn> ] | -f [ <filnavn> ] ]\n"
+"[ -s [ <tt:mm:ss> ] ] [ -e [ <tt:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Ikke SMP-maskin...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Ugyldig dataformat\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Valgene -f og -o kan ikke brukes samtidig\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Leser ikke fra aktivitetslogg (bruk valget -f)\n"
diff --git a/nls/nl.po b/nls/nl.po
new file mode 100644 (file)
index 0000000..8204390
--- /dev/null
+++ b/nls/nl.po
@@ -0,0 +1,418 @@
+# Dutch translations for sysstat.
+# This file is distributed under the same license as the sysstat package.
+#
+# Bram Schoenmakers <bramschoenmakers@kde.nl>, 2007.
+# Erwin Poeze <erwin.poeze@gmail.com>, 2009, 2010.
+# Benno Schulenberg <benno@vertaalt.nl>, 2008, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat-9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-07-31 15:29+0200\n"
+"Last-Translator: Benno Schulenberg <benno@vertaalt.nl>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.0\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Gebruik:  %s [OPTIE...] [<interval> [<aantal>]]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat-versie %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan %s niet openen: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <apparaat> [...] | ALL ] [ -p [ <apparaat>[,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <apparaat> [...] | ALL ] [ -p [ <apparaat>[,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Kan de schijfgegevens niet vinden\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu>[,...] | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Gemiddeld:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Er zijn niet zoveel processoren!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -C <commando> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid>[,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "De gevraagde activiteiten zijn niet beschikbaar\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Kan niet zoveel processoren bijhouden!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Er is een fout opgetreden bij het uitlezen van het activiteitsbestand: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Onverwacht einde van activiteitsbestand\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Bestand is aangemaakt met 'sar/sadc' door sysstat-versie %d.%d.%d."
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Ongeldig systeemactiviteitsbestand: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Deze versie van sysstat kan de indeling (%#x) van dit bestand niet meer lezen\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "De gevraagde activiteiten zijn niet beschikbaar in bestand %s\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Gebruik:  %s [OPTIE...] [<interval> [<aantal>]] [<uitvoerbestand>]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -C <opmerking> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Kan geen gegevens schrijven naar het activiteitsbestand: %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Kan geen kopregels schrijven naar het activiteitsbestand: %s\n"
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Kan geen gegevens toevoegen aan bestand %s\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Gebruik:  %s [OPTIE...] [<interval> [<aantal>]] [<gegevensbestand>]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <SAR-opties...> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Systeemactiviteitsbestand: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Host: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Lengte van lange integer: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Lijst van activiteiten:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Mogelijke opties zijn:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ALL] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <geheel_getal>[,...] | SUM | ALL | XALL } ] [ -P { <cpu>[,...] | ALL } ]\n"
+"[ -m { <sleutelwoord>[,...] | ALL } ] [ -n { <sleutelwoord>[,...] | ALL } ]\n"
+"[ -o [ <bestandsnaam> ] | -f [ <bestandsnaam> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Hoofdopties en -rapporten:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tStatistieken I/O- en overdrachtsnelheid\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tPaging-statistieken\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tBlokapparaatstatistieken\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterruptstatistieken\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m { <sleutelwoord> [,...] | ALL }\n"
+"\t\tEnergiebeheerstatistieken\n"
+"\t\tMogelijke sleutelwoorden:\n"
+"\t\tCPU\tprocessorklokfrequentie\n"
+"\t\tFAN\tventilatorsnelheid\n"
+"\t\tTEMP\tapparaattemperatuur\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <sleutelwoord> [,...] | ALL }\n"
+"\t\tNetwerkstatistieken\n"
+"\t\tMogelijke sleutelwoorden:\n"
+"\t\tDEV\tnetwerkinterfaces\n"
+"\t\tEDEV\tnetwerkinterfaces (fouten)\n"
+"\t\tNFS\tNFS-cliënt\n"
+"\t\tNFSD\tNFS-server\n"
+"\t\tSOCK\tsockets\t(v4)\n"
+"\t\tIP\tIP-verkeer\t(v4)\n"
+"\t\tEIP\tIP-verkeer\t(v4) (fouten)\n"
+"\t\tICMP\tICMP-verkeer\t(v4)\n"
+"\t\tEICMP\tICMP-verkeer\t(v4) (fouten)\n"
+"\t\tTCP\tTCP-verkeer\t(v4)\n"
+"\t\tETCP\tTCP-verkeer\t(v4) (fouten)\n"
+"\t\tUDP\tUDP-verkeer\t(v4)\n"
+"\t\tSOCK6\tsockets\t(v6)\n"
+"\t\tIP6\tIP-verkeer\t(v6)\n"
+"\t\tEIP6\tIP-verkeer\t(v6) (fouten)\n"
+"\t\tICMP6\tICMP-verkeer\t(v6)\n"
+"\t\tEICMP6\tICMP-verkeer\t(v6) (fouten)\n"
+"\t\tUDP6\tUDP-verkeer\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tStatistieken van wachtrijlengte en gemiddelde belasting\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tGeheugenbenuttingsstatistieken\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tGeheugenstatistieken\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatistieken van swap-ruimtebenutting\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tStatistieken van processorbenutting\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatistieken van kerneltabel\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tStatistieken van taakcreatie en systeemschakeling\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tSwapping-statistieken\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tStatistieken van TTY-apparaat\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Onverwacht einde van verzamelen van gegevens\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Ongeldige gegevensindeling\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Een verkeerde gegevensverzamelaar van een andere sysstat-versie wordt gebruikt\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Inconsistente gegevens gelezen\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Opties '-f' en '-o' gaan niet samen.\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Er wordt geen activiteitsbestand gelezen (gebruik optie '-f')\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Kan de gegevensverzamelaar niet vinden (%s)\n"
+
+#~ msgid "\t-m\tPower management statistics\n"
+#~ msgstr "\t-m\tEnergiebeheerstatistieken\n"
+
+#~ msgid "-x and -p options are mutually exclusive\n"
+#~ msgstr "Opties '-x' en '-p' gaan niet samen.\n"
+
+#~ msgid "Time: %s\n"
+#~ msgstr "Tijd:  %s\n"
diff --git a/nls/nn.po b/nls/nn.po
new file mode 100644 (file)
index 0000000..58837c4
--- /dev/null
+++ b/nls/nn.po
@@ -0,0 +1,195 @@
+# NLS support for the sysstat package.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 1999-11-07 23:42\n"
+"Last-Translator: Roy Sigurd Karlsbakk <roy@karlsbakk.net>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versjon %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan ikkje opna %s: %s\n"
+
+#: common.c:199
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Kan ikkje handtera så mange prosessorar!\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Bruk: %s [ val... ] [ <intervall> [ <antall> ] ]\n"
+"Mogelege val:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <enhet> [ ... ] | ALL ] [ -p [ <enhet> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Tid: %s\n"
+
+#: iostat.c:1435
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "Vala -x og -p kan ikkje brukast samtidig\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Bruk: %s [ val... ] [ <intervall> [ <antall> ] ]\n"
+"Mogelege val:\n"
+"[ -P { <cpu> | alle } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Gj.snitt:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Ikkje så mange prosessorar!\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Bruk: %s [ val... ] [ <intervall> [ <antall> ] ]\n"
+"Mogelege val:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Forspørja statistikk ikkje tilgjengelige\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Feil ved lesing av aktivitetslogg: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Uventa slutt på aktivitetslogg\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Ugyldig aktivitetslogg: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "Forspørja statistikk ikkje tilgjengelig i aktivitetslogg\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Bruk: %s [ val... ] [ <intervall> [ <antall> ] ] [ <utfil> ]\n"
+"Mogelege val:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Kan ikkje skriva data til aktivitetslogg: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Kan ikkje skriva hode for aktivitetslogg: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "Kan ikkje skriva meir data til den fila\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Bruk: %s [ val... ] [ <intervall> [ <antall> ] ] [ <filnavn> ]\n"
+"Mogelege val:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_val...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Bruk: %s [ val... ] [ <intervall> [ <antall> ] ]\n"
+"Mogelege val:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <intervall> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filnavn> ] | -f [ <filnavn> ] ]\n"
+"[ -s [ <tt:mm:ss> ] ] [ -e [ <tt:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Ikkje SMP-maskin...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Ugyldig dataformat\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Vala -f og -o kan ikkje brukast samtidig\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Leser ikkje fra aktivitetslogg (bruk valet -f)\n"
diff --git a/nls/pl.po b/nls/pl.po
new file mode 100644 (file)
index 0000000..eaf3c89
--- /dev/null
+++ b/nls/pl.po
@@ -0,0 +1,371 @@
+# Polish NLS support for the sysstat package.
+# Copyright (C) 1999 Sébastien GODARD <sysstat [at] orange.fr> (msgids).
+# This file is distributed under the same license as the sysstat package.
+# Robert Luberda <robert@debian.org>, 2008 - 2009
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-02-21 11:47+0100\n"
+"PO-Revision-Date: 2010-03-14 19:05+0100\n"
+"Last-Translator: Robert Luberda <robert@debian.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat w wersji %s\n"
+
+#: ioconf.c:490 rd_stats.c:69 rd_stats.c:1842 sa_common.c:1052 sadc.c:589
+#: sadc.c:598 sadc.c:658
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nie można otworzyć %s: %s\n"
+
+#: iostat.c:81 mpstat.c:86 pidstat.c:77 sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Użycie: %s [ opcje ] [ <interwał> [ <liczba> ] ]\n"
+
+#: iostat.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Opcje to:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <urządzenie> [...] | ALL ] [ -p [ <urządzenie> [,...] | ALL ] ]\n"
+
+#: iostat.c:340
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Nie można znaleźć danych o dyskach\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Opcje to:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:504 pidstat.c:1683 sar.c:354
+msgid "Average:"
+msgstr "Średnia:"
+
+#: mpstat.c:847
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Nie ma aż tylu procesorów!\n"
+
+#: pidstat.c:80
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Opcje to:\n"
+"[ -C <polecenie> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:197 sar.c:972
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Żądane statystyki nie są dostępne\n"
+
+#: rd_stats.c:1888
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Zbyt dużo procesorów!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Błąd podczas czytania pliku aktywności systemu: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Niespodziewany koniec pliku aktywności systemu\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Plik utworzony przez sar/sadc z wersji %d.%d.%d pakietu sysstat"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Niepoprawny plik aktywności systemu: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Bieżąca wersja pakietu sysstat nie obsługuje już formatu tego pliku (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Żądane statystyki nie są dostępne w pliku %s\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Użycie: %s [ opcje ] [ <interwał> [ <liczba> ] ] [ <plik_wyjściowy> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Opcje to:\n"
+"[ -C <komentarz> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Nie można zapisać danych do pliku aktywności systemu: %s\n"
+
+#: sadc.c:476
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Nie można zapisać nagłówka pliku aktywności systemu: %s\n"
+
+#: sadc.c:752
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Nie można dopisać danych do tego pliku (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Użycie: %s [ opcje ] [ <interwał> [ <liczba> ] ] [ <plik_danych> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Opcje to:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <opcje_sar> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Plik z danymi o aktywności systemu: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "System: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Rozmiar typu long int: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Lista aktywności:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Opcje to:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <przerwanie> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <słowo_kluczowe> [,...] | ALL } ]\n"
+"[ -o [ <nazwa_pliku> ] | -f [ <nazwa_pliku> ] ]\n"
+"[ -i <interwał> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Główne opcje i raporty:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tStatystyki I/O i prędkości transferu danych\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tStatystyki stronicowania\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tStatystyki urządzeń blokowych\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <przerwanie> | SUM | ALL | XALL }\n"
+"\t\tStatystyki przerwań\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-B\tStatystyki zarządzania energią\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <słowo_kluczowe> [,...] | ALL }\n"
+"\t\tStatystyki sieciowe\n"
+"\t\tSłowa kluczowe to:\n"
+"\t\tDEV\tInterfejsy sieciowe\n"
+"\t\tEDEV\tInterfejsy sieciowe (błędy)\n"
+"\t\tNFS\tKlient NFS\n"
+"\t\tNFSD\tSerwer NFS \n"
+"\t\tSOCK\tSokety\t(v4)\n"
+"\t\tIP\tRuch IP\t(v4)\n"
+"\t\tEIP\tRuch IP\t(v4) (błędy)\n"
+"\t\tICMP\tRuch ICMP\t(v4)\n"
+"\t\tEICMP\tRuch ICMP\t(v4) (błędy)\n"
+"\t\tTCP\tRuch TCP\t(v4)\n"
+"\t\tETCP\tRuch TCP\t(v4) (błędy)\n"
+"\t\tUDP\tRuch UDP\t(v4)\n"
+"\t\tSOCK6\tSokety\t(v6)\n"
+"\t\tIP6\tRuch IP\t(v6)\n"
+"\t\tEIP6\tRuch IP\t(v6) (błędy)\n"
+"\t\tICMP6\tRuch ICMP\t(v6)\n"
+"\t\tEICMP6\tRuch ICMP\t(v6) (błędy)\n"
+"\t\tUDP6\tRuch UDP\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tStatystyki kolejkowania procesów i średniego obciążenia systemu\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tStatystyki wykorzystania pamięci\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tStatystyki pamięci\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tStatystyki wykorzystania przestrzeni wymiany\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tStatystyki wykorzystania procesora\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tStatystyki tabeli jądra\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tStatystyki tworzenia zadań i przełączania systemu\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tStatystyki wymiany\n"
+
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tStatystyki terminali\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Niespodziewany koniec zbieranych danych\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Niepoprawny format danych\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Używany program do zbierania danych pochodzi z innej wersji pakietu sysstat\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Niespójne dane wejściowe\n"
+
+#: sar.c:1207
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Opcje -f i -o się wykluczają\n"
+
+#: sar.c:1213
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Czytanie danych nie z pliku aktywności systemu (proszę użyć opcji -f)\n"
+
+#: sar.c:1314
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Nie można znaleźć programu do zbierania danych (%s)\n"
diff --git a/nls/pt.po b/nls/pt.po
new file mode 100644 (file)
index 0000000..1a329c4
--- /dev/null
+++ b/nls/pt.po
@@ -0,0 +1,195 @@
+# NLS support for the sysstat package.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 1999-05-28 20:27\n"
+"Last-Translator: Frederic L. W. Meunier <linux@olympiquedemarseille.org>\n"
+"Language-Team: Brazilian portuguese <lie-br@conectiva.com.br>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versão %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Impossível abrir %s: %s\n"
+
+#: common.c:199
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Não posso usar tantos processadores!\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Utilização: %s [ opções... ] [ <intervalo> [ <número_de_vezes> ] ]\n"
+"Opções são:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Hora: %s\n"
+
+#: iostat.c:1435
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "As opções -x e -p não podem ser utilizadas juntas\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Utilização: %s [ opções... ] [ <intervalo> [ <número_de_vezes> ] ]\n"
+"Opções são:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Média:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Não tantos processadores!\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Utilização: %s [ opções... ] [ <intervalo> [ <número_de_vezes> ] ]\n"
+"Opções são:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Atividades pedidas não estão disponíveis\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Erro durante a leitura do arquivo de atividade do sistema: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Fim do arquivo de atividade do sistema inesperado\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Arquivo de atividade do sistema inválido: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "Atividades pedidas não foram gravadas no arquivo\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Utilização: %s [ opções... ] [ <intervalo> [ <número_de_vezes> ] ] [ <arquivo> ]\n"
+"Opções são:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Impossível escrever os dados no arquivo de atividade do sistema: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Impossível escrever cabeçalho do arquivo de atividade do sistema: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "Não posso adicionar dados neste arquivo\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Utilização: %s [ opções... ] [ <intervalo> [ <número_de_vezes> ] ] [ <arquivo> ]\n"
+"Opções são:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_opções...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Utilização: %s [ opções... ] [ <intervalo> [ <número_de_vezes> ] ]\n"
+"Possíveis opções:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <intervalo> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <arquivo> ] | -f [ <arquivo> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Não é uma máquina multiprocessadora...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Formato de dados inválido\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "As opções -f e -o não podem ser utilizadas juntas\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Não lendo de um arquivo de atividade do sistema (utilize a opção -f)\n"
diff --git a/nls/pt_BR.po b/nls/pt_BR.po
new file mode 100644 (file)
index 0000000..138392d
--- /dev/null
@@ -0,0 +1,395 @@
+# Brazilian Portuguese translations for sysstat package.
+# Copyright (C) 2010 Free Software Foundation
+# This file is distributed under the same license as the sysstat package.
+# João Victor Duarte Martins <jvdm@sdf.lonestar.org>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.3\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-06-26 09:01+0200\n"
+"PO-Revision-Date: 2010-06-29 12:51-0300\n"
+"Last-Translator: João Victor Duarte Martins <jvdm@sdf.lonestar.org>\n"
+"Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Uso: %s [ opções ] [ <intervalo> [ <contagem> ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versão %s\n"
+
+#: ioconf.c:490 rd_stats.c:69 rd_stats.c:1842 sa_common.c:1052 sadc.c:586
+#: sadc.c:595 sadc.c:655
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Não é possível abrir %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"As opções são:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <dispositivo> [...] | ALL ] [ -p [ <dispositivo> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"As opções são:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <dispositivo> [...] | ALL ] [ -p [ <dispositivo> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Não é possível dados do disco\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"As opções são:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:354
+msgid "Average:"
+msgstr "Média:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Não esse tanto de processadores!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"As opções são:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:972
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "As atividade requisitadas não estão disponíveis\n"
+
+#: rd_stats.c:1888
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Não é possível lidar com tantos processadores!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Erro ao ler o arquivo de atividades do sistema: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Fim inesperado do arquivo de atividades do sistema\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Arquivo criado usando o sar/sadc da versão %d.%d.%d do sysstat"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Arquivo de atividades do sistema inválido: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "A versão atual do sysstat não consegue mais ler o formato deste arquivo (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Atividades requisitadas não estão disponíveis no arquivo %s\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Uso: %s [ opções ] [ <intervalo> [ <contagem> ] ] [ <arq_de_saida> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"As opções são:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Não é possível escrever dados no arquivo de atividades do sistema: %s\n"
+
+#: sadc.c:473
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Não é possível escrever o cabeçalho do arquivo de atividades do sistema: %s\n"
+
+#: sadc.c:749
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Não é possível inserir dados no final deste arquivo (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Uso: %s [ opções ] [ <intervalo> [ <contagem> ] ] [ <arq_de_dados> ]\n"
+
+# TODO verificar o que é <sar_options>
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"As opções são:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Arquivo de dados das atividades do sistema: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Computador: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Tamanho de um 'long int': %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Lista de atividades:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"As opções são:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <arquivo> ] | -f [ <arquivo> ] ]\n"
+"[ -i <intervalo> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Opções principais e relatórios:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tE/S e estatísticas de taxa de transferência\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tEstatísticas de paginação\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tEstatísticas de dispositivos de bloco\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tEstatísticas de Interrupção\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-B\tEstatísticas de gerencia de energia\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <palavra_chave> [,...] | ALL }\n"
+"\t\tEstatísticas de Rede\n"
+"\t\tPalavras chave são:\n"
+"\t\tDEV\tInterfaces de Rede\n"
+"\t\tEDEV\tInterfaces de Rede (erros)\n"
+"\t\tNFS\tCliente NFS\n"
+"\t\tNFSD\tServidor NFS\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tTráfico IP\t(v4)\n"
+"\t\tEIP\tTráfico IP\t(v4) (erros)\n"
+"\t\tICMP\tTráfico ICMP\t(v4)\n"
+"\t\tEICMP\tTráfico ICMP\t(v4) (erros)\n"
+"\t\tTCP\tTráfico TCP\t(v4)\n"
+"\t\tETCP\tTráfico TCP\t(v4) (erros)\n"
+"\t\tUDP\tTráfico UDP\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tTráfico IP\t(v6)\n"
+"\t\tEIP6\tTráfico IP\t(v6) (erros)\n"
+"\t\tICMP6\tTráfico ICMP\t(v6)\n"
+"\t\tEICMP6\tTráfico ICMP\t(v6) (erros)\n"
+"\t\tUDP6\tTráfico UDP\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tTamanho da fila e estatísticas da média de carga\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tEstatísticas de utilização de memória\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tEstatísticas de memória\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tEstatísticas de utilização de espaço de permuta (Swap)\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tEstatística de utilização da UCP\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tEstatísticas da tabela do Núcleo (Kernel)\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tEstatísticas de criação de tarefas e trocas de contexto\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tEstatísticas de Permutação de Memória (Swapping)\n"
+
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tEstatísticas de dispositivos TTY\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Fim inesperado da coleta de dados\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Formato de dados inválido\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Usando um coletador de dados errado de uma versão diferente do sysstat\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Dados de entrada inconsistentes\n"
+
+#: sar.c:1207
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "As opções -f e -o são mutuamente exclusivas\n"
+
+#: sar.c:1213
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Não está sendo lido de um arquivo de atividade do sistema (utilize a opção -f)\n"
+
+#: sar.c:1314
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Não é possível encontrar o coletor de dados (%s)\n"
diff --git a/nls/ro.po b/nls/ro.po
new file mode 100644 (file)
index 0000000..8f7244b
--- /dev/null
+++ b/nls/ro.po
@@ -0,0 +1,195 @@
+# NLS support for the sysstat package.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Eugen Hoanca <eugenh@urban-grafx.ro>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 4.1.2\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 2003-03-12 10:21+0200\n"
+"Last-Translator: Eugen Hoanca <eugenh@urban-grafx.ro>\n"
+"Language-Team: Romanian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat versiunea %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nu se poate deschide %s: %s\n"
+
+#: common.c:199
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Numar prea mare de procesoare!\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Utilizare: %s [ optiuni... ] [ <interval> [ <repetitii> ] ]\n"
+"Optiuni disponibile:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <dispozitiv> [ ... ] | ALL ] [ -p [ <dispozitiv> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Ora:  %s\n"
+
+#: iostat.c:1435
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "Optiunile -x si -p se exclud reciproc\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Utilizare: %s [ optiuni... ] [ <interval> [ <repetitii> ] ]\n"
+"Optiuni disponibile:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Media:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Prea multe procesoare specificate!\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Utilizare: %s [ optiuni... ] [ <interval> [ <repetitii> ] ]\n"
+"Optiuni disponibile:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Statistica solicitata nu este disponibila\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "A aparut o eroare la citirea fisierului de activitate al sistemului: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Sfarsit neasteptat al fisierului de activitate al sistemului\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Fisier de activitate a sistemului invalid: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "Activitatile solicitate nu se regasesc in fisier\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Utilizare: %s [ optiuni... ] [ <interval> [ <repetitii> ] ] [ <fisier> ]\n"
+"Optiuni disponibile:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Nu se poate scrie in fisierul de activitate sistem: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Nu se poate scrie headerul fisierului de activitate sistem: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "Nu se pot adauga date in acel fisier\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Utilizare: %s [ optiuni... ] [ <interval> [ <repetitii> ] ] [ <fisier> ]\n"
+"Optiuni disponibile:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_optiuni...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Utilizare: %s [ optiuni... ] [ <interval> [ <repetitii> ] ]\n"
+"Optiuni disponibile:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <intervallo> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <file> ] | -f [ <file> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Nu este sistem multiprocesor...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Format invalid de data\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Optiunile -f si -o se exclud reciproc\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Nu se citeste dintr-un fisier activitate sistem (utilizati -f)\n"
diff --git a/nls/ru.po b/nls/ru.po
new file mode 100644 (file)
index 0000000..9b9e41a
--- /dev/null
+++ b/nls/ru.po
@@ -0,0 +1,414 @@
+# translation of sysstat-9.1.4.ru.po to Russian
+# NLS support for the sysstat package.
+# Copyright (C) 1999, 2009, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the sysstat package.
+#
+# SИbastien GODARD <sysstat [at] orange.fr>, 1999.
+# Dennis Selsky <selsky@densky.pp.ru>, 2002.
+# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.4\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-07-24 10:55+0200\n"
+"PO-Revision-Date: 2010-07-31 08:41+0400\n"
+"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
+"Language-Team: Russian <gnu@mx.ru>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Использование: %s [ параметры ] [ <интервал> [ <счётчик> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat, версия %s\n"
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Не удалось открыть %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <устр-во> [...] | ALL ] [ -p [ <устр-во> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <устр-во> [...] | ALL ] [ -p [ <устр-во> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Не удалось найти данные диска\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <ЦП> [,...] | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:530 pidstat.c:1806 sar.c:359
+msgid "Average:"
+msgstr "Среднее:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Нет такого количества процессоров в системе!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -C <команда> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:977
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Запрошенный показатель недоступен\n"
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Невозможно обработать так много процессоров!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Ошибка чтения файла системных показателей: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Неожиданный конец файла системных показателей\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Файл создан с помощью sar/sadc из sysstat версии %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Неправильный файл системных показателей: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Текущая версия sysstat больше не поддерживает формат этого файла (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Запрашиваемые показатели из файла %s недоступны\n"
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Использование: %s [ параметры ] [ <интервал> [ <счётчик> ] ] [ <вых_файл> ]\n"
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -C <комм.> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Не удалось записать данные в файл системных показателей: %s\n"
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Не удалось записать заголовок в файл системных показателей: %s\n"
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Не удалось добавить данные в этот файл (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Использование: %s [ параметры ] [ <интервал> [ <счётчик> ] ] [ <файл_данных> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <ЦП> [,...] | ALL } ] [ -s [ <чч:мм:сс> ] ] [ -e [ <чч:мм:сс> ] ]\n"
+"[ -- <sar_параметры> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Неправильный файл системных показателей: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Хост: "
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Размер long int: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Список показателей:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Параметры:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <целое> [,...] | SUM | ALL | XALL } ] [ -P { <ЦП> [,...] | ALL } ]\n"
+"[ -m { <ключ_слово> [,...] | ALL } ] [ -n { <ключ_слово> [,...] | ALL } ]\n"
+"[ -o [ <имя_файла> ] | -f [ <имя_файла> ] ]\n"
+"[ -i <интервалl> ] [ -s [ <чч:мм:сс> ] ] [ -e [ <чч:мм:сс> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Основные параметры и отчёты:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tСтатистика по ВВ/ВЫВ и скорости передачи\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tСтатистика по обмену страниц\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tСтатистика по блочным устройствам\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <целое> | SUM | ALL | XALL }\n"
+"\t\tСтатистика по прерываниям\n"
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+"\t-m { <ключ_слово> [,...] | ALL }\n"
+"\t\tСтатистика управления питанием\n"
+"\t\tКлючевые слова:\n"
+"\t\tCPU\tчастота работы ЦП\n"
+"\t\tFAN\tскорость вращения вентиляторов\n"
+"\t\tTEMP\tтемпература устройств\n"
+
+#: sar.c:138
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <ключ_слово> [,...] | ALL }\n"
+"\t\tСетевая статистика\n"
+"\t\tКлючевые слова:\n"
+"\t\tDEV\tСетевые интерфейсы\n"
+"\t\tEDEV\tСетевые интерфейсы (ошибки)\n"
+"\t\tNFS\tКлиент NFS\n"
+"\t\tNFSD\tСервер NFS\n"
+"\t\tSOCK\tСокеты\t(v4)\n"
+"\t\tIP\tIP трафик\t(v4)\n"
+"\t\tEIP\tIP трафик\t(v4) (errors)\n"
+"\t\tICMP\tICMP трафик\t(v4)\n"
+"\t\tEICMP\tICMP трафик\t(v4) (errors)\n"
+"\t\tTCP\tTCP трафик\t(v4)\n"
+"\t\tETCP\tTCP трафик\t(v4) (errors)\n"
+"\t\tUDP\tUDP трафик\t(v4)\n"
+"\t\tSOCK6\tСокеты\t(v6)\n"
+"\t\tIP6\tIP трафик\t(v6)\n"
+"\t\tEIP6\tIP трафик\t(v6) (errors)\n"
+"\t\tICMP6\tICMP трафик\t(v6)\n"
+"\t\tEICMP6\tICMP трафик\t(v6) (errors)\n"
+"\t\tUDP6\tUDP трафик\t(v6)\n"
+
+#: sar.c:159
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tСтатистика по длине и средней загрузке очереди\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tСтатистика по использованию памяти\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tСтатистика по памяти\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tСтатистика по использованию области подкачки\n"
+
+#: sar.c:163
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tСтатистика по использованию ЦП\n"
+
+#: sar.c:165
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tСтатистика по таблице ядра\n"
+
+#: sar.c:166
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tСтатистика по созданию задач и системным переключениям\n"
+
+#: sar.c:167
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tСтатистика по подкачке\n"
+
+#: sar.c:168
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tСтатистика по устройствам TTY\n"
+
+#: sar.c:211
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Неожиданно закончились собираемые данные\n"
+
+#: sar.c:779
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Неправильный формат данных\n"
+
+#: sar.c:783
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Используется ошибочное средство сбора данных от другой версии sysstat\n"
+
+#: sar.c:803
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Несогласованные входные данные\n"
+
+#: sar.c:1224
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Параметры -f и -o являются взаимоисключающими\n"
+
+#: sar.c:1230
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Не выполняем чтение из файла системных показателей (используйте параметр -f)\n"
+
+#: sar.c:1331
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Не удалось найти средство сбора данных (%s)\n"
+
+#~ msgid "\t-m\tPower management statistics\n"
+#~ msgstr "\t-B\tСтатистика по управлению питанием\n"
diff --git a/nls/sk.po b/nls/sk.po
new file mode 100644 (file)
index 0000000..c1c9f43
--- /dev/null
+++ b/nls/sk.po
@@ -0,0 +1,195 @@
+# NLS support for the sysstat package.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Sébastien GODARD <sysstat [at] orange.fr>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 4.1.3\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2007-12-19 14:02+0100\n"
+"PO-Revision-Date: 2003-05-17 19:30\n"
+"Last-Translator: Miroslav David <md20128@decef.elf.stuba.sk>\n"
+"Language-Team: Slovak\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat verzia %s\n"
+
+#: common.c:160 common.c:385 ioconf.c:459 mpstat.c:265 sa_common.c:601
+#: sadc.c:476 sadc.c:485 sadc.c:530 sadc.c:620
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nie je mo¾né otvori» %s: %s\n"
+
+#: common.c:199
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Nie je mo¾né obslú¾i» toµko procesorov!\n"
+
+#: iostat.c:74
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"Pou¾itie: %s [ voµby... ] [ <interval> [ <poèet> ] ]\n"
+"Mo¾né voµby:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <zariadenie> [ ... ] | ALL ] [ -p [ <zariadenie> | ALL ] ]\n"
+
+#: iostat.c:1119
+#, c-format
+msgid "Time: %s\n"
+msgstr "Èas: %s\n"
+
+#: iostat.c:1435
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "Voµby -x a -p sa navzájom vyluèujú\n"
+
+#: mpstat.c:66
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"Pou¾itie: %s [ voµby... ] [ <interval> [ <poèet> ] ]\n"
+"Mo¾né voµby:\n"
+"[ -P { <cpu> | ALL } ] [ -V ]\n"
+
+# sar.c:
+#: mpstat.c:226 pidstat.c:1148 sar.c:740
+msgid "Average:"
+msgstr "Priemer:"
+
+#: mpstat.c:563 sar.c:157
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Nie a¾ tak veµa procesorov!\n"
+
+#: pidstat.c:72
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Pou¾itie: %s [ voµby... ] [ <interval> [ <poèet> ] ]\n"
+"Mo¾né voµby:\n"
+"[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:166 sar.c:1419
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "®iadané ¹tatistiky nie sú dostupné\n"
+
+#: sa_common.c:572
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Chyba poèas èítania súboru aktivity systému: %s\n"
+
+#: sa_common.c:581
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Neoèakávaný koniec súboru aktivity systému\n"
+
+#: sa_common.c:608 sadc.c:549
+#, c-format
+msgid "Invalid system activity file: %s (%#x)\n"
+msgstr "Nesprávny súbor aktivity systému: %s (%#x)\n"
+
+#: sa_common.c:632
+#, c-format
+msgid "Requested activities not available in file\n"
+msgstr "®iadané ¹tatistiky nie sú dostupné v súbore\n"
+
+#: sadc.c:83
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+"Options are:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+msgstr ""
+"Pou¾itie: %s [ voµby... ] [ <interval> [ <poèet> ] ] [ <výstupný_súbor> ]\n"
+"Mo¾né voµby:\n"
+"[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#: sadc.c:110
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Nie je mo¾né zapísa» údaje do súboru aktivity systému: %s\n"
+
+#: sadc.c:361
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Nie je mo¾né zapísa» hlavièku súboru aktivity systému: %s\n"
+
+#: sadc.c:568
+#, c-format
+msgid "Cannot append data to that file\n"
+msgstr "Nie je mo¾né dopísa» údaje do toho súboru\n"
+
+#: sadf.c:78
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"Pou¾itie: %s [ voµby... ] [ <interval> [ <poèet> ] ] [ <súbor> ]\n"
+"Mo¾né voµby:\n"
+"[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_voµby...> ]\n"
+
+#: sar.c:76
+#, c-format
+msgid ""
+"Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Pou¾itie: %s [ voµby... ] [ <interval> [ <poèet> ] ]\n"
+"Mo¾né voµby:\n"
+"[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+"[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <súbor> ] | -f [ <súbor> ] ]\n"
+"[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:149
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Poèítaè nie je multiprocesorový...\n"
+
+#: sar.c:1261
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Nesprávny formát údajov\n"
+
+#: sar.c:1633
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Voµby -f a -o sa navzájom vyluèujú\n"
+
+#: sar.c:1639
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Nie je èítané zo súboru aktivity systému (pou¾i voµbu -f)\n"
diff --git a/nls/sv.po b/nls/sv.po
new file mode 100644 (file)
index 0000000..51dcb68
--- /dev/null
+++ b/nls/sv.po
@@ -0,0 +1,310 @@
+# Swedish translation of the sysstat package.
+# Copyright (C) 1999, 2006, 2008 Free Software Foundation, Inc.
+# Daniel Nylander <po@danielnylander.se>, 2006, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 8.1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2008-02-09 18:30+0100\n"
+"PO-Revision-Date: 2008-02-10 18:30+0100\n"
+"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: common.c:58
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat version %s\n"
+
+#: common.c:197 common.c:449 ioconf.c:471 mpstat.c:324 sa_common.c:810
+#: sadc.c:590 sadc.c:599 sadc.c:660 sadc.c:761
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan inte öppna %s: %s\n"
+
+#: common.c:241
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Kan inte hantera så många processorer!\n"
+
+#: iostat.c:78 mpstat.c:71 pidstat.c:77 sadc.c:81 sadf.c:81 sar.c:79
+msgid "Usage:"
+msgstr "Användning:"
+
+#: iostat.c:78 mpstat.c:71 pidstat.c:77 sadc.c:81 sadf.c:81 sar.c:79
+msgid "options..."
+msgstr "flaggor..."
+
+#: iostat.c:78 mpstat.c:72 pidstat.c:77 sadc.c:81 sadf.c:81 sar.c:79 sar.c:89
+msgid "interval"
+msgstr "intervall"
+
+#: iostat.c:78 mpstat.c:72 pidstat.c:77 sadc.c:81 sadf.c:82 sar.c:79
+msgid "count"
+msgstr "antal"
+
+#: iostat.c:80 mpstat.c:74 pidstat.c:79 sadc.c:83 sadf.c:84 sar.c:81
+#, c-format
+msgid "Options are:\n"
+msgstr "Flaggor är:\n"
+
+#: iostat.c:84
+msgid "device"
+msgstr "enhet"
+
+#: iostat.c:1245
+#, c-format
+msgid "Time: %s\n"
+msgstr "Tid: %s\n"
+
+#: iostat.c:1575
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "flaggorna -x och -p är ömsesidigt uteslutande\n"
+
+#: mpstat.c:77 sadf.c:89 sar.c:89
+msgid "cpu"
+msgstr "processor"
+
+# sar.c:
+#: mpstat.c:279 pidstat.c:1364 sar.c:962
+msgid "Average:"
+msgstr "Genomsnitt:"
+
+#: mpstat.c:630 sar.c:169
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Inte så många processorer!\n"
+
+#: pidstat.c:83
+msgid "command"
+msgstr "kommando"
+
+#: pidstat.c:177 sar.c:1717
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Begärda aktiviteter är inte tillgängliga\n"
+
+#: sa_common.c:708
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Fel vid inläsning av systemaktivitetsfil: %s\n"
+
+#: sa_common.c:718
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Oväntat slut på systemaktivitetsfil\n"
+
+#: sa_common.c:736
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Fil skapad med sar/sadc från sysstat version %d.%d.%d"
+
+#: sa_common.c:766
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Ogiltig systemaktivitetsfil: %s\n"
+
+#: sa_common.c:773
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Aktuell version av sysstat kan inte längre läsa formatet på denna fil (%#x)\n"
+
+#: sa_common.c:853
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Begärda aktiviteter inte tillgängliga i filen %s\n"
+
+#: sadc.c:81
+msgid "outfile"
+msgstr "utfil"
+
+#: sadc.c:86
+msgid "comment"
+msgstr "kommentar"
+
+#: sadc.c:111
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Kan inte skriva data till systemaktivitetsfil: %s\n"
+
+#: sadc.c:445
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Kan inte skriva systemaktivitetsfilhuvud: %s\n"
+
+#: sadc.c:706
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Kan inte lägga till data till den filen (%s)\n"
+
+#: sadf.c:82
+msgid "datafile"
+msgstr "datafil"
+
+#: sadf.c:89 sar.c:90
+msgid "hh:mm:ss"
+msgstr "hh:mm:ss"
+
+#: sadf.c:89
+msgid "sar_options..."
+msgstr "sar_flaggor..."
+
+#: sadf.c:1767
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Systemaktivitetsfil: %s (%#x)\n"
+
+#: sadf.c:1775
+#, c-format
+msgid "Host: "
+msgstr "Värd: "
+
+#: sadf.c:1780
+#, c-format
+msgid "Activity flag: %#x\n"
+msgstr "Aktivitetsflagga: %#x\n"
+
+#: sadf.c:1781
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Storlek på en lång int: %d\n"
+
+#: sadf.c:1782
+#, c-format
+msgid "Number of CPU: %u\n"
+msgstr "Antal processorer: %u\n"
+
+#: sadf.c:1783
+#, c-format
+msgid "Number of interrupts per CPU: %u\n"
+msgstr "Antal avbrott per processor: %u\n"
+
+#: sadf.c:1784
+#, c-format
+msgid "Number of disks: %u\n"
+msgstr "Antal diskar: %u\n"
+
+# Osäker
+#: sadf.c:1785
+#, c-format
+msgid "Number of serial lines: %u\n"
+msgstr "Antal serieterminaler: %u\n"
+
+#: sadf.c:1786
+#, c-format
+msgid "Number of network interfaces: %u\n"
+msgstr "Antal nätverksgränssnitt: %u\n"
+
+#: sar.c:89
+msgid "int"
+msgstr "int"
+
+#: sar.c:89
+msgid "filename"
+msgstr "filnamn"
+
+#: sar.c:161
+#, c-format
+msgid "Not an SMP machine...\n"
+msgstr "Inte en flerprocessorsmaskin...\n"
+
+#: sar.c:1545
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Ogiltigt dataformat\n"
+
+#: sar.c:1549
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Använder fel datainsamlare från en annan version av sysstat\n"
+
+#: sar.c:1932
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "flaggorna -f och -o är ömsesidigt uteslutande\n"
+
+#: sar.c:1938
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Läser inte från en systemaktivitetsfil (använd flaggan -f)\n"
+
+#: sar.c:2036
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Kan inte hitta datainsamlaren (%s)\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+#~ "Options are:\n"
+#~ "[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+#~ "[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+#~ msgstr ""
+#~ "Användning: %s [ flaggor... ] [ <intervall> [ <antal> ] ]\n"
+#~ "Flaggor:\n"
+#~ "[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+#~ "[ <enhet> [ ... ] | ALL ] [ -p [ <enhet> | ALL ] ]\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+#~ "Options are:\n"
+#~ "[ -P { <cpu> | ALL } ] [ -V ]\n"
+#~ msgstr ""
+#~ "Användning: %s [ flaggor... ] [ <intervall> [ <antal> ] ]\n"
+#~ "Flaggor:\n"
+#~ "[ -P { <processor> | ALL } ] [ -V ]\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+#~ "Options are:\n"
+#~ "[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+#~ "[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+#~ msgstr ""
+#~ "Användning: %s [ flaggor... ] [ <intervall> [ <antal> ] ]\n"
+#~ "Flaggor:\n"
+#~ "[ -C <comm> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+#~ "[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+#~ "Options are:\n"
+#~ "[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+#~ msgstr ""
+#~ "Användning: %s [ flaggor... ] [ <intervall> [ <antal> ] ] [ <utfil> ]\n"
+#~ "Flaggor:\n"
+#~ "[ -C <comment> ] [ -d ] [ -F ] [ -I ] [ -V ]\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+#~ "Options are:\n"
+#~ "[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+#~ "[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+#~ "[ -- <sar_options...> ]\n"
+#~ msgstr ""
+#~ "Användning: %s [ flaggor... ] [ <intervall> [ <antal> ] ] [ <datafil> ]\n"
+#~ "Flaggor:\n"
+#~ "[ -d | -D | -H | -p | -x ] [ -t ] [ -V ]\n"
+#~ "[ -P { <processor> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+#~ "[ -- <sar_flaggor...> ]\n"
+
+#~ msgid ""
+#~ "Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
+#~ "Options are:\n"
+#~ "[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <interval> ] [ -p ] [ -q ]\n"
+#~ "[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+#~ "[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+#~ "[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+#~ "[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+#~ "[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+#~ msgstr ""
+#~ "Användning: %s [ flaggor... ] [ <intervall> [ <antal> ] ]\n"
+#~ "Flaggor:\n"
+#~ "[ -A ] [ -b ] [ -B ] [ -c ] [ -C ] [ -d ] [ -i <intervall> ] [ -p ] [ -q ]\n"
+#~ "[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+#~ "[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <processor> | ALL } ]\n"
+#~ "[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+#~ "[ -o [ <filnamn> ] | -f [ <filnamn> ] ]\n"
+#~ "[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
diff --git a/nls/sysstat.pot b/nls/sysstat.pot
new file mode 100644 (file)
index 0000000..59ec887
--- /dev/null
@@ -0,0 +1,350 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-09-04 08:21+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr ""
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr ""
+
+#: ioconf.c:490 rd_stats.c:72 rd_stats.c:1831 sa_common.c:1052 sadc.c:593
+#: sadc.c:602 sadc.c:662
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr ""
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr ""
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | "
+"ALL } ] [ -V ]\n"
+msgstr ""
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:360
+msgid "Average:"
+msgstr ""
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr ""
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+
+#: pidstat.c:199 sar.c:978
+#, c-format
+msgid "Requested activities not available\n"
+msgstr ""
+
+#: rd_stats.c:1877
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr ""
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr ""
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr ""
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr ""
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr ""
+
+#: sa_common.c:932
+#, c-format
+msgid ""
+"Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr ""
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr ""
+
+#: sadc.c:81
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr ""
+
+#: sadc.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+
+#: sadc.c:206
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr ""
+
+#: sadc.c:480
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr ""
+
+#: sadc.c:756
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr ""
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr ""
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr ""
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr ""
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr ""
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr ""
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr ""
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr ""
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr ""
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr ""
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+
+#: sar.c:132
+#, c-format
+msgid ""
+"\t-m { <keyword> [,...] | ALL }\n"
+"\t\tPower management statistics\n"
+"\t\tKeywords are:\n"
+"\t\tCPU\tCPU clock frequency\n"
+"\t\tFAN\tFans speed\n"
+"\t\tIN\tVoltage inputs\n"
+"\t\tTEMP\tDevices temperature\n"
+msgstr ""
+
+#: sar.c:139
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+
+#: sar.c:160
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr ""
+
+#: sar.c:161
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr ""
+
+#: sar.c:162
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr ""
+
+#: sar.c:163
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr ""
+
+#: sar.c:164
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+
+#: sar.c:166
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr ""
+
+#: sar.c:167
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr ""
+
+#: sar.c:168
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr ""
+
+#: sar.c:169
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr ""
+
+#: sar.c:212
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr ""
+
+#: sar.c:780
+#, c-format
+msgid "Invalid data format\n"
+msgstr ""
+
+#: sar.c:784
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr ""
+
+#: sar.c:804
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr ""
+
+#: sar.c:1225
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr ""
+
+#: sar.c:1231
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr ""
+
+#: sar.c:1332
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr ""
diff --git a/nls/vi.po b/nls/vi.po
new file mode 100644 (file)
index 0000000..4ba00d5
--- /dev/null
+++ b/nls/vi.po
@@ -0,0 +1,410 @@
+# Vietnamese translation for Sys Stat.
+# Copyright © 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the sysstat package.
+# Clytie Siddall <clytie@riverland.net.au>, 2007-2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.1\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-02-21 11:47+0100\n"
+"PO-Revision-Date: 2010-03-06 19:48+0930\n"
+"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
+"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: LocFactoryEditor 1.8\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat phiên bản %s\n"
+
+#: ioconf.c:490 rd_stats.c:69 rd_stats.c:1842 sa_common.c:1052 sadc.c:589
+#: sadc.c:598 sadc.c:658
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Không thể mở %s: %s\n"
+
+#: iostat.c:81 mpstat.c:86 pidstat.c:77 sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "Sử dụng: %s [ tùy_chọn... ] [ <khoảng> [ <đếm> ] ]\n"
+
+#: iostat.c:84
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"Tùy chọn:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <thiết_bị> [ ... ] | ALL ] [ -p [ <thiết_bị> [,...] | ALL ] ]\n"
+"\n"
+"ALL\ttất cả\n"
+
+#: iostat.c:340
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "Không tìm thấy dữ liệu về đĩa\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"Tùy chọn:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+"\n"
+"SUM\ttổng\n"
+"CPU, cpu\tđơn vị xử lý trung tâm\n"
+"ALL\ttất cả\n"
+
+#: mpstat.c:504 pidstat.c:1683 sar.c:354
+msgid "Average:"
+msgstr "Trung bình:"
+
+#: mpstat.c:847
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "Quá nhiều bộ xử lý !\n"
+
+#: pidstat.c:80
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"Tùy chọn:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+"\n"
+"SELF\t\tmình\n"
+"ALL\t\ttất cả\n"
+"TASK\tcông việc\n"
+"CHILD\tcon\n"
+
+#: pidstat.c:197 sar.c:972
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "Hoạt động yêu cầu vẫn không sẵn sàng\n"
+
+#: rd_stats.c:1888
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "Quá nhiều bộ xử lý để xử lý !\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "Gặp lỗi khi đọc tập tin hoạt động hệ thống: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "Gặp kết thúc bất thường trong tập tin hoạt động hệ thống\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "Tập tin được tạo dùng sar/sadc từ sysstat phiên bản %d.%d.%d"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "Tập tin hoạt động hệ thống không hợp lệ: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "Phiên bản sysstat hiện thời không còn có khả năng đọc lại định dạng của tập tin này (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "Hoạt động đã yêu cầu vẫn không sẵn sàng trong tập tin %s\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "Sử dụng: %s [ tùy_chọn... ] [ <khoảng> [ <đếm> ] ] [ <tập_tin_kết_xuất> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"Tuỳ chọn:\n"
+"[ -C <ghi_chú> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+"\n"
+"DISK\tđĩa\n"
+"POWER\tđiện năng\n"
+"ALL\t\ttất cả\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "Không thể ghi dữ liệu vào tập tin hoạt động hệ thống: %s\n"
+
+#: sadc.c:476
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "Không thể ghi phần đầu tập tin hoạt động hệ thống: %s\n"
+
+#: sadc.c:752
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "Không thể phụ thêm dữ liệu vào tập tin đó (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "Sử dụng: %s [ tùy_chọn... ] [ <khoảng> [ <đếm> ] ] [ <tập_tin_dữ_liệu> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"Tùy chọn:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <gi:ph:gy> ] ] [ -e [ <gi:ph:gy> ] ]\n"
+"[ -- <tùy_chọn_sar...> ]\n"
+"\n"
+"ALL\ttất cả\n"
+"gi:ph:gy\t\tgiờ:phút:giây (hai chữ số)\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "Tập tin dữ liệu hoạt động hệ thống: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "Máy:"
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "Kích cỡ của một số nguyên dài: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "Danh sách các hoạt động:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"Tùy chọn:\n"
+" -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <từ_khoá> [,...] | ALL } ]\n"
+"[ -o [ <tên_tập_tin> ] | -f [ <tên_tập_tin> ] ]\n"
+"[ -i <khoảng> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"n\n"
+"ALL\ttất cả\n"
+"int\tsố nguyên (viết tắt)\n"
+"SUM\ttổng\n"
+"XALL\tkhông phải tất cả\n"
+"cpu\tđơn vị xử lý trung tâm\n"
+"DEV\tthiết bị (viết tắt)\n"
+"SOCK\tổ cắm (viết tắt)\n"
+"hh:mm:ss\tgiờ:phút:giây (mỗi phần có hai chữ số)\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "Tùy chọn và thông báo chính:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O và thống kê tỷ lệ truyền\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\tthống kê dàn trang\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\tthống kê thiết bị khối\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\thống kê gián đoạn\n"
+"\n"
+"int\tsố nguyên\n"
+"SUM\ttổng\n"
+"ALL\ttất cả\n"
+"XALL\tkhông phải tất cả\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-m\tthống kê quản lý điện năng\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <từ_khoá> [,...] | ALL }\n"
+"\n"
+"[ALL\ttất cả]\n"
+"\n"
+"\t\tThống kê chạy mạng\n"
+"\n"
+"\t\tTừ khoá:\n"
+"\t\tDEV\tCác giao diện mạng\n"
+"\t\tEDEV\tCác giao diện mạng (lỗi)\n"
+"\t\tNFS\tỨng dụng khách NFS\n"
+"\t\tNFSD\tTrình phục vụ NFS\n"
+"\t\tSOCK\tCác ổ cắm\t(v4)\n"
+"\t\tIP\tTrọng tải IP\t(v4)\n"
+"\t\tEIP\tTrọng tải IP\t(v4) (lỗi)\n"
+"\t\tICMP\tTrọng tải ICMP\t(v4)\n"
+"\t\tEICMP\tTrọng tải ICMP\t(v4) (lỗi)\n"
+"\t\tTCP\tTrọng tải TCP\t(v4)\n"
+"\t\tETCP\tTrọng tải TCP\t(v4) (lỗi)\n"
+"\t\tUDP\tTrọng tải UDP\t(v4)\n"
+"\t\tSOCK6\tCác ổ cắm\t(v6)\n"
+"\t\tIP6\tTrọng tải IP\t(v6)\n"
+"\t\tEIP6\tTrọng tải IP\t(v6) (lỗi)\n"
+"\t\tICMP6\tTrọng tải ICMP\t(v6)\n"
+"\t\tEICMP6\tTrọng tải ICMP\t(v6) (lỗi)\n"
+"\t\tUDP6\tTrọng tải UDP\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\tthống kê về chiều dài hàng đợi và tải trọng trung bình\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\tthống kê sử dụng bộ nhớ\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\tthống kê bộ nhớ\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\tthống kê vùng trao đổi\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tthống kê sử dụng CPU\n"
+"\n"
+"ALL\ttất cả\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tthống kê bảng hạt nhân\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\tthống kê về tạo công việc và chuyển đổi hệ thống\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\tthống kê trao đổi\n"
+
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tthống kê thiết bị TTY\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "Kết thúc bất thường khi thu thập dữ liệu\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "Định dạng dữ liệu không hợp lệ\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "Dùng một bộ thu thập không đúng từ một phiên bản sysstat khác\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "Dữ liệu nhập vào không phải thống nhất\n"
+
+#: sar.c:1207
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "Hai tùy chọn « -f » và « -o » loại từ lẫn nhau\n"
+
+#: sar.c:1213
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "Không phải đọc từ tập tin hoạt động hệ thống (dùng tùy chọn « -f »)\n"
+
+#: sar.c:1314
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "Không tìm thấy bộ thu thập dữ liệu (%s)\n"
diff --git a/nls/zh_CN.po b/nls/zh_CN.po
new file mode 100644 (file)
index 0000000..6722c34
--- /dev/null
@@ -0,0 +1,472 @@
+# Chinese translations for sysstat package
+# sysstat 软件包的简体中文翻译.
+# Copyright (C) 2010 THE sysstat'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the sysstat package.
+# Ji ZhengYu <zhengyuji@gmail.com>, 2008, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 9.1.3\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2010-06-26 09:01+0200\n"
+"PO-Revision-Date: 2010-07-06 15:22+0800\n"
+"Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n"
+"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cifsiostat.c:69 iostat.c:79 mpstat.c:86 nfsiostat.c:68 pidstat.c:78
+#: sar.c:88
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "用法: %s [ 选项 ] [ <时间间隔> [ <次数> ] ]\n"
+
+#: cifsiostat.c:72 nfsiostat.c:71
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+msgstr ""
+"选项:\n"
+"[ -h ] [ -k | -m ] [ -t ] [ -V ]\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat 版本 %s\n"
+
+#: ioconf.c:490 rd_stats.c:69 rd_stats.c:1842 sa_common.c:1052 sadc.c:586
+#: sadc.c:595 sadc.c:655
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "无法打开 %s: %s\n"
+
+#: iostat.c:82
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ] [ --debuginfo ]\n"
+msgstr ""
+"选项:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <设备> [...] | ALL ] [ -p [ <设备> [,...] | ALL ] ] [ --debuginfo ]\n"
+
+#: iostat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]\n"
+msgstr ""
+"选项:\n"
+"[ -c ] [ -d ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ]\n"
+"[ <设备> [...] | ALL ] [ -p [ <设备> [,...] | ALL ] ]\n"
+
+#: iostat.c:312
+#, c-format
+msgid "Cannot find disk data\n"
+msgstr "无法找到磁盘数据\n"
+
+#: mpstat.c:89
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+msgstr ""
+"选项:\n"
+"[ -A ] [ -I { SUM | CPU | SCPU | ALL } ] [ -u ] [ -P { <cpu> [,...] | ALL } ] [ -V ]\n"
+
+#: mpstat.c:530 pidstat.c:1806 sar.c:354
+msgid "Average:"
+msgstr "平均时间:"
+
+#: mpstat.c:873
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "处理器实在太多!\n"
+
+#: pidstat.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"选项:\n"
+"[ -C <命令> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+"[ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <进程号> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:199 sar.c:972
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "所需的运行记录无法获得\n"
+
+#: rd_stats.c:1888
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "处理器太多,无法处理!\n"
+
+#: sa_common.c:866
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "查看系统运行记录时出错: %s\n"
+
+#: sa_common.c:876
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "系统运行记录文件的结尾有未知错误\n"
+
+#: sa_common.c:894
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "文件由 sysstat %d.%d.%d 中的 sar/sadc 创建。"
+
+#: sa_common.c:925
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "无效的系统运行记录文件: %s\n"
+
+#: sa_common.c:932
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "当前版本的 sysstat 已无法读取此文件格式 (%#x)\n"
+
+#: sa_common.c:1135
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "所需的运行记录在此文件 %s 中无法获得\n"
+
+#: sadc.c:76
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "用法: %s [ 选项 ] [ <时间间隔> [ <次数> ] ] [ <输出文件> ]\n"
+
+#: sadc.c:79
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+msgstr ""
+"选项:\n"
+"[ -C <注释> ] [ -F ] [ -L ] [ -V ]\n"
+"[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"
+
+#: sadc.c:199
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "无法将数据写入系统运行记录文件: %s\n"
+
+#: sadc.c:473
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "无法写系统运行记录文件开始部分: %s\n"
+
+#: sadc.c:749
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "无法向文件 (%s) 中追加记录\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "用法: %s [ 选项 ] [ <时间间隔> [ <次数> ] ] [ <数据文件> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options> ]\n"
+msgstr ""
+"选项:\n"
+"[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> [,...] | ALL } ] [ -s [ <时:分:秒> ] ] [ -e [ <时:分:秒> ] ]\n"
+"[ -- <sar 选项> ]\n"
+
+#: sadf.c:609
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "系统运行记录数据文件: %s (%#x)\n"
+
+#: sadf.c:618
+#, c-format
+msgid "Host: "
+msgstr "主机:"
+
+#: sadf.c:624
+#, c-format
+msgid "Size of a long int: %d\n"
+msgstr "长整型数的字节大小: %d\n"
+
+#: sadf.c:626
+#, c-format
+msgid "List of activities:\n"
+msgstr "运行记录列表:\n"
+
+#: sar.c:104
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <keyword> [,...] | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"选项:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ]\n"
+"[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <中断> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+"[ -n { <关键词> [,...] | ALL } ]\n"
+"[ -o [ <文件名> ] | -f [ <文件名> ] ]\n"
+"[ -i <时间间隔> ] [ -s [ <时:分:秒> ] ] [ -e [ <时:分:秒> ] ]\n"
+
+#: sar.c:126
+#, c-format
+msgid "Main options and reports:\n"
+msgstr "主选项和报告:\n"
+
+#: sar.c:127
+#, c-format
+msgid "\t-b\tI/O and transfer rate statistics\n"
+msgstr "\t-b\tI/O 和传输速率信息状况\n"
+
+#: sar.c:128
+#, c-format
+msgid "\t-B\tPaging statistics\n"
+msgstr "\t-B\t分页状况\n"
+
+#: sar.c:129
+#, c-format
+msgid "\t-d\tBlock device statistics\n"
+msgstr "\t-d\t块设备状况\n"
+
+#: sar.c:130
+#, c-format
+msgid ""
+"\t-I { <int> | SUM | ALL | XALL }\n"
+"\t\tInterrupts statistics\n"
+msgstr ""
+"\t-I { <中断> | SUM | ALL | XALL }\n"
+"\t\t中断信息状况\n"
+
+#: sar.c:132
+#, c-format
+msgid "\t-m\tPower management statistics\n"
+msgstr "\t-m\t电源管理信息状况\n"
+
+#: sar.c:133
+#, c-format
+msgid ""
+"\t-n { <keyword> [,...] | ALL }\n"
+"\t\tNetwork statistics\n"
+"\t\tKeywords are:\n"
+"\t\tDEV\tNetwork interfaces\n"
+"\t\tEDEV\tNetwork interfaces (errors)\n"
+"\t\tNFS\tNFS client\n"
+"\t\tNFSD\tNFS server\n"
+"\t\tSOCK\tSockets\t(v4)\n"
+"\t\tIP\tIP traffic\t(v4)\n"
+"\t\tEIP\tIP traffic\t(v4) (errors)\n"
+"\t\tICMP\tICMP traffic\t(v4)\n"
+"\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+"\t\tTCP\tTCP traffic\t(v4)\n"
+"\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+"\t\tUDP\tUDP traffic\t(v4)\n"
+"\t\tSOCK6\tSockets\t(v6)\n"
+"\t\tIP6\tIP traffic\t(v6)\n"
+"\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+"\t\tICMP6\tICMP traffic\t(v6)\n"
+"\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+"\t\tUDP6\tUDP traffic\t(v6)\n"
+msgstr ""
+"\t-n { <关键词> [,...] | ALL }\n"
+"\t\t网络统计信息\n"
+"\t\t关键词可以是:\n"
+"\t\tDEV\t网卡\n"
+"\t\tEDEV\t网卡 (错误)\n"
+"\t\tNFS\tNFS 客户端\n"
+"\t\tNFSD\tNFS 服务器\n"
+"\t\tSOCK\tSockets (套接字)\t(v4)\n"
+"\t\tIP\tIP 流\t(v4)\n"
+"\t\tEIP\tIP 流\t(v4) (错误)\n"
+"\t\tICMP\tICMP 流\t(v4)\n"
+"\t\tEICMP\tICMP 流\t(v4) (错误)\n"
+"\t\tTCP\tTCP 流\t(v4)\n"
+"\t\tETCP\tTCP 流\t(v4) (错误)\n"
+"\t\tUDP\tUDP 流\t(v4)\n"
+"\t\tSOCK6\tSockets (套接字)\t(v6)\n"
+"\t\tIP6\tIP 流\t(v6)\n"
+"\t\tEIP6\tIP 流\t(v6) (错误)\n"
+"\t\tICMP6\tICMP 流\t(v6)\n"
+"\t\tEICMP6\tICMP 流\t(v6) (错误)\n"
+"\t\tUDP6\tUDP 流\t(v6)\n"
+
+#: sar.c:154
+#, c-format
+msgid "\t-q\tQueue length and load average statistics\n"
+msgstr "\t-q\t队列长度和平均负载\n"
+
+#: sar.c:155
+#, c-format
+msgid "\t-r\tMemory utilization statistics\n"
+msgstr "\t-r\t内存利用率\n"
+
+#: sar.c:156
+#, c-format
+msgid "\t-R\tMemory statistics\n"
+msgstr "\t-R\t内存状况\n"
+
+#: sar.c:157
+#, c-format
+msgid "\t-S\tSwap space utilization statistics\n"
+msgstr "\t-S\t交换空间利用率\n"
+
+#: sar.c:158
+#, c-format
+msgid ""
+"\t-u [ ALL ]\n"
+"\t\tCPU utilization statistics\n"
+msgstr ""
+"\t-u [ ALL ]\n"
+"\t\tCPU 利用率\n"
+
+#: sar.c:160
+#, c-format
+msgid "\t-v\tKernel table statistics\n"
+msgstr "\t-v\tKernel table 状况\n"
+
+#: sar.c:161
+#, c-format
+msgid "\t-w\tTask creation and system switching statistics\n"
+msgstr "\t-w\t任务创建与系统转换统计信息\n"
+
+#: sar.c:162
+#, c-format
+msgid "\t-W\tSwapping statistics\n"
+msgstr "\t-W\t交换信息\n"
+
+#: sar.c:163
+#, c-format
+msgid "\t-y\tTTY device statistics\n"
+msgstr "\t-y\tTTY 设备状况\n"
+
+#: sar.c:206
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "数据流结尾有未知错误\n"
+
+#: sar.c:774
+#, c-format
+msgid "Invalid data format\n"
+msgstr "无效的数据格式\n"
+
+#: sar.c:778
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "正在使用来自不同版本 sysstat 的错误的数据收集器\n"
+
+#: sar.c:798
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "所取数据前后不一致\n"
+
+#: sar.c:1207
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "-f 和 -o 选项不能同时使用\n"
+
+#: sar.c:1213
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "无法查看系统活动记录文件 (用 -f 选项)\n"
+
+#: sar.c:1314
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "无法找到数据收集器 (%s)\n"
+
+#~ msgid "-x and -p options are mutually exclusive\n"
+#~ msgstr "-x 和 -p 选项不能同时使用\n"
+
+#~ msgid ""
+#~ "\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+#~ "\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+#~ "\t\tNetwork statistics\n"
+#~ msgstr ""
+#~ "\t-n { DEV | EDEV | NFS | NFSD | SOCK |\n"
+#~ "\t     IP | EIP | ICMP | EICMP | TCP | ETCP | UDP | ALL }\n"
+#~ "\t\t网络信息状况\n"
+
+#~ msgid "Time: %s\n"
+#~ msgstr "时间: %s\n"
+
+#~ msgid "Usage:"
+#~ msgstr "用法:"
+
+#~ msgid "options..."
+#~ msgstr "选项..."
+
+#~ msgid "interval"
+#~ msgstr "间隔"
+
+#~ msgid "count"
+#~ msgstr "次数"
+
+#~ msgid "device"
+#~ msgstr "设备名"
+
+#~ msgid "cpu"
+#~ msgstr "cpu"
+
+#~ msgid "command"
+#~ msgstr "命令"
+
+#~ msgid "outfile"
+#~ msgstr "输出文件"
+
+#~ msgid "comment"
+#~ msgstr "注释"
+
+#~ msgid "datafile"
+#~ msgstr "数据文件"
+
+#~ msgid "hh:mm:ss"
+#~ msgstr "时:分:秒"
+
+#~ msgid "sar_options..."
+#~ msgstr "sar 选项..."
+
+#~ msgid "Activity flag: %#x\n"
+#~ msgstr "运行标记: %#x\n"
+
+#~ msgid "Number of CPU: %u\n"
+#~ msgstr "CPU 数量: %u\n"
+
+#~ msgid "Number of interrupts per CPU: %u\n"
+#~ msgstr "每个 CPU 的中断数目: %u\n"
+
+#~ msgid "Number of disks: %u\n"
+#~ msgstr "磁盘数量: %u\n"
+
+#~ msgid "Number of serial lines: %u\n"
+#~ msgstr "串行数量: %u\n"
+
+#~ msgid "Number of network interfaces: %u\n"
+#~ msgstr "网卡数量: %u\n"
+
+#~ msgid "int"
+#~ msgstr "整型数"
+
+#~ msgid "filename"
+#~ msgstr "文件名"
+
+#~ msgid "Not an SMP machine...\n"
+#~ msgstr "非对称多处理机器...\n"
diff --git a/nls/zh_TW.po b/nls/zh_TW.po
new file mode 100644 (file)
index 0000000..d9aca07
--- /dev/null
@@ -0,0 +1,245 @@
+# Chinese (traditional) translations for sysstat.
+# Copyright (C) 2008 THE sysstat'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the sysstat package.
+# Zi-You Dai <ioppooster@gmail.com>, 2008.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sysstat 8.1.5\n"
+"Report-Msgid-Bugs-To: sysstat <at> orange.fr\n"
+"POT-Creation-Date: 2008-07-12 18:20+0200\n"
+"PO-Revision-Date: 2008-08-18 18:49+0800\n"
+"Last-Translator: Zi-You Dai <ioppooster@gmail.com>\n"
+"Language-Team: Chinese (traditional)  <zh-l10n@linux.org.tw>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: common.c:57
+#, c-format
+msgid "sysstat version %s\n"
+msgstr "sysstat 版本 %s\n"
+
+#: ioconf.c:479 iostat.c:462 rd_stats.c:69 rd_stats.c:1469 rd_stats.c:1576
+#: sa_common.c:984 sadc.c:478 sadc.c:487 sadc.c:547
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "無法打開 %s: %s\n"
+
+#: iostat.c:80 mpstat.c:83 pidstat.c:77 sar.c:89
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ]\n"
+msgstr "用法: %s [ 選項 ] [ <時間間隔> [ <計算> ] ]\n"
+
+#: iostat.c:83
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"
+msgstr ""
+"選項是:\n"
+"[-c ]·[ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+"[·<裝置> ·[...]·|· ALL ]·[ -p [ <裝置> | ALL ] ]\n"
+
+#: iostat.c:1268
+#, c-format
+msgid "Time: %s\n"
+msgstr "時間: %s\n"
+
+#: iostat.c:1645
+#, c-format
+msgid "-x and -p options are mutually exclusive\n"
+msgstr "-x 和 -p 選項互相排斥\n"
+
+#: mpstat.c:86
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -I { SUM | CPU | ALL } ] [ -u ] [ -P { <cpu> | ALL } ] [ -V ]\n"
+msgstr ""
+"選項是:\n"
+"[ -A ] [ -I { SUM | CPU | ALL } ] [ -u ] [ -P { <cpu> | ALL } ] [ -V ]\n"
+
+#: mpstat.c:403 pidstat.c:1362 sar.c:287
+msgid "Average:"
+msgstr "平均時間:"
+
+#: mpstat.c:708
+#, c-format
+msgid "Not that many processors!\n"
+msgstr "沒有那麼多處理器!\n"
+
+#: pidstat.c:80
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <command> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+msgstr ""
+"選項是:\n"
+"[ -C <命令> ] [ -d ] [ -I ] [ -r ] [ -t ] [ -u ] [ -V ] [ -w ]\n"
+"[ -p { <pid> | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"
+
+#: pidstat.c:181 sar.c:892
+#, c-format
+msgid "Requested activities not available\n"
+msgstr "所需的運行記錄無法取得\n"
+
+#: rd_stats.c:1622
+#, c-format
+msgid "Cannot handle so many processors!\n"
+msgstr "處理器太多無法處理!\n"
+
+#: sa_common.c:800
+#, c-format
+msgid "Error while reading system activity file: %s\n"
+msgstr "讀取系統運行記錄時出錯: %s\n"
+
+#: sa_common.c:810
+#, c-format
+msgid "End of system activity file unexpected\n"
+msgstr "系統運行記錄文件的結尾有未知錯誤\n"
+
+#: sa_common.c:828
+#, c-format
+msgid "File created using sar/sadc from sysstat version %d.%d.%d"
+msgstr "從 sysstat 版本 %d,%d,%d 使用 sar/sadc 建立檔案"
+
+#: sa_common.c:858
+#, c-format
+msgid "Invalid system activity file: %s\n"
+msgstr "無效的系統運行記錄檔案: %s\n"
+
+#: sa_common.c:865
+#, c-format
+msgid "Current sysstat version can no longer read the format of this file (%#x)\n"
+msgstr "目前的 sysstat 版本已無法讀取此檔案格式 (%#x)\n"
+
+#: sa_common.c:1058
+#, c-format
+msgid "Requested activities not available in file %s\n"
+msgstr "所需的運行記錄在此檔案 %s 中無法獲得\n"
+
+#: sadc.c:78
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"
+msgstr "用法: %s [ 選項 ] [ <時間間隔> [ <計算> ] ] [ <輸出檔> ]\n"
+
+#: sadc.c:81
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -C <comment> ] [ -S { INT | DISK | ALL } ] [ -F ] [ -L ] [ -V ]\n"
+msgstr ""
+"選項是:\n"
+"[ -C <命令> ] [ -S { INT | DISK | ALL } ] [ -F ] [ -L ] [ -V ]\n"
+
+#: sadc.c:107
+#, c-format
+msgid "Cannot write data to system activity file: %s\n"
+msgstr "無法將數據寫入系統運行記錄檔案: %s\n"
+
+#: sadc.c:364
+#, c-format
+msgid "Cannot write system activity file header: %s\n"
+msgstr "無法寫入系統運行記錄檔案的檔頭: %s\n"
+
+#: sadc.c:641
+#, c-format
+msgid "Cannot append data to that file (%s)\n"
+msgstr "不能增加數據到該檔案 (%s)\n"
+
+#: sadf.c:85
+#, c-format
+msgid "Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"
+msgstr "用法: %s [ 選項 ] [ <時間間隔> [ <計算> ] ] [ <數據檔> ]\n"
+
+#: sadf.c:88
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -d | -D | -H | -p | -x ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+"[ -- <sar_options...> ]\n"
+msgstr ""
+"選項是:\n"
+"[ -d | -D | -H | -p | -x ] [ -h ] [ -t ] [ -V ]\n"
+"[ -P { <cpu> | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss>·] ]\n"
+"[·--·<sar_options...>·]\n"
+
+#: sadf.c:526
+#, c-format
+msgid "System activity data file: %s (%#x)\n"
+msgstr "系統運行記錄數據檔: %s (%#x)\n"
+
+#: sadf.c:535
+#, c-format
+msgid "Host: "
+msgstr "主機:"
+
+#: sadf.c:540
+#, fuzzy, c-format
+msgid "Size of a long int: %d\n"
+msgstr "整數大小過長: %d\n"
+
+#: sadf.c:542
+#, c-format
+msgid "List of activities:\n"
+msgstr "運行記錄清單:\n"
+
+#: sar.c:92
+#, c-format
+msgid ""
+"Options are:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -p ] [ -q ] [ -r ] [ -R ]\n"
+"[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+"[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+msgstr ""
+"選項是:\n"
+"[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -p ] [ -q ] [ -r ] [ -R ]\n"
+"[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+"[ -I { <int> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]\n"
+"[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]\n"
+"[ -o [ <檔名> ] | -f [ <檔名> ] ]\n"
+"[ -i <時間間隔> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+
+#: sar.c:143
+#, c-format
+msgid "End of data collecting unexpected\n"
+msgstr "數據結尾有未知錯誤\n"
+
+#: sar.c:703
+#, c-format
+msgid "Invalid data format\n"
+msgstr "無效的數據格式\n"
+
+#: sar.c:707
+#, c-format
+msgid "Using a wrong data collector from a different sysstat version\n"
+msgstr "從一個不同的 sysstat 版本,使用了錯誤的數據收集器\n"
+
+#: sar.c:727
+#, c-format
+msgid "Inconsistent input data\n"
+msgstr "不一致的數據輸入\n"
+
+#: sar.c:1121
+#, c-format
+msgid "-f and -o options are mutually exclusive\n"
+msgstr "-f 和 -o選項是互相排斥的\n"
+
+#: sar.c:1127
+#, c-format
+msgid "Not reading from a system activity file (use -f option)\n"
+msgstr "無法查看系統活動記錄檔 (使用 -f 選項)\n"
+
+#: sar.c:1224
+#, c-format
+msgid "Cannot find the data collector (%s)\n"
+msgstr "無法找到數據收集器 (%s)\n"
diff --git a/pidstat.c b/pidstat.c
new file mode 100644 (file)
index 0000000..aa0f984
--- /dev/null
+++ b/pidstat.c
@@ -0,0 +1,2178 @@
+/*
+ * pidstat: Report statistics for Linux tasks
+ * (C) 2007-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/utsname.h>
+#include <regex.h>
+
+#include "version.h"
+#include "pidstat.h"
+#include "common.h"
+#include "rd_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": " __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+unsigned long long uptime[3] = {0, 0, 0};
+unsigned long long uptime0[3] = {0, 0, 0};
+struct pid_stats *st_pid_list[3] = {NULL, NULL, NULL};
+unsigned int *pid_array = NULL;
+struct pid_stats st_pid_null;
+struct tm ps_tstamp[3];
+char commstr[MAX_COMM_LEN];
+
+unsigned int pid_nr = 0;       /* Nb of PID to display */
+unsigned int pid_array_nr = 0;
+int cpu_nr = 0;                        /* Nb of processors on the machine */
+unsigned long tlmkb;           /* Total memory in kB */
+long interval = -1;
+long count = 0;
+unsigned int pidflag = 0;      /* General flags */
+unsigned int tskflag = 0;      /* TASK/CHILD stats */
+unsigned int actflag = 0;      /* Activity flag */
+
+
+/*
+ ***************************************************************************
+ * Print usage and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+       fprintf(stderr, _("Usage: %s [ options ] [ <interval> [ <count> ] ]\n"),
+               progname);
+
+       fprintf(stderr, _("Options are:\n"
+                         "[ -C <command> ] [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ]\n"
+                         "[ -t ] [ -u ] [ -V ] [ -w ]\n"
+                         "[ -p { <pid> [,...] | SELF | ALL } ] [ -T { TASK | CHILD | ALL } ]\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * SIGALRM signal handler.
+ *
+ * IN:
+ * @sig        Signal number. Set to 0 for the first time, then to SIGALRM.
+ ***************************************************************************
+ */
+void alarm_handler(int sig)
+{
+       signal(SIGALRM, alarm_handler);
+       alarm(interval);
+}
+
+/*
+ ***************************************************************************
+ * Initialize uptime variables.
+ ***************************************************************************
+ */
+void init_stats(void)
+{
+       memset(&st_pid_null, 0, PID_STATS_SIZE);
+}
+
+/*
+ ***************************************************************************
+ * Allocate structures for PIDs entered on command line.
+ *
+ * IN:
+ * @len        Number of PIDs entered on the command line.
+ ***************************************************************************
+ */
+void salloc_pid_array(unsigned int len)
+{
+       if ((pid_array = (unsigned int *) malloc(sizeof(int) * len)) == NULL) {
+               perror("malloc");
+               exit(4);
+       }
+       memset(pid_array, 0, sizeof(int) * len);
+}
+
+/*
+ ***************************************************************************
+ * Allocate structures for PIDs to read.
+ *
+ * IN:
+ * @len        Number of PIDs (and TIDs) on the system.
+ ***************************************************************************
+ */
+void salloc_pid(unsigned int len)
+{
+       int i;
+
+       for (i = 0; i < 3; i++) {
+               if ((st_pid_list[i] = (struct pid_stats *) malloc(PID_STATS_SIZE * len)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(st_pid_list[i], 0, PID_STATS_SIZE * len);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free PID list structures.
+ ***************************************************************************
+ */
+void sfree_pid(void)
+{
+       int i;
+       
+       for (i = 0; i < 3; i++) {
+               if (st_pid_list[i]) {
+                       free(st_pid_list[i]);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Check flags and set default values.
+ ***************************************************************************
+ */
+void check_flags(void)
+{
+       unsigned int act = 0;
+
+       /* Display CPU usage for active tasks by default */
+       if (!actflag) {
+               actflag |= P_A_CPU;
+       }
+
+       if (!DISPLAY_PID(pidflag)) {
+               pidflag |= P_D_ACTIVE_PID + P_D_PID + P_D_ALL_PID;
+       }
+
+       if (!tskflag) {
+               tskflag |= P_TASK;
+       }
+
+       /* Check that requested activities are available */
+       if (DISPLAY_TASK_STATS(tskflag)) {
+               act |= P_A_CPU + P_A_MEM + P_A_IO + P_A_CTXSW + P_A_STACK;
+       }
+       if (DISPLAY_CHILD_STATS(tskflag)) {
+               act |= P_A_CPU + P_A_MEM;
+       }
+
+       actflag &= act;
+
+       if (!actflag) {
+               fprintf(stderr, _("Requested activities not available\n"));
+               exit(1);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Look for the PID in the list of PIDs entered on the command line, and
+ * store it if necessary.
+ *
+ * IN:
+ * @pid_array_nr       Length of the PID list.
+ * @pid                        PID to search.
+ *
+ * OUT:
+ * @pid_array_nr       New length of the PID list.
+ *
+ * RETURNS:
+ * Returns the position of the PID in the list.
+ ***************************************************************************
+ */
+int update_pid_array(unsigned int *pid_array_nr, unsigned int pid)
+{
+       unsigned int i;
+
+       for (i = 0; i < *pid_array_nr; i++) {
+               if (pid_array[i] == pid)
+                       break;
+       }
+
+       if (i == *pid_array_nr) {
+               /* PID not found: Store it */
+               (*pid_array_nr)++;
+               pid_array[i] = pid;
+       }
+
+       return i;
+}
+
+/*
+ ***************************************************************************
+ * Display process command name or command line.
+ *
+ * IN:
+ * @pst                Pointer on structure with process stats and command line.
+ ***************************************************************************
+ */
+void print_comm(struct pid_stats *pst)
+{
+       char *p;
+       
+       if (DISPLAY_CMDLINE(pidflag) && strlen(pst->cmdline)) {
+               p = pst->cmdline;
+       }
+       else {
+               p = pst->comm;
+       }
+
+       printf("  %s%s\n", pst->tgid ? "|__" : "", p);
+}
+
+/*
+ ***************************************************************************
+ * Read /proc/meminfo.
+ ***************************************************************************
+ */
+void read_proc_meminfo(void)
+{
+       struct stats_memory st_mem;
+
+       memset(&st_mem, 0, STATS_MEMORY_SIZE);
+       read_meminfo(&st_mem);
+       tlmkb = st_mem.tlmkb;
+}
+
+/*
+ ***************************************************************************
+ * Read stats from /proc/#[/task/##]/stat.
+ *
+ * IN:
+ * @pid                Process whose stats are to be read.
+ * @pst                Pointer on structure where stats will be saved.
+ * @tgid       If !=0, thread whose stats are to be read.
+ *
+ * OUT:
+ * @pst                Pointer on structure where stats have been saved.
+ * @thread_nr  Number of threads of the process.
+ *
+ * RETURNS:
+ * 0 if stats have been successfully read, and 1 otherwise.
+ ***************************************************************************
+ */
+int read_proc_pid_stat(unsigned int pid, struct pid_stats *pst,
+                      unsigned int *thread_nr, unsigned int tgid)
+{
+       FILE *fp;
+       char filename[128], format[256], comm[MAX_COMM_LEN + 1];
+       size_t len;
+
+       if (tgid) {
+               sprintf(filename, TASK_STAT, tgid, pid);
+       }
+       else {
+               sprintf(filename, PID_STAT, pid);
+       }
+
+       if ((fp = fopen(filename, "r")) == NULL)
+               /* No such process */
+               return 1;
+
+       sprintf(format, "%%*d (%%%ds %%*s %%*d %%*d %%*d %%*d %%*d %%*u %%lu %%lu"
+               " %%lu %%lu %%lu %%lu %%lu %%lu %%*d %%*d %%u %%*u %%*d %%lu %%lu"
+               " %%*u %%*u %%*u %%*u %%*u %%*u %%*u %%*u %%*u %%*u %%*u %%*u %%*u"
+               " %%*u %%u %%*u %%*u %%*u %%lu %%lu\\n", MAX_COMM_LEN);
+
+       fscanf(fp, format, comm,
+              &pst->minflt, &pst->cminflt, &pst->majflt, &pst->cmajflt,
+              &pst->utime,  &pst->stime, &pst->cutime, &pst->cstime,
+              thread_nr, &pst->vsz, &pst->rss, &pst->processor,
+              &pst->gtime, &pst->cgtime);
+
+       fclose(fp);
+
+       /* Convert to kB */
+       pst->vsz >>= 10;
+       pst->rss = PG_TO_KB(pst->rss);
+
+       strncpy(pst->comm, comm, MAX_COMM_LEN);
+       pst->comm[MAX_COMM_LEN - 1] = '\0';
+
+       /* Remove trailing ')' */
+       len = strlen(pst->comm);
+       if (len && (pst->comm[len - 1] == ')')) {
+               pst->comm[len - 1] = '\0';
+       }
+
+       pst->pid = pid;
+       pst->tgid = tgid;
+       return 0;
+}
+
+/*
+ *****************************************************************************
+ * Read stats from /proc/#[/task/##]/status.
+ *
+ * IN:
+ * @pid                Process whose stats are to be read.
+ * @pst                Pointer on structure where stats will be saved.
+ * @tgid       If !=0, thread whose stats are to be read.
+ *
+ * OUT:
+ * @pst                Pointer on structure where stats have been saved.
+ *
+ * RETURNS:
+ * 0 if stats have been successfully read, and 1 otherwise.
+ *****************************************************************************
+ */
+int read_proc_pid_status(unsigned int pid, struct pid_stats *pst,
+                        unsigned int tgid)
+{
+       FILE *fp;
+       char filename[128], line[256];
+
+       if (tgid) {
+               sprintf(filename, TASK_STATUS, tgid, pid);
+       }
+       else {
+               sprintf(filename, PID_STATUS, pid);
+       }
+
+       if ((fp = fopen(filename, "r")) == NULL)
+               /* No such process */
+               return 1;
+
+       while (fgets(line, 256, fp) != NULL) {
+
+               if (!strncmp(line, "voluntary_ctxt_switches:", 24)) {
+                       sscanf(line + 25, "%lu", &pst->nvcsw);
+               }
+               else if (!strncmp(line, "nonvoluntary_ctxt_switches:", 27)) {
+                       sscanf(line + 28, "%lu", &pst->nivcsw);
+               }
+       }
+
+       fclose(fp);
+
+       pst->pid = pid;
+       pst->tgid = tgid;
+       return 0;
+}
+
+/*
+  *****************************************************************************
+  * Read information from /proc/#[/task/##}/smaps.
+  *
+  * @pid               Process whose stats are to be read.
+  * @pst               Pointer on structure where stats will be saved.
+  * @tgid              If !=0, thread whose stats are to be read.
+  *
+  * OUT:
+  * @pst               Pointer on structure where stats have been saved.
+  *
+  * RETURNS:
+  * 0 if stats have been successfully read, and 1 otherwise.
+  *****************************************************************************
+  */
+int read_proc_pid_smap(unsigned int pid, struct pid_stats *pst, unsigned int tgid)
+{
+       FILE *fp;
+       char filename[128], line[256];
+       int state = 0;
+
+       if (tgid) {
+               sprintf(filename, TASK_SMAP, tgid, pid);
+       }
+       else {
+               sprintf(filename, PID_SMAP, pid);
+       }
+
+       if ((fp = fopen(filename, "rt")) == NULL)
+               /* No such process */
+               return 1;
+
+       while ((state < 3) && (fgets(line, sizeof(line), fp) != NULL)) {
+               switch (state) {
+                       case 0:
+                               if (strstr(line, "[stack]")) {
+                                       state = 1;
+                               }
+                               break;
+                       case 1:
+                               if (strstr(line, "Size:")) {
+                                       sscanf(line + sizeof("Size:"), "%lu", &pst->stack_size);
+                                       state = 2;
+                               }
+                               break;
+                       case 2:
+                               if (strstr(line, "Referenced:")) {
+                                       sscanf(line + sizeof("Referenced:"), "%lu", &pst->stack_ref);
+                                       state = 3;
+                               }
+                               break;
+               }
+       }
+
+       fclose(fp);
+
+       pst->pid = pid;
+       pst->tgid = tgid;
+       return 0;
+}
+
+/*
+ *****************************************************************************
+ * Read process command line from /proc/#[/task/##]/cmdline.
+ *
+ * IN:
+ * @pid                Process whose command line is to be read.
+ * @pst                Pointer on structure where command line will be saved.
+ * @tgid       If !=0, thread whose command line is to be read.
+ *
+ * OUT:
+ * @pst                Pointer on structure where command line has been saved.
+ *
+ * RETURNS:
+ * 0 if command line has been successfully read, and 1 otherwise (the process
+ * has terminated or its /proc/.../cmdline file is just empty).
+ *****************************************************************************
+ */
+int read_proc_pid_cmdline(unsigned int pid, struct pid_stats *pst,
+                         unsigned int tgid)
+{
+       FILE *fp;
+       char filename[128], line[MAX_CMDLINE_LEN];
+       size_t len;
+       int i;
+
+       if (tgid) {
+               sprintf(filename, TASK_CMDLINE, tgid, pid);
+       }
+       else {
+               sprintf(filename, PID_CMDLINE, pid);
+       }
+
+       if ((fp = fopen(filename, "r")) == NULL)
+               /* No such process */
+               return 1;
+
+       memset(line, 0, MAX_CMDLINE_LEN);
+       
+       if ((len = fread(line, 1, MAX_CMDLINE_LEN - 1, fp)) < 0)
+               /* Nothing to read doesn't mean that process no longer exists */
+               return 1;
+       
+       for (i = 0; i < len; i++) {
+               if (line[i] == '\0') {
+                       line[i] = ' ';
+               }
+       }
+
+       fclose(fp);
+       strncpy(pst->cmdline, line, MAX_CMDLINE_LEN);
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Read stats from /proc/#[/task/##]/io.
+ *
+ * IN:
+ * @pid                Process whose stats are to be read.
+ * @pst                Pointer on structure where stats will be saved.
+ * @tgid       If !=0, thread whose stats are to be read.
+ *
+ * OUT:
+ * @pst                Pointer on structure where stats have been saved.
+ *
+ * RETURNS:
+ * 0 if stats have been successfully read.
+ * Also returns 0 if current process has terminated or if its io file
+ * doesn't exist, but in this case, set process' F_NO_PID_IO flag to
+ * indicate that I/O stats should no longer be read for it.
+ ***************************************************************************
+ */
+int read_proc_pid_io(unsigned int pid, struct pid_stats *pst,
+                    unsigned int tgid)
+{
+       FILE *fp;
+       char filename[128], line[256];
+
+       if (tgid) {
+               sprintf(filename, TASK_IO, tgid, pid);
+       }
+       else {
+               sprintf(filename, PID_IO, pid);
+       }
+
+       if ((fp = fopen(filename, "r")) == NULL) {
+               /* No such process... or file non existent! */
+               pst->flags |= F_NO_PID_IO;
+               /*
+                * Also returns 0 since io stats file doesn't necessarily exist,
+                * depending on the kernel version used.
+                */
+               return 0;
+       }
+
+       while (fgets(line, 256, fp) != NULL) {
+
+               if (!strncmp(line, "read_bytes:", 11)) {
+                       sscanf(line + 12, "%llu", &pst->read_bytes);
+               }
+               else if (!strncmp(line, "write_bytes:", 12)) {
+                       sscanf(line + 13, "%llu", &pst->write_bytes);
+               }
+               else if (!strncmp(line, "cancelled_write_bytes:", 22)) {
+                       sscanf(line + 23, "%llu", &pst->cancelled_write_bytes);
+               }
+       }
+
+       fclose(fp);
+
+       pst->pid = pid;
+       pst->tgid = tgid;
+       pst->flags &= ~F_NO_PID_IO;
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Read various stats for given PID.
+ *
+ * IN:
+ * @pid                Process whose stats are to be read.
+ * @pst                Pointer on structure where stats will be saved.
+ * @tgid       If !=0, thread whose stats are to be read.
+ *
+ * OUT:
+ * @pst                Pointer on structure where stats have been saved.
+ * @thread_nr  Number of threads of the process.
+ *
+ * RETURNS:
+ * 0 if stats have been successfully read, and 1 otherwise.
+ ***************************************************************************
+ */
+int read_pid_stats(unsigned int pid, struct pid_stats *pst,
+                  unsigned int *thread_nr, unsigned int tgid)
+{
+       if (read_proc_pid_stat(pid, pst, thread_nr, tgid))
+               return 1;
+
+       if (DISPLAY_CMDLINE(pidflag)) {
+               if (read_proc_pid_cmdline(pid, pst, tgid))
+                       return 1;
+       }
+       
+       if (read_proc_pid_status(pid, pst, tgid))
+               return 1;
+
+       if (DISPLAY_STACK(actflag)) {
+               if (read_proc_pid_smap(pid, pst, tgid))
+                       return 1;
+       }
+
+       if (DISPLAY_IO(actflag))
+               /* Assume that /proc/#/task/#/io exists! */
+               return (read_proc_pid_io(pid, pst, tgid));
+
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Count number of threads in /proc/#/task directory, including the leader
+ * one.
+ *
+ * IN:
+ * @pid        Process number for which the number of threads are to be counted.
+ *
+ * RETURNS:
+ * Number of threads for the given process (min value is 1).
+ * A value of 0 indicates that the process has terminated.
+ ***************************************************************************
+ */
+unsigned int count_tid(unsigned int pid)
+{
+       struct pid_stats pst;
+       unsigned int thread_nr;
+
+       if (read_proc_pid_stat(pid, &pst, &thread_nr, 0) != 0)
+               /* Task no longer exists */
+               return 0;
+
+       return thread_nr;
+}
+
+/*
+ ***************************************************************************
+ * Count number of processes (and threads).
+ *
+ * RETURNS:
+ * Number of processes (and threads if requested).
+ ***************************************************************************
+ */
+unsigned int count_pid(void)
+{
+       DIR *dir;
+       struct dirent *drp;
+       unsigned int pid = 0;
+
+       /* Open /proc directory */
+       if ((dir = opendir(PROC)) == NULL) {
+               perror("opendir");
+               exit(4);
+       }
+
+       /* Get directory entries */
+       while ((drp = readdir(dir)) != NULL) {
+               if (isdigit(drp->d_name[0])) {
+                       /* There is at least the TGID */
+                       pid++;
+                       if (DISPLAY_TID(pidflag)) {
+                               pid += count_tid(atoi(drp->d_name));
+                       }
+               }
+       }
+
+       /* Close /proc directory */
+       closedir(dir);
+
+       return pid;
+}
+
+/*
+ ***************************************************************************
+ * Count number of threads associated with the tasks entered on the command
+ * line.
+ *
+ * RETURNS:
+ * Number of threads (including the leading one) associated with every task
+ * entered on the command line.
+ ***************************************************************************
+ */
+unsigned int count_tid_in_list(void)
+{
+       unsigned int p, tid, pid = 0;
+
+       for (p = 0; p < pid_array_nr; p++) {
+
+               tid = count_tid(pid_array[p]);
+
+               if (!tid) {
+                       /* PID no longer exists */
+                       pid_array[p] = 0;
+               }
+               else {
+                       /* <tid_value> TIDs + 1 TGID */
+                       pid += tid + 1;
+               }
+       }
+
+       return pid;
+}
+
+/*
+ ***************************************************************************
+ * Allocate and init structures according to system state.
+ ***************************************************************************
+ */
+void pid_sys_init(void)
+{
+       /* Init stat common counters */
+       init_stats();
+
+       /* Count nb of proc */
+       cpu_nr = get_cpu_nr(~0);
+
+       if (DISPLAY_ALL_PID(pidflag)) {
+               /* Count PIDs and allocate structures */
+               pid_nr = count_pid() + NR_PID_PREALLOC;
+               salloc_pid(pid_nr);
+       }
+       else if (DISPLAY_TID(pidflag)) {
+               /* Count total number of threads associated with tasks in list */
+               pid_nr = count_tid_in_list() + NR_PID_PREALLOC;
+               salloc_pid(pid_nr);
+       }
+       else {
+               pid_nr = pid_array_nr;
+               salloc_pid(pid_nr);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read stats for threads in /proc/#/task directory.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @pid                Process number whose threads stats are to be read.
+ * @index      Index in process list where stats will be saved.
+ *
+ * OUT:
+ * @index      Index in process list where next stats will be saved.
+ ***************************************************************************
+ */
+void read_task_stats(int curr, unsigned int pid, unsigned int *index)
+{
+       DIR *dir;
+       struct dirent *drp;
+       char filename[128];
+       struct pid_stats *psti;
+       unsigned int thr_nr;
+
+       /* Open /proc/#/task directory */
+       sprintf(filename, PROC_TASK, pid);
+       if ((dir = opendir(filename)) == NULL)
+               return;
+
+       while (*index < pid_nr) {
+
+               while ((drp = readdir(dir)) != NULL) {
+                       if (isdigit(drp->d_name[0]))
+                               break;
+               }
+
+               if (drp) {
+                       psti = st_pid_list[curr] + (*index)++;
+                       if (read_pid_stats(atoi(drp->d_name), psti, &thr_nr, pid)) {
+                               /* Thread no longer exists */
+                               psti->pid = 0;
+                       }
+               }
+               else
+                       break;
+       }
+       closedir(dir);
+}
+
+/*
+ ***************************************************************************
+ * Read various stats.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void read_stats(int curr)
+{
+       DIR *dir;
+       struct dirent *drp;
+       unsigned int p = 0, q, pid, thr_nr;
+       struct pid_stats *psti;
+       struct stats_cpu *st_cpu;
+
+       /*
+        * Allocate two structures for CPU statistics.
+        * No need to init them (done by read_stat_cpu() function).
+        */
+       if ((st_cpu = (struct stats_cpu *) malloc(STATS_CPU_SIZE * 2)) == NULL) {
+               perror("malloc");
+               exit(4);
+       }
+       /* Read statistics for CPUs "all" and 0 */
+       read_stat_cpu(st_cpu, 2, &uptime[curr], &uptime0[curr]);
+       free(st_cpu);
+
+       if (DISPLAY_ALL_PID(pidflag)) {
+
+               /* Open /proc directory */
+               if ((dir = opendir(PROC)) == NULL) {
+                       perror("opendir");
+                       exit(4);
+               }
+
+               while (p < pid_nr) {
+
+                       /* Get directory entries */
+                       while ((drp = readdir(dir)) != NULL) {
+                               if (isdigit(drp->d_name[0]))
+                                       break;
+                       }
+                       if (drp) {
+                               psti = st_pid_list[curr] + p++;
+                               pid = atoi(drp->d_name);
+       
+                               if (read_pid_stats(pid, psti, &thr_nr, 0)) {
+                                       /* Process has terminated */
+                                       psti->pid = 0;
+                               }
+       
+                               else if (DISPLAY_TID(pidflag)) {
+                                       /* Read stats for threads in task subdirectory */
+                                       read_task_stats(curr, pid, &p);
+                               }
+                       }
+                       else {
+                               for (q = p; q < pid_nr; q++) {
+                                       psti = st_pid_list[curr] + q;
+                                       psti->pid = 0;
+                               }
+                               break;
+                       }
+               }
+
+               /* Close /proc directory */
+               closedir(dir);
+       }
+
+       else if (DISPLAY_PID(pidflag)) {
+               unsigned int op;
+
+               /* Read stats for each PID in the list */
+               for (op = 0; op < pid_array_nr; op++) {
+
+                       if (p >= pid_nr)
+                               break;
+                       psti = st_pid_list[curr] + p++;
+       
+                       if (pid_array[op]) {
+                               /* PID should still exist. So read its stats */
+                               if (read_pid_stats(pid_array[op], psti, &thr_nr, 0)) {
+                                       /* PID has terminated */
+                                       psti->pid = 0;
+                                       pid_array[op] = 0;
+                               }
+                               else if (DISPLAY_TID(pidflag)) {
+                                       read_task_stats(curr, pid_array[op], &p);
+                               }
+                       }
+               }
+               /* Reset remaining structures */
+               for (q = p; q < pid_nr; q++) {
+                       psti = st_pid_list[curr] + q;
+                       psti->pid = 0;
+               }
+               
+       }
+       /* else unknown command */
+}
+
+/*
+ ***************************************************************************
+ * Get current PID to display.
+ * First, check that PID exists. *Then* check that it's an active process
+ * and/or that the string (entered on the command line with options -C or
+ * -X) is found in command name.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @p          Index in process list.
+ * @activity   Current activity to display (CPU, memory...).
+ *             Can be more than one if stats are displayed on one line.
+ * @pflag      Flag indicating whether stats are to be displayed for
+ *             individual tasks or for all their children.
+ *
+ * OUT:
+ * @psti       Structure with PID statistics for current sample.
+ * @pstj       Structure with PID statistics for previous sample.
+ *
+ * RETURNS:
+ *  0 if PID no longer exists.
+ * -1 if PID exists but should not be displayed.
+ *  1 if PID can be displayed.
+ ***************************************************************************
+ */
+int get_pid_to_display(int prev, int curr, int p, unsigned int activity,
+                      unsigned int pflag,
+                      struct pid_stats **psti, struct pid_stats **pstj)
+{
+       int q, rc;
+       regex_t regex;
+
+       *psti = st_pid_list[curr] + p;
+
+       if (!(*psti)->pid)
+               /* PID no longer exists */
+               return 0;
+
+       if (DISPLAY_ALL_PID(pidflag) || DISPLAY_TID(pidflag)) {
+
+               /* Look for previous stats for same PID */
+               q = p;
+       
+               do {
+                       *pstj = st_pid_list[prev] + q;
+                       if (((*pstj)->pid == (*psti)->pid) &&
+                           ((*pstj)->tgid == (*psti)->tgid))
+                               break;
+                       q++;
+                       if (q >= pid_nr) {
+                               q = 0;
+                       }
+               }
+               while (q != p);
+
+               if (((*pstj)->pid != (*psti)->pid) ||
+                   ((*pstj)->tgid != (*psti)->tgid)) {
+                       /* PID not found (no data previously read) */
+                       *pstj = &st_pid_null;
+               }
+
+               if (DISPLAY_ACTIVE_PID(pidflag)) {
+                       int isActive = FALSE;
+                       
+                       /* Check that it's an "active" process */
+                       if (DISPLAY_CPU(activity)) {
+                               /* User time already includes guest time */
+                               if (((*psti)->utime != (*pstj)->utime) ||
+                                   ((*psti)->stime != (*pstj)->stime)) {
+                                       isActive = TRUE;
+                               }
+                               else {
+                                       /*
+                                        * Process is not active but if we are showing
+                                        * child stats then we need to look there.
+                                        */
+                                       if (DISPLAY_CHILD_STATS(pflag)) {
+                                               /* User time already includes guest time */
+                                               if (((*psti)->cutime != (*pstj)->cutime) ||
+                                                   ((*psti)->cstime != (*pstj)->cstime)) {
+                                                       isActive = TRUE;
+                                               }
+                                       }
+                               }
+                       }
+                       
+                       if (DISPLAY_MEM(activity) && (!isActive)) {
+                               if (((*psti)->minflt != (*pstj)->minflt) ||
+                                   ((*psti)->majflt != (*pstj)->majflt)) {
+                                       isActive = TRUE;
+                               }
+                               else {
+                                       if (DISPLAY_TASK_STATS(pflag)) {
+                                               if (((*psti)->vsz != (*pstj)->vsz) ||
+                                                   ((*psti)->rss != (*pstj)->rss)) {
+                                                       isActive = TRUE;
+                                               }
+                                       }
+                                       else if (DISPLAY_CHILD_STATS(pflag)) {
+                                               if (((*psti)->cminflt != (*pstj)->cminflt) ||
+                                                   ((*psti)->cmajflt != (*pstj)->cmajflt)) {
+                                                       isActive = TRUE;
+                                               }
+                                       }
+                               }
+                       }
+
+                       if (DISPLAY_IO(activity) && (!isActive) &&
+                                /* /proc/#/io file should exist to check I/O stats */
+                                !(NO_PID_IO((*psti)->flags))) {
+                               if (((*psti)->read_bytes  != (*pstj)->read_bytes)  ||
+                                   ((*psti)->write_bytes != (*pstj)->write_bytes) ||
+                                   ((*psti)->cancelled_write_bytes !=
+                                    (*pstj)->cancelled_write_bytes)) {
+                                       isActive = TRUE;
+                               }
+                       }
+                       
+                       if (DISPLAY_CTXSW(activity) && (!isActive)) {
+                               if (((*psti)->nvcsw  != (*pstj)->nvcsw) ||
+                                   ((*psti)->nivcsw != (*pstj)->nivcsw)) {
+                                       isActive = TRUE;
+                               }
+                       }
+                       
+                       /* If PID isn't active for any of the activities then return */
+                       if (!isActive)
+                               return -1;
+               }
+       }
+       
+       else if (DISPLAY_PID(pidflag)) {
+
+               *pstj = st_pid_list[prev] + p;
+       }
+
+       if (COMMAND_STRING(pidflag)) {
+
+               if (regcomp(&regex, commstr, REG_EXTENDED | REG_NOSUB) != 0)
+                       /* Error in preparing regex structure */
+                       return -1;
+               
+               rc = regexec(&regex, (*psti)->comm, 0, NULL, 0);
+               regfree(&regex);
+
+               if (rc)
+                       /* regex pattern not found in command name */
+                       return -1;
+       }
+
+       return 1;
+}
+
+/*
+ ***************************************************************************
+ * Display PID and TID.
+ *
+ * IN:
+ * @pst                Current process statistics.
+ * @c          No-op character.
+ ***************************************************************************
+ */
+void __print_line_id(struct pid_stats *pst, char c)
+{
+       char format[32];
+
+       if (DISPLAY_TID(pidflag)) {
+               
+               if (pst->tgid) {
+                       /* This is a TID */
+                       sprintf(format, "         %c %%9u", c);
+               }
+               else {
+                       /* This is a PID (TGID) */
+                       sprintf(format, " %%9u         %c", c);
+               }
+       }
+       else {
+               strcpy(format, " %9u");
+       }
+
+       printf(format, pst->pid);
+}
+
+/*
+ ***************************************************************************
+ * Display timestamp, PID and TID.
+ *
+ * IN:
+ * @timestamp  Current timestamp.
+ * @pst                Current process statistics.
+ ***************************************************************************
+ */
+void print_line_id(char *timestamp, struct pid_stats *pst)
+{
+       printf("%-11s", timestamp);
+       
+       __print_line_id(pst, '-');
+}
+
+/*
+ ***************************************************************************
+ * Display all statistics for tasks in one line format.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @itv                Interval of time in jiffies.
+ * @g_itv      Interval of time in jiffies multiplied by the number of
+ *             processors.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_task_all_stats(int prev, int curr, int dis,
+                            unsigned long long itv,
+                            unsigned long long g_itv)
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR("#      Time", pidflag);
+               if (DISPLAY_CPU(actflag)) {
+                       printf("    %%usr %%system  %%guest    %%CPU   CPU");
+               }
+               if (DISPLAY_MEM(actflag)) {
+                       printf("  minflt/s  majflt/s     VSZ    RSS   %%MEM");
+               }
+               if (DISPLAY_STACK(actflag)) {
+                       printf(" StkSize  StkRef");
+               }
+               if (DISPLAY_IO(actflag)) {
+                       printf("   kB_rd/s   kB_wr/s kB_ccwr/s");
+               }
+               if (DISPLAY_CTXSW(actflag)) {
+                       printf("   cswch/s nvcswch/s");
+               }
+               printf("  Command\n");
+       }
+
+       for (p = 0; p < pid_nr; p++) {
+
+               if (get_pid_to_display(prev, curr, p, actflag, P_TASK,
+                                      &psti, &pstj) <= 0)
+                       continue;
+
+               printf("%11ld", (long) time(NULL));
+               __print_line_id(psti, '0');
+
+               if (DISPLAY_CPU(actflag)) {
+                       printf(" %7.2f %7.2f %7.2f %7.2f",
+                              SP_VALUE(pstj->utime - pstj->gtime,
+                                       psti->utime - psti->gtime, itv),
+                              SP_VALUE(pstj->stime,  psti->stime, itv),
+                              SP_VALUE(pstj->gtime,  psti->gtime, itv),
+                              /* User time already includes guest time */
+                              IRIX_MODE_OFF(pidflag) ?
+                              SP_VALUE(pstj->utime + pstj->stime,
+                                       psti->utime + psti->stime, g_itv) :
+                              SP_VALUE(pstj->utime + pstj->stime,
+                                       psti->utime + psti->stime, itv));
+
+                       printf("   %3d", psti->processor);
+               }
+
+
+               if (DISPLAY_MEM(actflag)) {
+                       printf(" %9.2f %9.2f %7lu %6lu %6.2f",
+                              S_VALUE(pstj->minflt, psti->minflt, itv),
+                              S_VALUE(pstj->majflt, psti->majflt, itv),
+                              psti->vsz,
+                              psti->rss,
+                              tlmkb ? SP_VALUE(0, psti->rss, tlmkb) : 0.0);
+               }
+
+               if (DISPLAY_STACK(actflag)) {
+                       printf("  %6lu  %6lu",
+                              psti->stack_size,
+                              psti->stack_ref);
+               }
+
+               if (DISPLAY_IO(actflag)) {
+                       if (!NO_PID_IO(psti->flags))
+                       {
+                               printf(" %9.2f %9.2f %9.2f",
+                                      S_VALUE(pstj->read_bytes,  psti->read_bytes, itv)  / 1024,
+                                      S_VALUE(pstj->write_bytes, psti->write_bytes, itv) / 1024,
+                                      S_VALUE(pstj->cancelled_write_bytes,
+                                              psti->cancelled_write_bytes, itv) / 1024);
+                       }
+                       else {
+                               /*
+                                * Keep the layout even though this task has no I/O
+                                * typically threads with no I/O measurements.
+                                */
+                               printf(" %9.2f %9.2f %9.2f", -1.0, -1.0, -1.0);
+                       }
+               }
+
+               if (DISPLAY_CTXSW(actflag)) {
+                       printf(" %9.2f %9.2f",
+                              S_VALUE(pstj->nvcsw, psti->nvcsw, itv),
+                              S_VALUE(pstj->nivcsw, psti->nivcsw, itv));
+               }
+               
+               print_comm(psti);
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display all statistics for tasks' children in one line format
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @itv                Interval of time in jiffies.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_child_all_stats(int prev, int curr, int dis,
+                            unsigned long long itv)
+                       
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR("#      Time", pidflag);
+               if (DISPLAY_CPU(actflag))
+                       printf("    usr-ms system-ms  guest-ms");
+               if (DISPLAY_MEM(actflag))
+                       printf(" minflt-nr majflt-nr");
+               printf("  Command\n");
+       }
+
+       for (p = 0; p < pid_nr; p++) {
+
+               if (get_pid_to_display(prev, curr, p, actflag, P_CHILD,
+                                      &psti, &pstj) <= 0)
+                       continue;
+
+               printf("%11ld", (long) time(NULL));
+               __print_line_id(psti, '0');
+
+               if (DISPLAY_CPU(actflag)) {
+                       printf(" %9.0f %9.0f %9.0f",
+                              (double) ((psti->utime + psti->cutime - psti->gtime - psti->cgtime) -
+                                        (pstj->utime + pstj->cutime - pstj->gtime - pstj->cgtime)) /
+                              HZ * 1000,
+                              (double) ((psti->stime + psti->cstime) -
+                                        (pstj->stime + pstj->cstime)) / HZ * 1000,
+                              (double) ((psti->gtime + psti->cgtime) -
+                                        (pstj->gtime + pstj->cgtime)) / HZ * 1000);
+               }
+
+
+               if (DISPLAY_MEM(actflag)) {
+                       printf(" %9lu %9lu",
+                              (psti->minflt + psti->cminflt) - (pstj->minflt + pstj->cminflt),
+                              (psti->majflt + psti->cmajflt) - (pstj->majflt + pstj->cmajflt));
+               }
+
+               print_comm(psti);
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display CPU statistics for tasks.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @disp_avg   TRUE if average stats are displayed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ * @itv                Interval of time in jiffies.
+ * @g_itv      Interval of time in jiffies multiplied by the number of
+ *             processors.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_task_cpu_stats(int prev, int curr, int dis, int disp_avg,
+                            char *prev_string, char *curr_string,
+                            unsigned long long itv,
+                            unsigned long long g_itv)
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR(prev_string, pidflag);
+               printf("    %%usr %%system  %%guest    %%CPU   CPU  Command\n");
+       }
+
+       for (p = 0; p < pid_nr; p++) {
+       
+               if (get_pid_to_display(prev, curr, p, P_A_CPU, P_TASK,
+                                      &psti, &pstj) <= 0)
+                       continue;
+       
+               print_line_id(curr_string, psti);
+               printf(" %7.2f %7.2f %7.2f %7.2f",
+                      SP_VALUE(pstj->utime - pstj->gtime,
+                               psti->utime - psti->gtime, itv),
+                      SP_VALUE(pstj->stime,  psti->stime, itv),
+                      SP_VALUE(pstj->gtime,  psti->gtime, itv),
+                      /* User time already includes guest time */
+                      IRIX_MODE_OFF(pidflag) ?
+                      SP_VALUE(pstj->utime + pstj->stime,
+                               psti->utime + psti->stime, g_itv) :
+                      SP_VALUE(pstj->utime + pstj->stime,
+                               psti->utime + psti->stime, itv));
+
+               if (!disp_avg) {
+                       printf("   %3d", psti->processor);
+               }
+               else {
+                       printf("     -");
+               }
+               print_comm(psti);
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display CPU statistics for tasks' children.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @disp_avg   TRUE if average stats are displayed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_child_cpu_stats(int prev, int curr, int dis, int disp_avg,
+                             char *prev_string, char *curr_string)
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int rc, again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR(prev_string, pidflag);
+               printf("    usr-ms system-ms  guest-ms  Command\n");
+       }
+
+       for (p = 0; p < pid_nr; p++) {
+       
+               if ((rc = get_pid_to_display(prev, curr, p, P_A_CPU, P_CHILD,
+                                            &psti, &pstj)) == 0)
+                       /* PID no longer exists */
+                       continue;
+       
+               /* This will be used to compute average */
+               if (!disp_avg) {
+                       psti->uc_asum_count = pstj->uc_asum_count + 1;
+               }
+       
+               if (rc < 0)
+                       /* PID should not be displayed */
+                       continue;
+
+               print_line_id(curr_string, psti);
+               if (disp_avg) {
+                       printf(" %9.0f %9.0f %9.0f",
+                              (double) ((psti->utime + psti->cutime - psti->gtime - psti->cgtime) -
+                                        (pstj->utime + pstj->cutime - pstj->gtime - pstj->cgtime)) /
+                              (HZ * psti->uc_asum_count) * 1000,
+                              (double) ((psti->stime + psti->cstime) -
+                                        (pstj->stime + pstj->cstime)) /
+                              (HZ * psti->uc_asum_count) * 1000,
+                              (double) ((psti->gtime + psti->cgtime) -
+                                        (pstj->gtime + pstj->cgtime)) /
+                              (HZ * psti->uc_asum_count) * 1000);
+               }
+               else {
+                       printf(" %9.0f %9.0f %9.0f",
+                              (double) ((psti->utime + psti->cutime - psti->gtime - psti->cgtime) -
+                                        (pstj->utime + pstj->cutime - pstj->gtime - pstj->cgtime)) /
+                              HZ * 1000,
+                              (double) ((psti->stime + psti->cstime) -
+                                        (pstj->stime + pstj->cstime)) / HZ * 1000,
+                              (double) ((psti->gtime + psti->cgtime) -
+                                        (pstj->gtime + pstj->cgtime)) / HZ * 1000);
+               }
+               print_comm(psti);
+               again = 1;
+       }
+       
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display memory and/or stack size statistics for tasks.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @disp_avg   TRUE if average stats are displayed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ * @itv                Interval of time in jiffies.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_task_memory_stats(int prev, int curr, int dis, int disp_avg,
+                               char *prev_string, char *curr_string,
+                               unsigned long long itv)
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int rc, again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR(prev_string, pidflag);
+               if (DISPLAY_MEM(actflag)) {
+                       printf("  minflt/s  majflt/s     VSZ    RSS   %%MEM");
+               }
+               if (DISPLAY_STACK(actflag)) {
+                       printf(" StkSize  StkRef");
+               }
+               printf("  Command\n");
+       }
+       
+       for (p = 0; p < pid_nr; p++) {
+       
+               if ((rc = get_pid_to_display(prev, curr, p, P_A_MEM, P_TASK,
+                                            &psti, &pstj)) == 0)
+                       /* PID no longer exists */
+                       continue;
+       
+               /* This will be used to compute average */
+               if (!disp_avg) {
+                       if (DISPLAY_MEM(actflag)) {
+                               psti->total_vsz = pstj->total_vsz + psti->vsz;
+                               psti->total_rss = pstj->total_rss + psti->rss;
+                       }
+                       if (DISPLAY_STACK(actflag)) {
+                               psti->total_stack_size = pstj->total_stack_size + psti->stack_size;
+                               psti->total_stack_ref  = pstj->total_stack_ref  + psti->stack_ref;
+                       }
+                       psti->rt_asum_count = pstj->rt_asum_count + 1;
+               }
+
+               if (rc < 0)
+                       /* PID should not be displayed */
+                       continue;
+
+               print_line_id(curr_string, psti);
+               
+               if (DISPLAY_MEM(actflag)) {
+                       printf(" %9.2f %9.2f ",
+                              S_VALUE(pstj->minflt, psti->minflt, itv),
+                              S_VALUE(pstj->majflt, psti->majflt, itv));
+
+                       if (disp_avg) {
+                               printf("%7.0f %6.0f %6.2f",
+                                      (double) psti->total_vsz / psti->rt_asum_count,
+                                      (double) psti->total_rss / psti->rt_asum_count,
+                                      tlmkb ?
+                                      SP_VALUE(0, psti->total_rss / psti->rt_asum_count, tlmkb)
+                                      : 0.0);
+                       }
+                       else {
+                               printf("%7lu %6lu %6.2f",
+                                      psti->vsz,
+                                      psti->rss,
+                                      tlmkb ? SP_VALUE(0, psti->rss, tlmkb) : 0.0);
+                       }
+               }
+               
+               if (DISPLAY_STACK(actflag)) {
+                       if (disp_avg) {
+                               printf("%7.0f %7.0f",
+                                      (double) psti->total_stack_size / psti->rt_asum_count,
+                                      (double) psti->total_stack_ref  / psti->rt_asum_count);
+                       }
+                       else {
+                               printf("%7lu %7lu",
+                                      psti->stack_size,
+                                      psti->stack_ref);
+                       }
+               }
+
+               print_comm(psti);
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display memory statistics for tasks' children.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @disp_avg   TRUE if average stats are displayed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_child_memory_stats(int prev, int curr, int dis, int disp_avg,
+                                char *prev_string, char *curr_string)
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int rc, again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR(prev_string, pidflag);
+               printf(" minflt-nr majflt-nr  Command\n");
+       }
+       
+       for (p = 0; p < pid_nr; p++) {
+       
+               if ((rc = get_pid_to_display(prev, curr, p, P_A_MEM, P_CHILD,
+                                            &psti, &pstj)) == 0)
+                       /* PID no longer exists */
+                       continue;
+
+               /* This will be used to compute average */
+               if (!disp_avg) {
+                       psti->rc_asum_count = pstj->rc_asum_count + 1;
+               }
+       
+               if (rc < 0)
+                       /* PID should not be displayed */
+                       continue;
+
+               print_line_id(curr_string, psti);
+               if (disp_avg) {
+                       printf(" %9.0f %9.0f",
+                              (double) ((psti->minflt + psti->cminflt) -
+                                        (pstj->minflt + pstj->cminflt)) / psti->rc_asum_count,
+                              (double) ((psti->majflt + psti->cmajflt) -
+                                        (pstj->majflt + pstj->cmajflt)) / psti->rc_asum_count);
+               }
+               else {
+                       printf(" %9lu %9lu",
+                              (psti->minflt + psti->cminflt) - (pstj->minflt + pstj->cminflt),
+                              (psti->majflt + psti->cmajflt) - (pstj->majflt + pstj->cmajflt));
+               }
+               print_comm(psti);
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display I/O statistics.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ * @itv                Interval of time in jiffies.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_io_stats(int prev, int curr, int dis,
+                      char *prev_string, char *curr_string,
+                      unsigned long long itv)
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR(prev_string, pidflag);
+               printf("   kB_rd/s   kB_wr/s kB_ccwr/s  Command\n");
+       }
+
+       for (p = 0; p < pid_nr; p++) {
+
+               if (get_pid_to_display(prev, curr, p, P_A_IO, P_NULL,
+                                      &psti, &pstj) <= 0)
+                       continue;
+       
+               print_line_id(curr_string, psti);
+               printf(" %9.2f %9.2f %9.2f",
+                      S_VALUE(pstj->read_bytes,  psti->read_bytes, itv)  / 1024,
+                      S_VALUE(pstj->write_bytes, psti->write_bytes, itv) / 1024,
+                      S_VALUE(pstj->cancelled_write_bytes,
+                              psti->cancelled_write_bytes, itv) / 1024);
+               print_comm(psti);
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display context switches statistics.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ * @itv                Interval of time in jiffies.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_pid_ctxswitch_stats(int prev, int curr, int dis,
+                             char *prev_string, char *curr_string,
+                             unsigned long long itv)
+{
+       struct pid_stats *psti, *pstj;
+       unsigned int p;
+       int again = 0;
+
+       if (dis) {
+               PRINT_ID_HDR(prev_string, pidflag);
+               printf("   cswch/s nvcswch/s  Command\n");
+       }
+
+       for (p = 0; p < pid_nr; p++) {
+       
+               if (get_pid_to_display(prev, curr, p, P_A_CTXSW, P_NULL,
+                                      &psti, &pstj) <= 0)
+                       continue;
+       
+               print_line_id(curr_string, psti);
+               printf(" %9.2f %9.2f",
+                      S_VALUE(pstj->nvcsw, psti->nvcsw, itv),
+                      S_VALUE(pstj->nivcsw, psti->nivcsw, itv));
+               print_comm(psti);
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Display statistics.
+ *
+ * IN:
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ * @disp_avg   TRUE if average stats are displayed.
+ * @prev_string        String displayed at the beginning of a header line. This is
+ *             the timestamp of the previous sample, or "Average" when
+ *             displaying average stats.
+ * @curr_string        String displayed at the beginning of current sample stats.
+ *             This is the timestamp of the current sample, or "Average"
+ *             when displaying average stats.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_stats_core(int prev, int curr, int dis, int disp_avg,
+                    char *prev_string, char *curr_string)
+{
+       unsigned long long itv, g_itv;
+       int again = 0;
+
+       /* Test stdout */
+       TEST_STDOUT(STDOUT_FILENO);
+
+       /* g_itv is multiplied by the number of processors */
+       g_itv = get_interval(uptime[prev], uptime[curr]);
+
+       if (cpu_nr > 1) {
+               /* SMP machines */
+               itv = get_interval(uptime0[prev], uptime0[curr]);
+       }
+       else {
+               /* UP machines */
+               itv = g_itv;
+       }
+
+       if (DISPLAY_ONELINE(pidflag)) {
+               if (DISPLAY_TASK_STATS(tskflag)) {
+                       again += write_pid_task_all_stats(prev, curr, dis,
+                                                        itv, g_itv);
+               }
+               if (DISPLAY_CHILD_STATS(tskflag)) {
+                       again += write_pid_child_all_stats(prev, curr, dis, itv);
+               }
+       }
+       else {
+               /* Display CPU stats */
+               if (DISPLAY_CPU(actflag)) {
+
+                       if (DISPLAY_TASK_STATS(tskflag)) {
+                               again += write_pid_task_cpu_stats(prev, curr, dis, disp_avg,
+                                                                 prev_string, curr_string,
+                                                                 itv, g_itv);
+                       }
+                       if (DISPLAY_CHILD_STATS(tskflag)) {
+                               again += write_pid_child_cpu_stats(prev, curr, dis, disp_avg,
+                                                                  prev_string, curr_string);
+                       }
+               }
+
+               /* Display memory and/or stack stats */
+               if (DISPLAY_MEM(actflag) || DISPLAY_STACK(actflag)) {
+
+                       if (DISPLAY_TASK_STATS(tskflag)) {
+                               again += write_pid_task_memory_stats(prev, curr, dis, disp_avg,
+                                                                    prev_string, curr_string, itv);
+                       }
+                       if (DISPLAY_CHILD_STATS(tskflag) && DISPLAY_MEM(actflag)) {
+                               again += write_pid_child_memory_stats(prev, curr, dis, disp_avg,
+                                                                     prev_string, curr_string);
+                       }
+               }
+
+               /* Display I/O stats */
+               if (DISPLAY_IO(actflag)) {
+                       again += write_pid_io_stats(prev, curr, dis, prev_string,
+                                                   curr_string, itv);
+               }
+
+               /* Display context switches stats */
+               if (DISPLAY_CTXSW(actflag)) {
+                       again += write_pid_ctxswitch_stats(prev, curr, dis, prev_string,
+                                                          curr_string, itv);
+               }
+       }
+
+       if (DISPLAY_ALL_PID(pidflag)) {
+               again = 1;
+       }
+
+       return again;
+}
+
+/*
+ ***************************************************************************
+ * Print statistics average.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ ***************************************************************************
+ */
+void write_stats_avg(int curr, int dis)
+{
+       char string[16];
+
+       strcpy(string, _("Average:"));
+       write_stats_core(2, curr, dis, TRUE, string, string);
+}
+
+/*
+ ***************************************************************************
+ * Get previous and current timestamps, then display statistics.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @dis                TRUE if a header line must be printed.
+ *
+ * RETURNS:
+ * 0 if all the processes to display have terminated.
+ * <> 0 if there are still some processes left to display.
+ ***************************************************************************
+ */
+int write_stats(int curr, int dis)
+{
+       char cur_time[2][16];
+
+       /* Get previous timestamp */
+       strftime(cur_time[!curr], 16, "%X", &ps_tstamp[!curr]);
+
+       /* Get current timestamp */
+       strftime(cur_time[curr], 16, "%X", &ps_tstamp[curr]);
+
+       return (write_stats_core(!curr, curr, dis, FALSE,
+                                cur_time[!curr], cur_time[curr]));
+}
+
+/*
+ ***************************************************************************
+ * Main loop: Read and display PID stats.
+ *
+ * IN:
+ * @dis_hdr    Set to TRUE if the header line must always be printed.
+ * @rows       Number of rows of screen.
+ ***************************************************************************
+ */
+void rw_pidstat_loop(int dis_hdr, int rows)
+{
+       int curr = 1, dis = 1;
+       int again;
+       unsigned long lines = rows;
+
+       /* Don't buffer data if redirected to a pipe */
+       setbuf(stdout, NULL);
+       
+       if (cpu_nr > 1) {
+               /*
+                * Read system uptime (only for SMP machines).
+                * Init uptime0. So if /proc/uptime cannot fill it, this will be
+                * done by /proc/stat.
+                */
+               uptime0[0] = 0;
+               read_uptime(&uptime0[0]);
+       }
+       read_stats(0);
+
+       if (DISPLAY_MEM(actflag)) {
+               /* Get total memory */
+               read_proc_meminfo();
+       }
+
+       if (!interval) {
+               /* Display since boot time */
+               ps_tstamp[1] = ps_tstamp[0];
+               memset(st_pid_list[1], 0, PID_STATS_SIZE * pid_nr);
+               write_stats(0, DISP_HDR);
+               exit(0);
+       }
+
+       /* Set a handler for SIGALRM */
+       alarm_handler(0);
+
+       /* Save the first stats collected. Will be used to compute the average */
+       ps_tstamp[2] = ps_tstamp[0];
+       uptime[2] = uptime[0];
+       uptime0[2] = uptime0[0];
+       memcpy(st_pid_list[2], st_pid_list[0], PID_STATS_SIZE * pid_nr);
+
+       pause();
+
+       do {
+               /* Get time */
+               get_localtime(&ps_tstamp[curr]);
+
+               if (cpu_nr > 1) {
+                       /*
+                        * Read system uptime (only for SMP machines).
+                        * Init uptime0. So if /proc/uptime cannot fill it, this will be
+                        * done by /proc/stat.
+                        */
+                       uptime0[curr] = 0;
+                       read_uptime(&(uptime0[curr]));
+               }
+
+               /* Read stats */
+               read_stats(curr);
+
+               if (!dis_hdr) {
+                       dis = lines / rows;
+                       if (dis) {
+                               lines %= rows;
+                       }
+                       lines++;
+               }
+
+               /* Print results */
+               again = write_stats(curr, dis);
+
+               if (!again)
+                       return;
+
+               if (count > 0) {
+                       count--;
+               }
+
+               if (count) {
+                       curr ^= 1;
+                       pause();
+               }
+       }
+       while (count);
+
+       /*
+        * The one line format uses a raw time value rather than time strings
+        * so the average doesn't really fit.
+        */
+       if (!DISPLAY_ONELINE(pidflag))
+       {
+               /* Write stats average */
+               write_stats_avg(curr, dis_hdr);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the pidstat program.
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int opt = 1, dis_hdr = -1;
+       int i;
+       unsigned int pid;
+       struct utsname header;
+       int rows = 23;
+       char *t;
+
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       /* Get HZ */
+       get_HZ();
+
+       /* Compute page shift in kB */
+       get_kb_shift();
+       
+       /* Allocate structures for device list */
+       if (argc > 1) {
+               salloc_pid_array((argc / 2) + count_csvalues(argc, argv));
+       }
+
+       /* Process args... */
+       while (opt < argc) {
+
+               if (!strcmp(argv[opt], "-p")) {
+                       pidflag |= P_D_PID;
+                       if (argv[++opt]) {
+
+                               for (t = strtok(argv[opt], ","); t; t = strtok(NULL, ",")) {
+                                       if (!strcmp(t, K_ALL)) {
+                                               pidflag |= P_D_ALL_PID;
+                                       }
+                                       else if (!strcmp(t, K_SELF)) {
+                                               update_pid_array(&pid_array_nr, getpid());
+                                       }
+                                       else {
+                                               if (strspn(t, DIGITS) != strlen(t)) {
+                                                       usage(argv[0]);
+                                               }
+                                               pid = atoi(t);
+                                               if (pid < 1) {
+                                                       usage(argv[0]);
+                                               }
+                                               update_pid_array(&pid_array_nr, pid);
+                                       }
+                               }
+                               opt++;
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-C")) {
+                       if (argv[++opt]) {
+                               strncpy(commstr, argv[opt++], MAX_COMM_LEN);
+                               commstr[MAX_COMM_LEN - 1] = '\0';
+                               pidflag |= P_F_COMMSTR;
+                               if (!strlen(commstr)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-T")) {
+                       if (argv[++opt]) {
+                               if (tskflag) {
+                                       dis_hdr++;
+                               }
+                               if (!strcmp(argv[opt], K_P_TASK)) {
+                                       tskflag |= P_TASK;
+                               }
+                               else if (!strcmp(argv[opt], K_P_CHILD)) {
+                                       tskflag |= P_CHILD;
+                               }
+                               else if (!strcmp(argv[opt], K_P_ALL)) {
+                                       tskflag |= P_TASK + P_CHILD;
+                                       dis_hdr++;
+                               }
+                               else {
+                                       usage(argv[0]);
+                               }
+                               opt++;
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strncmp(argv[opt], "-", 1)) {
+                       for (i = 1; *(argv[opt] + i); i++) {
+
+                               switch (*(argv[opt] + i)) {
+
+                               case 'd':
+                                       /* Display I/O usage */
+                                       actflag |= P_A_IO;
+                                       dis_hdr++;
+                                       break;
+                                       
+                               case 'h':
+                                       /* Display stats on one line */
+                                       pidflag |= P_D_ONELINE;
+                                       break;
+
+                               case 'I':
+                                       /* IRIX mode off */
+                                       pidflag |= P_F_IRIX_MODE;
+                                       break;
+                                       
+                               case 'l':
+                                       /* Display whole command line */
+                                       pidflag |= P_D_CMDLINE;
+                                       break;
+       
+                               case 'r':
+                                       /* Display memory usage */
+                                       actflag |= P_A_MEM;
+                                       dis_hdr++;
+                                       break;
+                                       
+                               case 's':
+                                       /* Display stack sizes */
+                                       actflag |= P_A_STACK;
+                                       dis_hdr++;
+                                       break;
+       
+                               case 't':
+                                       /* Display stats for threads */
+                                       pidflag |= P_D_TID;
+                                       break;
+
+                               case 'u':
+                                       /* Display CPU usage */
+                                       actflag |= P_A_CPU;
+                                       dis_hdr++;
+                                       break;
+
+                               case 'V':
+                                       /* Print version number and exit */
+                                       print_version();
+                                       break;
+
+                               case 'w':
+                                       /* Display context switches */
+                                       actflag |= P_A_CTXSW;
+                                       dis_hdr++;
+                                       break;
+       
+                               default:
+                                       usage(argv[0]);
+                               }
+                       }
+                       opt++;
+               }
+
+               else if (interval < 0) {        /* Get interval */
+                       if (strspn(argv[opt], DIGITS) != strlen(argv[opt])) {
+                               usage(argv[0]);
+                       }
+                       interval = atol(argv[opt++]);
+                       if (interval < 0) {
+                               usage(argv[0]);
+                       }
+                       count = -1;
+               }
+
+               else if (count <= 0) {  /* Get count value */
+                       if ((strspn(argv[opt], DIGITS) != strlen(argv[opt])) ||
+                           !interval) {
+                               usage(argv[0]);
+                       }
+                       count = atol(argv[opt++]);
+                       if (count < 1) {
+                               usage(argv[0]);
+                       }
+               }
+               else {
+                       usage(argv[0]);
+               }
+       }
+
+       if (interval < 0) {
+               /* Interval not set => display stats since boot time */
+               interval = 0;
+       }
+
+       /* Check flags and set default values */
+       check_flags();
+
+       /* Init structures */
+       pid_sys_init();
+
+       if (dis_hdr < 0) {
+               dis_hdr = 0;
+       }
+       if (!dis_hdr) {
+               if (pid_nr > 1) {
+                       dis_hdr = 1;
+               }
+               else {
+                       rows = get_win_height();
+               }
+       }
+
+       /* Get time */
+       get_localtime(&(ps_tstamp[0]));
+
+       /* Get system name, release number and hostname */
+       uname(&header);
+       print_gal_header(&(ps_tstamp[0]), header.sysname, header.release,
+                        header.nodename, header.machine, cpu_nr);
+
+       /* Main loop */
+       rw_pidstat_loop(dis_hdr, rows);
+       
+       /* Free structures */
+       if (pid_array) {
+               free(pid_array);
+       }
+       sfree_pid();
+
+       return 0;
+}
diff --git a/pidstat.h b/pidstat.h
new file mode 100644 (file)
index 0000000..e2fe323
--- /dev/null
+++ b/pidstat.h
@@ -0,0 +1,129 @@
+/*
+ * pidstat: Display per-process statistics.
+ * (C) 2007-2009 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _PIDSTAT_H
+#define _PIDSTAT_H
+
+
+#define K_SELF         "SELF"
+
+#define K_P_TASK       "TASK"
+#define K_P_CHILD      "CHILD"
+#define K_P_ALL                "ALL"
+
+#define NR_PID_PREALLOC        10
+
+#define MAX_COMM_LEN   128
+#define MAX_CMDLINE_LEN        128
+
+/* Activities */
+#define P_A_CPU                0x01
+#define P_A_MEM                0x02
+#define P_A_IO         0x04
+#define P_A_CTXSW      0x08
+#define P_A_STACK      0x10
+
+#define DISPLAY_CPU(m)         (((m) & P_A_CPU) == P_A_CPU)
+#define DISPLAY_MEM(m)         (((m) & P_A_MEM) == P_A_MEM)
+#define DISPLAY_IO(m)          (((m) & P_A_IO) == P_A_IO)
+#define DISPLAY_CTXSW(m)       (((m) & P_A_CTXSW) == P_A_CTXSW)
+#define DISPLAY_STACK(m)       (((m) & P_A_STACK) == P_A_STACK)
+
+/* TASK/CHILD */
+#define P_NULL         0x00
+#define P_TASK         0x01
+#define P_CHILD                0x02
+
+#define DISPLAY_TASK_STATS(m)  (((m) & P_TASK) == P_TASK)
+#define DISPLAY_CHILD_STATS(m) (((m) & P_CHILD) == P_CHILD)
+
+#define P_D_PID                0x001
+#define P_D_ALL_PID    0x002
+#define P_F_IRIX_MODE  0x004
+#define P_F_COMMSTR    0x008
+#define P_D_ACTIVE_PID 0x010
+#define P_D_TID                0x020
+#define P_D_ONELINE    0x040
+#define P_D_CMDLINE    0x080
+
+#define DISPLAY_PID(m)         (((m) & P_D_PID) == P_D_PID)
+#define DISPLAY_ALL_PID(m)     (((m) & P_D_ALL_PID) == P_D_ALL_PID)
+#define IRIX_MODE_OFF(m)       (((m) & P_F_IRIX_MODE) == P_F_IRIX_MODE)
+#define COMMAND_STRING(m)      (((m) & P_F_COMMSTR) == P_F_COMMSTR)
+#define DISPLAY_ACTIVE_PID(m)  (((m) & P_D_ACTIVE_PID) == P_D_ACTIVE_PID)
+#define DISPLAY_TID(m)         (((m) & P_D_TID) == P_D_TID)
+#define DISPLAY_ONELINE(m)     (((m) & P_D_ONELINE) == P_D_ONELINE)
+#define DISPLAY_CMDLINE(m)     (((m) & P_D_CMDLINE) == P_D_CMDLINE)
+
+#define F_NO_PID_IO    0x01
+
+#define NO_PID_IO(m)           (((m) & F_NO_PID_IO) == F_NO_PID_IO)
+
+#define PROC           "/proc"
+
+#define PROC_PID       "/proc/%u"
+#define PID_STAT       "/proc/%u/stat"
+#define PID_STATUS     "/proc/%u/status"
+#define PID_IO         "/proc/%u/io"
+#define PID_CMDLINE    "/proc/%u/cmdline"
+#define PID_SMAP       "/proc/%u/smaps"
+
+#define PROC_TASK      "/proc/%u/task"
+#define TASK_STAT      "/proc/%u/task/%u/stat"
+#define TASK_STATUS    "/proc/%u/task/%u/status"
+#define TASK_IO                "/proc/%u/task/%u/io"
+#define TASK_CMDLINE   "/proc/%u/task/%u/cmdline"
+#define TASK_SMAP      "/proc/%u/task/%u/smaps"
+
+#define PRINT_ID_HDR(_timestamp_, _flag_)      do {                                            \
+                                                       printf("\n%-11s", _timestamp_);         \
+                                                       if (DISPLAY_TID(_flag_)) {              \
+                                                               printf("      TGID       TID"); \
+                                                       }                                       \
+                                                       else {                                  \
+                                                               printf("       PID");           \
+                                                       }                                       \
+                                               } while (0)
+
+struct pid_stats {
+       unsigned long long read_bytes                   __attribute__ ((aligned (8)));
+       unsigned long long write_bytes                  __attribute__ ((packed));
+       unsigned long long cancelled_write_bytes        __attribute__ ((packed));
+       unsigned long long total_vsz                    __attribute__ ((packed));
+       unsigned long long total_rss                    __attribute__ ((packed));
+       unsigned long long total_stack_size             __attribute__ ((packed));
+       unsigned long long total_stack_ref              __attribute__ ((packed));
+       unsigned long      minflt                       __attribute__ ((packed));
+       unsigned long      cminflt                      __attribute__ ((packed));
+       unsigned long      majflt                       __attribute__ ((packed));
+       unsigned long      cmajflt                      __attribute__ ((packed));
+       unsigned long      utime                        __attribute__ ((packed));
+       unsigned long      cutime                       __attribute__ ((packed));
+       unsigned long      stime                        __attribute__ ((packed));
+       unsigned long      cstime                       __attribute__ ((packed));
+       unsigned long      gtime                        __attribute__ ((packed));
+       unsigned long      cgtime                       __attribute__ ((packed));
+       unsigned long      vsz                          __attribute__ ((packed));
+       unsigned long      rss                          __attribute__ ((packed));
+       unsigned long      nvcsw                        __attribute__ ((packed));
+       unsigned long      nivcsw                       __attribute__ ((packed));
+       unsigned long      stack_size                   __attribute__ ((packed));
+       unsigned long      stack_ref                    __attribute__ ((packed));
+       /* If pid is null, the process has terminated */
+       unsigned int       pid                          __attribute__ ((packed));
+       /* If tgid is not null, then this PID is in fact a TID */
+       unsigned int       tgid                         __attribute__ ((packed));
+       unsigned int       rt_asum_count                __attribute__ ((packed));
+       unsigned int       rc_asum_count                __attribute__ ((packed));
+       unsigned int       uc_asum_count                __attribute__ ((packed));
+       unsigned int       processor                    __attribute__ ((packed));
+       unsigned int       flags                        __attribute__ ((packed));
+       char               comm[MAX_COMM_LEN];
+       char               cmdline[MAX_CMDLINE_LEN];
+};
+
+#define PID_STATS_SIZE (sizeof(struct pid_stats))
+
+#endif  /* _PIDSTAT_H */
diff --git a/pr_stats.c b/pr_stats.c
new file mode 100644 (file)
index 0000000..5e7f092
--- /dev/null
@@ -0,0 +1,2127 @@
+/*
+ * pr_stats.c: Functions used by sar to display statistics
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "sa.h"
+#include "ioconf.h"
+#include "pr_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+extern unsigned int flags;
+extern int  dis;
+extern char timestamp[][TIMESTAMP_LEN];
+extern unsigned long avg_count;
+
+/*
+ ***************************************************************************
+ * Display CPU statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @g_itv      Interval of time in jiffies multiplied by the number
+ *             of processors.
+ ***************************************************************************
+ */
+__print_funct_t print_cpu_stats(struct activity *a, int prev, int curr,
+                               unsigned long long g_itv)
+{
+       int i;
+       struct stats_cpu *scc, *scp;
+
+       if (dis) {
+               if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                       printf("\n%-11s     CPU     %%user     %%nice   %%system"
+                              "   %%iowait    %%steal     %%idle\n",
+                              timestamp[!curr]);
+               }
+               else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                       printf("\n%-11s     CPU      %%usr     %%nice      %%sys"
+                              "   %%iowait    %%steal      %%irq     %%soft"
+                              "    %%guest     %%idle\n",
+                              timestamp[!curr]);
+               }
+       }
+       
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+               
+               /*
+                * The size of a->buf[...] CPU structure may be different from the default
+                * sizeof(struct stats_cpu) value if data have been read from a file!
+                * That's why we don't use a syntax like:
+                * scc = (struct stats_cpu *) a->buf[...] + i;
+                */
+               scc = (struct stats_cpu *) ((char *) a->buf[curr] + i * a->msize);
+               scp = (struct stats_cpu *) ((char *) a->buf[prev] + i * a->msize);
+
+               /*
+                * Note: a->nr is in [1, NR_CPUS + 1].
+                * Bitmap size is provided for (NR_CPUS + 1) CPUs.
+                * Anyway, NR_CPUS may vary between the version of sysstat
+                * used by sadc to create a file, and the version of sysstat
+                * used by sar to read it...
+                */
+               
+               /* Should current CPU (including CPU "all") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+                       
+                       /* Yes: Display it */
+                       printf("%-11s", timestamp[curr]);
+                       
+                       if (!i) {
+                               /* This is CPU "all" */
+                               printf("     all");
+                       }
+                       else {
+                               printf("     %3d", i - 1);
+
+                               /*
+                                * If the CPU is offline then it is omited from /proc/stat:
+                                * All the fields couldn't have been read and the sum of them is zero.
+                                * (Remember that guest time is already included in user mode.)
+                                */
+                               if ((scc->cpu_user    + scc->cpu_nice + scc->cpu_sys   +
+                                    scc->cpu_iowait  + scc->cpu_idle + scc->cpu_steal +
+                                    scc->cpu_hardirq + scc->cpu_softirq) == 0) {
+                                       /*
+                                        * Set current struct fields (which have been set to zero)
+                                        * to values from previous iteration. Hence their values won't
+                                        * jump from zero when the CPU comes back online.
+                                        */
+                                       *scc = *scp;
+                                       
+                                       printf("    %6.2f    %6.2f    %6.2f"
+                                              "    %6.2f    %6.2f    %6.2f",
+                                              0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+                                       
+                                       if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                               printf("    %6.2f    %6.2f    %6.2f",
+                                                      0.0, 0.0, 0.0);
+                                       }
+                                       printf("\n");
+                                       continue;
+                               }
+                               
+                               /* Recalculate interval for current proc */
+                               g_itv = get_per_cpu_interval(scc, scp);
+                               
+                               if (!g_itv) {
+                                       /*
+                                        * If the CPU is tickless then there is no change in CPU values
+                                        * but the sum of values is not zero.
+                                        */
+                                       printf("    %6.2f    %6.2f    %6.2f"
+                                              "    %6.2f    %6.2f",
+                                              0.0, 0.0, 0.0, 0.0, 0.0);
+
+                                       if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                                               printf("    %6.2f\n", 100.0);
+                                       }
+                                       else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                               printf("    %6.2f    %6.2f    %6.2f    %6.2f\n",
+                                                      0.0, 0.0, 0.0, 100.0);
+                                       }
+                                       continue;
+                               }
+                       }
+                       
+                       if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                               printf("    %6.2f    %6.2f    %6.2f    %6.2f    %6.2f    %6.2f\n",
+                                      ll_sp_value(scp->cpu_user,   scc->cpu_user,   g_itv),
+                                      ll_sp_value(scp->cpu_nice,   scc->cpu_nice,   g_itv),
+                                      ll_sp_value(scp->cpu_sys + scp->cpu_hardirq + scp->cpu_softirq,
+                                                  scc->cpu_sys + scc->cpu_hardirq + scc->cpu_softirq,
+                                                  g_itv),
+                                      ll_sp_value(scp->cpu_iowait, scc->cpu_iowait, g_itv),
+                                      ll_sp_value(scp->cpu_steal,  scc->cpu_steal,  g_itv),
+                                      scc->cpu_idle < scp->cpu_idle ?
+                                      0.0 :
+                                      ll_sp_value(scp->cpu_idle,   scc->cpu_idle,   g_itv));
+                       }
+                       else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                               printf("    %6.2f    %6.2f    %6.2f    %6.2f    %6.2f    %6.2f"
+                                      "    %6.2f    %6.2f    %6.2f\n",
+                                      ll_sp_value(scp->cpu_user - scp->cpu_guest,
+                                                  scc->cpu_user - scc->cpu_guest,     g_itv),
+                                      ll_sp_value(scp->cpu_nice,    scc->cpu_nice,    g_itv),
+                                      ll_sp_value(scp->cpu_sys,     scc->cpu_sys,     g_itv),
+                                      ll_sp_value(scp->cpu_iowait,  scc->cpu_iowait,  g_itv),
+                                      ll_sp_value(scp->cpu_steal,   scc->cpu_steal,   g_itv),
+                                      ll_sp_value(scp->cpu_hardirq, scc->cpu_hardirq, g_itv),
+                                      ll_sp_value(scp->cpu_softirq, scc->cpu_softirq, g_itv),
+                                      ll_sp_value(scp->cpu_guest,   scc->cpu_guest,   g_itv),
+                                      scc->cpu_idle < scp->cpu_idle ?
+                                      0.0 :
+                                      ll_sp_value(scp->cpu_idle,    scc->cpu_idle,    g_itv));
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display tasks creation and context switches statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_pcsw_stats(struct activity *a, int prev, int curr,
+                                unsigned long long itv)
+{
+       struct stats_pcsw
+               *spc = (struct stats_pcsw *) a->buf[curr],
+               *spp = (struct stats_pcsw *) a->buf[prev];
+       
+       if (dis) {
+               printf("\n%-11s    proc/s   cswch/s\n", timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f\n", timestamp[curr],
+              S_VALUE   (spp->processes,      spc->processes,      itv),
+              ll_s_value(spp->context_switch, spc->context_switch, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display interrupts statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_irq_stats(struct activity *a, int prev, int curr,
+                               unsigned long long itv)
+{
+       int i;
+       struct stats_irq *sic, *sip;
+       
+       if (dis) {
+               printf("\n%-11s      INTR    intr/s\n", timestamp[!curr]);
+       }
+       
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+
+               sic = (struct stats_irq *) ((char *) a->buf[curr] + i * a->msize);
+               sip = (struct stats_irq *) ((char *) a->buf[prev] + i * a->msize);
+               
+               /*
+                * Note: a->nr is in [0, NR_IRQS + 1].
+                * Bitmap size is provided for (NR_IRQS + 1) interrupts.
+                * Anyway, NR_IRQS may vary between the version of sysstat
+                * used by sadc to create a file, and the version of sysstat
+                * used by sar to read it...
+                */
+               
+               /* Should current interrupt (including int "sum") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+                       
+                       /* Yes: Display it */
+                       printf("%-11s", timestamp[curr]);
+                       if (!i) {
+                               /* This is interrupt "sum" */
+                               printf("       sum");
+                       }
+                       else {
+                               printf("       %3d", i - 1);
+                       }
+
+                       printf(" %9.2f\n",
+                              ll_s_value(sip->irq_nr, sic->irq_nr, itv));
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display swapping statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_swap_stats(struct activity *a, int prev, int curr,
+                                unsigned long long itv)
+{
+       struct stats_swap
+               *ssc = (struct stats_swap *) a->buf[curr],
+               *ssp = (struct stats_swap *) a->buf[prev];
+       
+       if (dis) {
+               printf("\n%-11s  pswpin/s pswpout/s\n", timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f\n", timestamp[curr],
+              S_VALUE(ssp->pswpin,  ssc->pswpin,  itv),
+              S_VALUE(ssp->pswpout, ssc->pswpout, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display paging statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_paging_stats(struct activity *a, int prev, int curr,
+                                  unsigned long long itv)
+{
+       struct stats_paging
+               *spc = (struct stats_paging *) a->buf[curr],
+               *spp = (struct stats_paging *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s"
+                      " pgscank/s pgscand/s pgsteal/s    %%vmeff\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(spp->pgpgin,        spc->pgpgin,        itv),
+              S_VALUE(spp->pgpgout,       spc->pgpgout,       itv),
+              S_VALUE(spp->pgfault,       spc->pgfault,       itv),
+              S_VALUE(spp->pgmajfault,    spc->pgmajfault,    itv),
+              S_VALUE(spp->pgfree,        spc->pgfree,        itv),
+              S_VALUE(spp->pgscan_kswapd, spc->pgscan_kswapd, itv),
+              S_VALUE(spp->pgscan_direct, spc->pgscan_direct, itv),
+              S_VALUE(spp->pgsteal,       spc->pgsteal,       itv),
+              (spc->pgscan_kswapd + spc->pgscan_direct -
+               spp->pgscan_kswapd - spp->pgscan_direct) ?
+              SP_VALUE(spp->pgsteal, spc->pgsteal,
+                       spc->pgscan_kswapd + spc->pgscan_direct -
+                       spp->pgscan_kswapd - spp->pgscan_direct) : 0.0);
+}
+
+/*
+ ***************************************************************************
+ * Display I/O and transfer rate statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_io_stats(struct activity *a, int prev, int curr,
+                              unsigned long long itv)
+{
+       struct stats_io
+               *sic = (struct stats_io *) a->buf[curr],
+               *sip = (struct stats_io *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s       tps      rtps      wtps   bread/s   bwrtn/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f\n", timestamp[curr],
+              S_VALUE(sip->dk_drive,      sic->dk_drive,      itv),
+              S_VALUE(sip->dk_drive_rio,  sic->dk_drive_rio,  itv),
+              S_VALUE(sip->dk_drive_wio,  sic->dk_drive_wio,  itv),
+              S_VALUE(sip->dk_drive_rblk, sic->dk_drive_rblk, itv),
+              S_VALUE(sip->dk_drive_wblk, sic->dk_drive_wblk, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display memory and swap statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ * @dispavg    TRUE if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_memory_stats(struct activity *a, int prev, int curr,
+                            unsigned long long itv, int dispavg)
+{
+       struct stats_memory
+               *smc = (struct stats_memory *) a->buf[curr],
+               *smp = (struct stats_memory *) a->buf[prev];
+       static unsigned long long
+               avg_frmkb = 0,
+               avg_bufkb = 0,
+               avg_camkb = 0,
+               avg_comkb = 0;
+       static unsigned long long
+               avg_frskb = 0,
+               avg_tlskb = 0,
+               avg_caskb = 0;
+       
+       if (DISPLAY_MEMORY(a->opt_flags)) {
+               if (dis) {
+                       printf("\n%-11s   frmpg/s   bufpg/s   campg/s\n",
+                              timestamp[!curr]);
+               }
+
+               printf("%-11s %9.2f %9.2f %9.2f\n", timestamp[curr],
+                      S_VALUE((double) KB_TO_PG(smp->frmkb), (double) KB_TO_PG(smc->frmkb), itv),
+                      S_VALUE((double) KB_TO_PG(smp->bufkb), (double) KB_TO_PG(smc->bufkb), itv),
+                      S_VALUE((double) KB_TO_PG(smp->camkb), (double) KB_TO_PG(smc->camkb), itv));
+       }
+       
+       if (DISPLAY_MEM_AMT(a->opt_flags)) {
+               if (dis) {
+                       printf("\n%-11s kbmemfree kbmemused  %%memused kbbuffers  kbcached"
+                              "  kbcommit   %%commit\n", timestamp[!curr]);
+               }
+
+               if (!dispavg) {
+                       /* Display instantaneous values */
+                       printf("%-11s %9lu %9lu    %6.2f %9lu %9lu %9lu   %7.2f\n",
+                              timestamp[curr],
+                              smc->frmkb,
+                              smc->tlmkb - smc->frmkb,
+                              smc->tlmkb ?
+                              SP_VALUE(smc->frmkb, smc->tlmkb, smc->tlmkb) : 0.0,
+                              smc->bufkb,
+                              smc->camkb,
+                              smc->comkb,
+                              (smc->tlmkb + smc->tlskb) ?
+                              SP_VALUE(0, smc->comkb, smc->tlmkb + smc->tlskb) : 0.0);
+
+                       /*
+                        * Will be used to compute the average.
+                        * We assume that the total amount of memory installed can not vary
+                        * during the interval given on the command line.
+                        */
+                       avg_frmkb += smc->frmkb;
+                       avg_bufkb += smc->bufkb;
+                       avg_camkb += smc->camkb;
+                       avg_comkb += smc->comkb;
+               }
+               else {
+                       /* Display average values */
+                       printf("%-11s %9.0f %9.0f    %6.2f %9.0f %9.0f %9.0f   %7.2f\n",
+                              timestamp[curr],
+                              (double) avg_frmkb / avg_count,
+                              (double) smc->tlmkb - ((double) avg_frmkb / avg_count),
+                              smc->tlmkb ?
+                              SP_VALUE((double) (avg_frmkb / avg_count), smc->tlmkb,
+                                       smc->tlmkb) :
+                              0.0,
+                              (double) avg_bufkb / avg_count,
+                              (double) avg_camkb / avg_count,
+                              (double) avg_comkb / avg_count,
+                              (smc->tlmkb + smc->tlskb) ?
+                              SP_VALUE(0.0, (double) (avg_comkb / avg_count),
+                                       smc->tlmkb + smc->tlskb) :
+                              0.0);
+                       
+                       /* Reset average counters */
+                       avg_frmkb = avg_bufkb = avg_camkb = avg_comkb = 0;
+               }
+       }
+       
+       if (DISPLAY_SWAP(a->opt_flags)) {
+               if (dis) {
+                       printf("\n%-11s kbswpfree kbswpused  %%swpused  kbswpcad   %%swpcad\n",
+                              timestamp[!curr]);
+               }
+
+               if (!dispavg) {
+                       /* Display instantaneous values */
+                       printf("%-11s %9lu %9lu    %6.2f %9lu    %6.2f\n",
+                              timestamp[curr],
+                              smc->frskb,
+                              smc->tlskb - smc->frskb,
+                              smc->tlskb ?
+                              SP_VALUE(smc->frskb, smc->tlskb, smc->tlskb) : 0.0,
+                              smc->caskb,
+                              (smc->tlskb - smc->frskb) ?
+                              SP_VALUE(0, smc->caskb, smc->tlskb - smc->frskb) : 0.0);
+
+                       /*
+                        * Will be used to compute the average.
+                        * We assume that the total amount of swap space may vary.
+                        */
+                       avg_frskb += smc->frskb;
+                       avg_tlskb += smc->tlskb;
+                       avg_caskb += smc->caskb;
+               }
+               else {
+                       /* Display average values */
+                       printf("%-11s %9.0f %9.0f    %6.2f %9.0f    %6.2f\n",
+                              timestamp[curr],
+                              (double) avg_frskb / avg_count,
+                              ((double) avg_tlskb / avg_count) -
+                              ((double) avg_frskb / avg_count),
+                              ((double) (avg_tlskb / avg_count)) ?
+                              SP_VALUE((double) (avg_frskb / avg_count),
+                                       (double) (avg_tlskb / avg_count),
+                                       (double) (avg_tlskb / avg_count)) :
+                              0.0,
+                              (double) (avg_caskb / avg_count),
+                              (((double) avg_tlskb / avg_count) -
+                               ((double) avg_frskb / avg_count)) ?
+                              SP_VALUE(0.0, (double) (avg_caskb / avg_count),
+                                       ((double) avg_tlskb / avg_count) -
+                                       ((double) avg_frskb / avg_count)) :
+                              0.0);
+                       
+                       /* Reset average counters */
+                       avg_frskb = avg_tlskb = avg_caskb = 0;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display memory and swap statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_memory_stats(struct activity *a, int prev, int curr,
+                                  unsigned long long itv)
+{
+       stub_print_memory_stats(a, prev, curr, itv, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average memory statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_memory_stats(struct activity *a, int prev, int curr,
+                                      unsigned long long itv)
+{
+       stub_print_memory_stats(a, prev, curr, itv, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display kernel tables statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dispavg    True if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_ktables_stats(struct activity *a, int prev, int curr, int dispavg)
+{
+       struct stats_ktables
+               *skc = (struct stats_ktables *) a->buf[curr];
+       static unsigned long long
+               avg_dentry_stat = 0,
+               avg_file_used   = 0,
+               avg_inode_used  = 0,
+               avg_pty_nr      = 0;
+               
+       
+       if (dis) {
+               printf("\n%-11s dentunusd   file-nr  inode-nr    pty-nr\n",
+                      timestamp[!curr]);
+       }
+
+       if (!dispavg) {
+               /* Display instantaneous values */
+               printf("%-11s %9u %9u %9u %9u\n", timestamp[curr],
+                      skc->dentry_stat,
+                      skc->file_used,
+                      skc->inode_used,
+                      skc->pty_nr);
+
+               /*
+                * Will be used to compute the average.
+                * Note: Overflow unlikely to happen but not impossible...
+                */
+               avg_dentry_stat += skc->dentry_stat;
+               avg_file_used   += skc->file_used;
+               avg_inode_used  += skc->inode_used;
+               avg_pty_nr      += skc->pty_nr;
+       }
+       else {
+               /* Display average values */
+               printf("%-11s %9.0f %9.0f %9.0f %9.0f\n",
+                      timestamp[curr],
+                      (double) avg_dentry_stat / avg_count,
+                      (double) avg_file_used   / avg_count,
+                      (double) avg_inode_used  / avg_count,
+                      (double) avg_pty_nr      / avg_count);
+
+               /* Reset average counters */
+               avg_dentry_stat = avg_file_used = avg_inode_used = avg_pty_nr = 0;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display kernel tables statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_ktables_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       stub_print_ktables_stats(a, prev, curr, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average kernel tables statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_ktables_stats(struct activity *a, int prev, int curr,
+                                       unsigned long long itv)
+{
+       stub_print_ktables_stats(a, prev, curr, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display queue and load statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dispavg    TRUE if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_queue_stats(struct activity *a, int prev, int curr, int dispavg)
+{
+       struct stats_queue
+               *sqc = (struct stats_queue *) a->buf[curr];
+       static unsigned long long
+               avg_nr_running  = 0,
+               avg_nr_threads  = 0,
+               avg_load_avg_1  = 0,
+               avg_load_avg_5  = 0,
+               avg_load_avg_15 = 0;
+       
+       if (dis) {
+               printf("\n%-11s   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15\n",
+                      timestamp[!curr]);
+       }
+
+       if (!dispavg) {
+               /* Display instantaneous values */
+               printf("%-11s %9lu %9u %9.2f %9.2f %9.2f\n", timestamp[curr],
+                      sqc->nr_running,
+                      sqc->nr_threads,
+                      (double) sqc->load_avg_1  / 100,
+                      (double) sqc->load_avg_5  / 100,
+                      (double) sqc->load_avg_15 / 100);
+
+               /* Will be used to compute the average */
+               avg_nr_running  += sqc->nr_running;
+               avg_nr_threads  += sqc->nr_threads;
+               avg_load_avg_1  += sqc->load_avg_1;
+               avg_load_avg_5  += sqc->load_avg_5;
+               avg_load_avg_15 += sqc->load_avg_15;
+       }
+       else {
+               /* Display average values */
+               printf("%-11s %9.0f %9.0f %9.2f %9.2f %9.2f\n", timestamp[curr],
+                      (double) avg_nr_running  / avg_count,
+                      (double) avg_nr_threads  / avg_count,
+                      (double) avg_load_avg_1  / (avg_count * 100),
+                      (double) avg_load_avg_5  / (avg_count * 100),
+                      (double) avg_load_avg_15 / (avg_count * 100));
+
+               /* Reset average counters */
+               avg_nr_running = avg_nr_threads = 0;
+               avg_load_avg_1 = avg_load_avg_5 = avg_load_avg_15 = 0;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display queue and load statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_queue_stats(struct activity *a, int prev, int curr,
+                                 unsigned long long itv)
+{
+       stub_print_queue_stats(a, prev, curr, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average queue and load statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_queue_stats(struct activity *a, int prev, int curr,
+                                     unsigned long long itv)
+{
+       stub_print_queue_stats(a, prev, curr, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display serial lines statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_serial_stats(struct activity *a, int prev, int curr,
+                                  unsigned long long itv)
+{
+       int i;
+       struct stats_serial *ssc, *ssp;
+
+       if (dis) {
+               printf("\n%-11s       TTY   rcvin/s   xmtin/s framerr/s prtyerr/s"
+                      "     brk/s   ovrun/s\n", timestamp[!curr]);
+       }
+
+       for (i = 0; i < a->nr; i++) {
+
+               ssc = (struct stats_serial *) ((char *) a->buf[curr] + i * a->msize);
+               ssp = (struct stats_serial *) ((char *) a->buf[prev] + i * a->msize);
+
+               if (ssc->line == 0)
+                       continue;
+
+               printf("%-11s       %3d", timestamp[curr], ssc->line - 1);
+
+               if ((ssc->line == ssp->line) || WANT_SINCE_BOOT(flags)) {
+                       printf(" %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+                              S_VALUE(ssp->rx,      ssc->rx,      itv),
+                              S_VALUE(ssp->tx,      ssc->tx,      itv),
+                              S_VALUE(ssp->frame,   ssc->frame,   itv),
+                              S_VALUE(ssp->parity,  ssc->parity,  itv),
+                              S_VALUE(ssp->brk,     ssc->brk,     itv),
+                              S_VALUE(ssp->overrun, ssc->overrun, itv));
+               }
+               else {
+                       printf("       N/A       N/A       N/A       N/A"
+                              "       N/A       N/A\n");
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display disks statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_disk_stats(struct activity *a, int prev, int curr,
+                                unsigned long long itv)
+{
+       int i, j;
+       struct stats_disk *sdc, *sdp;
+       struct ext_disk_stats xds;
+       char *dev_name;
+
+       if (dis) {
+               printf("\n%-11s       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz"
+                      "  avgqu-sz     await     svctm     %%util\n",
+                      timestamp[!curr]);
+       }
+
+       for (i = 0; i < a->nr; i++) {
+
+               sdc = (struct stats_disk *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!(sdc->major + sdc->minor))
+                       continue;
+
+               j = check_disk_reg(a, curr, prev, i);
+               sdp = (struct stats_disk *) ((char *) a->buf[prev] + j * a->msize);
+
+               /* Compute service time, etc. */
+               compute_ext_disk_stats(sdc, sdp, itv, &xds);
+               
+               dev_name = NULL;
+
+               if ((USE_PRETTY_OPTION(flags)) && (sdc->major == DEVMAP_MAJOR)) {
+                       dev_name = transform_devmapname(sdc->major, sdc->minor);
+               }
+
+               if (!dev_name) {
+                       dev_name = get_devname(sdc->major, sdc->minor,
+                                              USE_PRETTY_OPTION(flags));
+               }
+               
+               printf("%-11s %9s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+                      timestamp[curr],
+                      /* Confusion possible here between index and minor numbers */
+                      dev_name,
+                      S_VALUE(sdp->nr_ios, sdc->nr_ios,  itv),
+                      ll_s_value(sdp->rd_sect, sdc->rd_sect, itv),
+                      ll_s_value(sdp->wr_sect, sdc->wr_sect, itv),
+                      /* See iostat for explanations */
+                      xds.arqsz,
+                      S_VALUE(sdp->rq_ticks, sdc->rq_ticks, itv) / 1000.0,
+                      xds.await,
+                      xds.svctm,
+                      xds.util / 10.0);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display network interfaces statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_dev_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       int i, j;
+       struct stats_net_dev *sndc, *sndp;
+
+       if (dis) {
+               printf("\n%-11s     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s"
+                      "   rxcmp/s   txcmp/s  rxmcst/s\n", timestamp[!curr]);
+       }
+
+       for (i = 0; i < a->nr; i++) {
+
+               sndc = (struct stats_net_dev *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!strcmp(sndc->interface, ""))
+                       continue;
+               
+               j = check_net_dev_reg(a, curr, prev, i);
+               sndp = (struct stats_net_dev *) ((char *) a->buf[prev] + j * a->msize);
+
+               printf("%-11s %9s", timestamp[curr], sndc->interface);
+
+               printf(" %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+                      S_VALUE(sndp->rx_packets,    sndc->rx_packets,    itv),
+                      S_VALUE(sndp->tx_packets,    sndc->tx_packets,    itv),
+                      S_VALUE(sndp->rx_bytes,      sndc->rx_bytes,      itv) / 1024,
+                      S_VALUE(sndp->tx_bytes,      sndc->tx_bytes,      itv) / 1024,
+                      S_VALUE(sndp->rx_compressed, sndc->rx_compressed, itv),
+                      S_VALUE(sndp->tx_compressed, sndc->tx_compressed, itv),
+                      S_VALUE(sndp->multicast,     sndc->multicast,     itv));
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display network interface errors statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_edev_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       int i, j;
+       struct stats_net_edev *snedc, *snedp;
+
+       if (dis) {
+               printf("\n%-11s     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s"
+                      "  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s\n",
+                      timestamp[!curr]);
+       }
+
+       for (i = 0; i < a->nr; i++) {
+
+               snedc = (struct stats_net_edev *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!strcmp(snedc->interface, ""))
+                       continue;
+               
+               j = check_net_edev_reg(a, curr, prev, i);
+               snedp = (struct stats_net_edev *) ((char *) a->buf[prev] + j * a->msize);
+
+               printf("%-11s %9s", timestamp[curr], snedc->interface);
+
+               printf(" %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+                      S_VALUE(snedp->rx_errors,         snedc->rx_errors,         itv),
+                      S_VALUE(snedp->tx_errors,         snedc->tx_errors,         itv),
+                      S_VALUE(snedp->collisions,        snedc->collisions,        itv),
+                      S_VALUE(snedp->rx_dropped,        snedc->rx_dropped,        itv),
+                      S_VALUE(snedp->tx_dropped,        snedc->tx_dropped,        itv),
+                      S_VALUE(snedp->tx_carrier_errors, snedc->tx_carrier_errors, itv),
+                      S_VALUE(snedp->rx_frame_errors,   snedc->rx_frame_errors,   itv),
+                      S_VALUE(snedp->rx_fifo_errors,    snedc->rx_fifo_errors,    itv),
+                      S_VALUE(snedp->tx_fifo_errors,    snedc->tx_fifo_errors,    itv));
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display NFS client statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_nfs_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       struct stats_net_nfs
+               *snnc = (struct stats_net_nfs *) a->buf[curr],
+               *snnp = (struct stats_net_nfs *) a->buf[prev];
+       
+       if (dis) {
+               printf("\n%-11s    call/s retrans/s    read/s   write/s  access/s"
+                      "  getatt/s\n", timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", timestamp[curr],
+              S_VALUE(snnp->nfs_rpccnt,     snnc->nfs_rpccnt,     itv),
+              S_VALUE(snnp->nfs_rpcretrans, snnc->nfs_rpcretrans, itv),
+              S_VALUE(snnp->nfs_readcnt,    snnc->nfs_readcnt,    itv),
+              S_VALUE(snnp->nfs_writecnt,   snnc->nfs_writecnt,   itv),
+              S_VALUE(snnp->nfs_accesscnt,  snnc->nfs_accesscnt,  itv),
+              S_VALUE(snnp->nfs_getattcnt,  snnc->nfs_getattcnt,  itv));
+}
+
+/*
+ ***************************************************************************
+ * Display NFS server statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_nfsd_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       struct stats_net_nfsd
+               *snndc = (struct stats_net_nfsd *) a->buf[curr],
+               *snndp = (struct stats_net_nfsd *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s   scall/s badcall/s  packet/s     udp/s     tcp/s     "
+                      "hit/s    miss/s   sread/s  swrite/s saccess/s sgetatt/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(snndp->nfsd_rpccnt,    snndc->nfsd_rpccnt,    itv),
+              S_VALUE(snndp->nfsd_rpcbad,    snndc->nfsd_rpcbad,    itv),
+              S_VALUE(snndp->nfsd_netcnt,    snndc->nfsd_netcnt,    itv),
+              S_VALUE(snndp->nfsd_netudpcnt, snndc->nfsd_netudpcnt, itv),
+              S_VALUE(snndp->nfsd_nettcpcnt, snndc->nfsd_nettcpcnt, itv),
+              S_VALUE(snndp->nfsd_rchits,    snndc->nfsd_rchits,    itv),
+              S_VALUE(snndp->nfsd_rcmisses,  snndc->nfsd_rcmisses,  itv),
+              S_VALUE(snndp->nfsd_readcnt,   snndc->nfsd_readcnt,   itv),
+              S_VALUE(snndp->nfsd_writecnt,  snndc->nfsd_writecnt,  itv),
+              S_VALUE(snndp->nfsd_accesscnt, snndc->nfsd_accesscnt, itv),
+              S_VALUE(snndp->nfsd_getattcnt, snndc->nfsd_getattcnt, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display network sockets statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ * @dispavg    TRUE if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_net_sock_stats(struct activity *a, int prev, int curr,
+                              unsigned long long itv, int dispavg)
+{
+       struct stats_net_sock
+               *snsc = (struct stats_net_sock *) a->buf[curr];
+       static unsigned long long
+               avg_sock_inuse = 0,
+               avg_tcp_inuse  = 0,
+               avg_udp_inuse  = 0,
+               avg_raw_inuse  = 0,
+               avg_frag_inuse = 0,
+               avg_tcp_tw     = 0;
+       
+       if (dis) {
+               printf("\n%-11s    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw\n",
+                      timestamp[!curr]);
+       }
+
+       if (!dispavg) {
+               /* Display instantaneous values */
+               printf("%-11s %9u %9u %9u %9u %9u %9u\n", timestamp[curr],
+                      snsc->sock_inuse,
+                      snsc->tcp_inuse,
+                      snsc->udp_inuse,
+                      snsc->raw_inuse,
+                      snsc->frag_inuse,
+                      snsc->tcp_tw);
+
+               /* Will be used to compute the average */
+               avg_sock_inuse += snsc->sock_inuse;
+               avg_tcp_inuse  += snsc->tcp_inuse;
+               avg_udp_inuse  += snsc->udp_inuse;
+               avg_raw_inuse  += snsc->raw_inuse;
+               avg_frag_inuse += snsc->frag_inuse;
+               avg_tcp_tw     += snsc->tcp_tw;
+       }
+       else {
+               /* Display average values */
+               printf("%-11s %9.0f %9.0f %9.0f %9.0f %9.0f %9.0f\n", timestamp[curr],
+                      (double) avg_sock_inuse / avg_count,
+                      (double) avg_tcp_inuse  / avg_count,
+                      (double) avg_udp_inuse  / avg_count,
+                      (double) avg_raw_inuse  / avg_count,
+                      (double) avg_frag_inuse / avg_count,
+                      (double) avg_tcp_tw     / avg_count);
+
+               /* Reset average counters */
+               avg_sock_inuse = avg_tcp_inuse = avg_udp_inuse = 0;
+               avg_raw_inuse = avg_frag_inuse = avg_tcp_tw = 0;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display network sockets statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_sock_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       stub_print_net_sock_stats(a, prev, curr, itv, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average network sockets statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_net_sock_stats(struct activity *a, int prev, int curr,
+                                        unsigned long long itv)
+{
+       stub_print_net_sock_stats(a, prev, curr, itv, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display IP network traffic statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_ip_stats(struct activity *a, int prev, int curr,
+                                  unsigned long long itv)
+{
+       struct stats_net_ip
+               *snic = (struct stats_net_ip *) a->buf[curr],
+               *snip = (struct stats_net_ip *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s    irec/s  fwddgm/s    idel/s     orq/s   asmrq/s"
+                      "   asmok/s  fragok/s fragcrt/s\n", timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(snip->InReceives,    snic->InReceives,    itv),
+              S_VALUE(snip->ForwDatagrams, snic->ForwDatagrams, itv),
+              S_VALUE(snip->InDelivers,    snic->InDelivers,    itv),
+              S_VALUE(snip->OutRequests,   snic->OutRequests,   itv),
+              S_VALUE(snip->ReasmReqds,    snic->ReasmReqds,    itv),
+              S_VALUE(snip->ReasmOKs,      snic->ReasmOKs,      itv),
+              S_VALUE(snip->FragOKs,       snic->FragOKs,       itv),
+              S_VALUE(snip->FragCreates,   snic->FragCreates,   itv));
+}
+
+/*
+ ***************************************************************************
+ * Display IP network error statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_eip_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       struct stats_net_eip
+               *sneic = (struct stats_net_eip *) a->buf[curr],
+               *sneip = (struct stats_net_eip *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s ihdrerr/s iadrerr/s iukwnpr/s   idisc/s   odisc/s"
+                      "   onort/s    asmf/s   fragf/s\n", timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(sneip->InHdrErrors,     sneic->InHdrErrors,     itv),
+              S_VALUE(sneip->InAddrErrors,    sneic->InAddrErrors,    itv),
+              S_VALUE(sneip->InUnknownProtos, sneic->InUnknownProtos, itv),
+              S_VALUE(sneip->InDiscards,      sneic->InDiscards,      itv),
+              S_VALUE(sneip->OutDiscards,     sneic->OutDiscards,     itv),
+              S_VALUE(sneip->OutNoRoutes,     sneic->OutNoRoutes,     itv),
+              S_VALUE(sneip->ReasmFails,      sneic->ReasmFails,      itv),
+              S_VALUE(sneip->FragFails,       sneic->FragFails,       itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMP network traffic statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_icmp_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       struct stats_net_icmp
+               *snic = (struct stats_net_icmp *) a->buf[curr],
+               *snip = (struct stats_net_icmp *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s    imsg/s    omsg/s    iech/s   iechr/s    oech/s"
+                      "   oechr/s     itm/s    itmr/s     otm/s    otmr/s"
+                      "  iadrmk/s iadrmkr/s  oadrmk/s oadrmkr/s\n", timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f"
+              " %9.2f %9.2f %9.2f %9.2f\n", timestamp[curr],
+              S_VALUE(snip->InMsgs,           snic->InMsgs,           itv),
+              S_VALUE(snip->OutMsgs,          snic->OutMsgs,          itv),
+              S_VALUE(snip->InEchos,          snic->InEchos,          itv),
+              S_VALUE(snip->InEchoReps,       snic->InEchoReps,       itv),
+              S_VALUE(snip->OutEchos,         snic->OutEchos,         itv),
+              S_VALUE(snip->OutEchoReps,      snic->OutEchoReps,      itv),
+              S_VALUE(snip->InTimestamps,     snic->InTimestamps,     itv),
+              S_VALUE(snip->InTimestampReps,  snic->InTimestampReps,  itv),
+              S_VALUE(snip->OutTimestamps,    snic->OutTimestamps,    itv),
+              S_VALUE(snip->OutTimestampReps, snic->OutTimestampReps, itv),
+              S_VALUE(snip->InAddrMasks,      snic->InAddrMasks,      itv),
+              S_VALUE(snip->InAddrMaskReps,   snic->InAddrMaskReps,   itv),
+              S_VALUE(snip->OutAddrMasks,     snic->OutAddrMasks,     itv),
+              S_VALUE(snip->OutAddrMaskReps,  snic->OutAddrMaskReps,  itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMP network error statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_eicmp_stats(struct activity *a, int prev, int curr,
+                                     unsigned long long itv)
+{
+       struct stats_net_eicmp
+               *sneic = (struct stats_net_eicmp *) a->buf[curr],
+               *sneip = (struct stats_net_eicmp *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s    ierr/s    oerr/s idstunr/s odstunr/s   itmex/s"
+                      "   otmex/s iparmpb/s oparmpb/s   isrcq/s   osrcq/s"
+                      "  iredir/s  oredir/s\n", timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f"
+              " %9.2f %9.2f\n", timestamp[curr],
+              S_VALUE(sneip->InErrors,        sneic->InErrors,        itv),
+              S_VALUE(sneip->OutErrors,       sneic->OutErrors,       itv),
+              S_VALUE(sneip->InDestUnreachs,  sneic->InDestUnreachs,  itv),
+              S_VALUE(sneip->OutDestUnreachs, sneic->OutDestUnreachs, itv),
+              S_VALUE(sneip->InTimeExcds,     sneic->InTimeExcds,     itv),
+              S_VALUE(sneip->OutTimeExcds,    sneic->OutTimeExcds,    itv),
+              S_VALUE(sneip->InParmProbs,     sneic->InParmProbs,     itv),
+              S_VALUE(sneip->OutParmProbs,    sneic->OutParmProbs,    itv),
+              S_VALUE(sneip->InSrcQuenchs,    sneic->InSrcQuenchs,    itv),
+              S_VALUE(sneip->OutSrcQuenchs,   sneic->OutSrcQuenchs,   itv),
+              S_VALUE(sneip->InRedirects,     sneic->InRedirects,     itv),
+              S_VALUE(sneip->OutRedirects,    sneic->OutRedirects,    itv));
+}
+
+/*
+ ***************************************************************************
+ * Display TCP network traffic statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_tcp_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       struct stats_net_tcp
+               *sntc = (struct stats_net_tcp *) a->buf[curr],
+               *sntp = (struct stats_net_tcp *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s  active/s passive/s    iseg/s    oseg/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(sntp->ActiveOpens,  sntc->ActiveOpens,  itv),
+              S_VALUE(sntp->PassiveOpens, sntc->PassiveOpens, itv),
+              S_VALUE(sntp->InSegs,       sntc->InSegs,       itv),
+              S_VALUE(sntp->OutSegs,      sntc->OutSegs,      itv));
+}
+
+/*
+ ***************************************************************************
+ * Display TCP network error statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_etcp_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       struct stats_net_etcp
+               *snetc = (struct stats_net_etcp *) a->buf[curr],
+               *snetp = (struct stats_net_etcp *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s  atmptf/s  estres/s retrans/s isegerr/s   orsts/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(snetp->AttemptFails, snetc->AttemptFails, itv),
+              S_VALUE(snetp->EstabResets,  snetc->EstabResets,  itv),
+              S_VALUE(snetp->RetransSegs,  snetc->RetransSegs,  itv),
+              S_VALUE(snetp->InErrs,       snetc->InErrs,       itv),
+              S_VALUE(snetp->OutRsts,      snetc->OutRsts,      itv));
+}
+
+/*
+ ***************************************************************************
+ * Display UDP network traffic statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_udp_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       struct stats_net_udp
+               *snuc = (struct stats_net_udp *) a->buf[curr],
+               *snup = (struct stats_net_udp *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s    idgm/s    odgm/s  noport/s idgmerr/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(snup->InDatagrams,  snuc->InDatagrams,  itv),
+              S_VALUE(snup->OutDatagrams, snuc->OutDatagrams, itv),
+              S_VALUE(snup->NoPorts,      snuc->NoPorts,      itv),
+              S_VALUE(snup->InErrors,     snuc->InErrors,     itv));
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 sockets statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ * @dispavg    TRUE if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_net_sock6_stats(struct activity *a, int prev, int curr,
+                               unsigned long long itv, int dispavg)
+{
+       struct stats_net_sock6
+               *snsc = (struct stats_net_sock6 *) a->buf[curr];
+       static unsigned long long
+               avg_tcp6_inuse  = 0,
+               avg_udp6_inuse  = 0,
+               avg_raw6_inuse  = 0,
+               avg_frag6_inuse = 0;
+       
+       if (dis) {
+               printf("\n%-11s   tcp6sck   udp6sck   raw6sck  ip6-frag\n",
+                      timestamp[!curr]);
+       }
+
+       if (!dispavg) {
+               /* Display instantaneous values */
+               printf("%-11s %9u %9u %9u %9u\n", timestamp[curr],
+                      snsc->tcp6_inuse,
+                      snsc->udp6_inuse,
+                      snsc->raw6_inuse,
+                      snsc->frag6_inuse);
+
+               /* Will be used to compute the average */
+               avg_tcp6_inuse  += snsc->tcp6_inuse;
+               avg_udp6_inuse  += snsc->udp6_inuse;
+               avg_raw6_inuse  += snsc->raw6_inuse;
+               avg_frag6_inuse += snsc->frag6_inuse;
+       }
+       else {
+               /* Display average values */
+               printf("%-11s %9.0f %9.0f %9.0f %9.0f\n", timestamp[curr],
+                      (double) avg_tcp6_inuse  / avg_count,
+                      (double) avg_udp6_inuse  / avg_count,
+                      (double) avg_raw6_inuse  / avg_count,
+                      (double) avg_frag6_inuse / avg_count);
+
+               /* Reset average counters */
+               avg_tcp6_inuse = avg_udp6_inuse = avg_raw6_inuse = avg_frag6_inuse = 0;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 sockets statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_sock6_stats(struct activity *a, int prev, int curr,
+                                     unsigned long long itv)
+{
+       stub_print_net_sock6_stats(a, prev, curr, itv, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average IPv6 sockets statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_net_sock6_stats(struct activity *a, int prev, int curr,
+                                         unsigned long long itv)
+{
+       stub_print_net_sock6_stats(a, prev, curr, itv, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network traffic statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_ip6_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       struct stats_net_ip6
+               *snic = (struct stats_net_ip6 *) a->buf[curr],
+               *snip = (struct stats_net_ip6 *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s   irec6/s fwddgm6/s   idel6/s    orq6/s  asmrq6/s"
+                      "  asmok6/s imcpck6/s omcpck6/s fragok6/s fragcr6/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(snip->InReceives6,       snic->InReceives6,       itv),
+              S_VALUE(snip->OutForwDatagrams6, snic->OutForwDatagrams6, itv),
+              S_VALUE(snip->InDelivers6,       snic->InDelivers6,       itv),
+              S_VALUE(snip->OutRequests6,      snic->OutRequests6,      itv),
+              S_VALUE(snip->ReasmReqds6,       snic->ReasmReqds6,       itv),
+              S_VALUE(snip->ReasmOKs6,         snic->ReasmOKs6,         itv),
+              S_VALUE(snip->InMcastPkts6,      snic->InMcastPkts6,      itv),
+              S_VALUE(snip->OutMcastPkts6,     snic->OutMcastPkts6,     itv),
+              S_VALUE(snip->FragOKs6,          snic->FragOKs6,          itv),
+              S_VALUE(snip->FragCreates6,      snic->FragCreates6,      itv));
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network error statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_eip6_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       struct stats_net_eip6
+               *sneic = (struct stats_net_eip6 *) a->buf[curr],
+               *sneip = (struct stats_net_eip6 *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s ihdrer6/s iadrer6/s iukwnp6/s  i2big6/s  idisc6/s  odisc6/s"
+                      "  inort6/s  onort6/s   asmf6/s  fragf6/s itrpck6/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(sneip->InHdrErrors6,     sneic->InHdrErrors6,     itv),
+              S_VALUE(sneip->InAddrErrors6,    sneic->InAddrErrors6,    itv),
+              S_VALUE(sneip->InUnknownProtos6, sneic->InUnknownProtos6, itv),
+              S_VALUE(sneip->InTooBigErrors6,  sneic->InTooBigErrors6,  itv),
+              S_VALUE(sneip->InDiscards6,      sneic->InDiscards6,      itv),
+              S_VALUE(sneip->OutDiscards6,     sneic->OutDiscards6,     itv),
+              S_VALUE(sneip->InNoRoutes6,      sneic->InNoRoutes6,      itv),
+              S_VALUE(sneip->OutNoRoutes6,     sneic->OutNoRoutes6,     itv),
+              S_VALUE(sneip->ReasmFails6,      sneic->ReasmFails6,      itv),
+              S_VALUE(sneip->FragFails6,       sneic->FragFails6,       itv),
+              S_VALUE(sneip->InTruncatedPkts6, sneic->InTruncatedPkts6, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMPv6 network traffic statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_icmp6_stats(struct activity *a, int prev, int curr,
+                                     unsigned long long itv)
+{
+       struct stats_net_icmp6
+               *snic = (struct stats_net_icmp6 *) a->buf[curr],
+               *snip = (struct stats_net_icmp6 *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s   imsg6/s   omsg6/s   iech6/s  iechr6/s  oechr6/s"
+                      "  igmbq6/s  igmbr6/s  ogmbr6/s igmbrd6/s ogmbrd6/s irtsol6/s ortsol6/s"
+                      "  irtad6/s inbsol6/s onbsol6/s  inbad6/s  onbad6/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f"
+              " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", timestamp[curr],
+              S_VALUE(snip->InMsgs6,                    snic->InMsgs6,                    itv),
+              S_VALUE(snip->OutMsgs6,                   snic->OutMsgs6,                   itv),
+              S_VALUE(snip->InEchos6,                   snic->InEchos6,                   itv),
+              S_VALUE(snip->InEchoReplies6,             snic->InEchoReplies6,             itv),
+              S_VALUE(snip->OutEchoReplies6,            snic->OutEchoReplies6,            itv),
+              S_VALUE(snip->InGroupMembQueries6,        snic->InGroupMembQueries6,        itv),
+              S_VALUE(snip->InGroupMembResponses6,      snic->InGroupMembResponses6,      itv),
+              S_VALUE(snip->OutGroupMembResponses6,     snic->OutGroupMembResponses6,     itv),
+              S_VALUE(snip->InGroupMembReductions6,     snic->InGroupMembReductions6,     itv),
+              S_VALUE(snip->OutGroupMembReductions6,    snic->OutGroupMembReductions6,    itv),
+              S_VALUE(snip->InRouterSolicits6,          snic->InRouterSolicits6,          itv),
+              S_VALUE(snip->OutRouterSolicits6,         snic->OutRouterSolicits6,         itv),
+              S_VALUE(snip->InRouterAdvertisements6,    snic->InRouterAdvertisements6,    itv),
+              S_VALUE(snip->InNeighborSolicits6,        snic->InNeighborSolicits6,        itv),
+              S_VALUE(snip->OutNeighborSolicits6,       snic->OutNeighborSolicits6,       itv),
+              S_VALUE(snip->InNeighborAdvertisements6,  snic->InNeighborAdvertisements6,  itv),
+              S_VALUE(snip->OutNeighborAdvertisements6, snic->OutNeighborAdvertisements6, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMPv6 network error statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_eicmp6_stats(struct activity *a, int prev, int curr,
+                                      unsigned long long itv)
+{
+       struct stats_net_eicmp6
+               *sneic = (struct stats_net_eicmp6 *) a->buf[curr],
+               *sneip = (struct stats_net_eicmp6 *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s   ierr6/s idtunr6/s odtunr6/s  itmex6/s  otmex6/s"
+                      " iprmpb6/s oprmpb6/s iredir6/s oredir6/s ipck2b6/s opck2b6/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f"
+              " %9.2f\n", timestamp[curr],
+              S_VALUE(sneip->InErrors6,        sneic->InErrors6,        itv),
+              S_VALUE(sneip->InDestUnreachs6,  sneic->InDestUnreachs6,  itv),
+              S_VALUE(sneip->OutDestUnreachs6, sneic->OutDestUnreachs6, itv),
+              S_VALUE(sneip->InTimeExcds6,     sneic->InTimeExcds6,     itv),
+              S_VALUE(sneip->OutTimeExcds6,    sneic->OutTimeExcds6,    itv),
+              S_VALUE(sneip->InParmProblems6,  sneic->InParmProblems6,  itv),
+              S_VALUE(sneip->OutParmProblems6, sneic->OutParmProblems6, itv),
+              S_VALUE(sneip->InRedirects6,     sneic->InRedirects6,     itv),
+              S_VALUE(sneip->OutRedirects6,    sneic->OutRedirects6,    itv),
+              S_VALUE(sneip->InPktTooBigs6,    sneic->InPktTooBigs6,    itv),
+              S_VALUE(sneip->OutPktTooBigs6,   sneic->OutPktTooBigs6,   itv));
+}
+
+/*
+ ***************************************************************************
+ * Display UDPv6 network traffic statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_net_udp6_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       struct stats_net_udp6
+               *snuc = (struct stats_net_udp6 *) a->buf[curr],
+               *snup = (struct stats_net_udp6 *) a->buf[prev];
+
+       if (dis) {
+               printf("\n%-11s   idgm6/s   odgm6/s noport6/s idgmer6/s\n",
+                      timestamp[!curr]);
+       }
+
+       printf("%-11s %9.2f %9.2f %9.2f %9.2f\n",
+              timestamp[curr],
+              S_VALUE(snup->InDatagrams6,  snuc->InDatagrams6,  itv),
+              S_VALUE(snup->OutDatagrams6, snuc->OutDatagrams6, itv),
+              S_VALUE(snup->NoPorts6,      snuc->NoPorts6,      itv),
+              S_VALUE(snup->InErrors6,     snuc->InErrors6,     itv));
+}
+
+/*
+ ***************************************************************************
+ * Display CPU frequency statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dispavg    True if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_pwr_cpufreq_stats(struct activity *a, int prev, int curr, int dispavg)
+{
+       int i;
+       struct stats_pwr_cpufreq *spc;
+       static unsigned long long
+               *avg_cpufreq = NULL;
+       
+       if (!avg_cpufreq) {
+               /* Allocate array of CPU frequency */
+               if ((avg_cpufreq = (unsigned long long *) malloc(sizeof(unsigned long long) * a->nr))
+                   == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_cpufreq, 0, sizeof(unsigned long long) * a->nr);
+       }
+       
+       if (dis) {
+               printf("\n%-11s     CPU       MHz\n",
+                      timestamp[!curr]);
+       }
+
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+               
+               /*
+                * The size of a->buf[...] CPU structure may be different from the default
+                * sizeof(struct stats_pwr_cpufreq) value if data have been read from a file!
+                * That's why we don't use a syntax like:
+                * spc = (struct stats_pwr_cpufreq *) a->buf[...] + i;
+                */
+               spc = (struct stats_pwr_cpufreq *) ((char *) a->buf[curr] + i * a->msize);
+
+               /*
+                * Note: a->nr is in [1, NR_CPUS + 1].
+                * Bitmap size is provided for (NR_CPUS + 1) CPUs.
+                * Anyway, NR_CPUS may vary between the version of sysstat
+                * used by sadc to create a file, and the version of sysstat
+                * used by sar to read it...
+                */
+               
+               /* Should current CPU (including CPU "all") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+
+                       /* Yes: Display it */
+                       printf("%-11s", timestamp[curr]);
+                       
+                       if (!i) {
+                               /* This is CPU "all" */
+                               printf("     all");
+                       }
+                       else {
+                               printf("     %3d", i - 1);
+                       }
+                       
+                       if (!dispavg) {
+                               /* Display instantaneous values */
+                               printf(" %9.2f\n",
+                                      ((double) spc->cpufreq) / 100);
+                               /*
+                                * Will be used to compute the average.
+                                * Note: overflow unlikely to happen but not impossible...
+                                */
+                               avg_cpufreq[i] += spc->cpufreq;
+                       }
+                       else {
+                               /* Display average values */
+                               printf(" %9.2f\n",
+                                      (double) avg_cpufreq[i] / (100 * avg_count));                            
+                       }
+               }
+       }
+       
+       if (dispavg) {
+               /* Array of CPU frequency no longer needed: Free it! */
+               if (avg_cpufreq) {
+                       free(avg_cpufreq);
+                       avg_cpufreq = NULL;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display CPU frequency statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_pwr_cpufreq_stats(struct activity *a, int prev, int curr,
+                                       unsigned long long itv)
+{
+       stub_print_pwr_cpufreq_stats(a, prev, curr, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average CPU frequency statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_pwr_cpufreq_stats(struct activity *a, int prev, int curr,
+                                           unsigned long long itv)
+{
+       stub_print_pwr_cpufreq_stats(a, prev, curr, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display fan statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dispavg    True if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_pwr_fan_stats(struct activity *a, int prev, int curr, int dispavg)
+{
+       int i;
+       struct stats_pwr_fan *spc;
+       static double *avg_fan = NULL;
+       static double *avg_fan_min = NULL;
+
+       /* Allocate arrays of fan RPMs */
+       if (!avg_fan) {
+               if ((avg_fan = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_fan, 0, sizeof(double) * a->nr);
+       }
+       if (!avg_fan_min) {
+               if ((avg_fan_min = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_fan_min, 0, sizeof(double) * a->nr);
+       }
+
+       if (dis) {
+               printf("\n%-11s     FAN       rpm      drpm     %*s\n",
+                      timestamp[!curr], MAX_SENSORS_DEV_LEN, "DEVICE");
+       }
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_fan *) ((char *) a->buf[curr] + i * a->msize);
+
+               printf("%-11s     %3d", timestamp[curr], i + 1);
+
+               if (dispavg) {
+                       /* Display average values */
+                       printf(" %9.2f %9.2f",
+                              (double) avg_fan[i] / avg_count,
+                              (double) (avg_fan[i] - avg_fan_min[i]) / avg_count);
+               }
+               else {
+                       /* Display instantaneous values */
+                       printf(" %9.2f %9.2f",
+                              spc->rpm,
+                              spc->rpm - spc->rpm_min);
+                       avg_fan[i]     += spc->rpm;
+                       avg_fan_min[i] += spc->rpm_min;
+               }
+
+               printf("     %*s\n", MAX_SENSORS_DEV_LEN, spc->device);
+       }
+
+       if (dispavg) {
+               if (avg_fan) {
+                       free(avg_fan);
+                       avg_fan = NULL;
+               }
+               if (avg_fan_min) {
+                       free(avg_fan_min);
+                       avg_fan_min = NULL;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display fan statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_pwr_fan_stats(struct activity *a, int prev, int curr,
+                                   unsigned long long itv)
+{
+       stub_print_pwr_fan_stats(a, prev, curr, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average fan statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_pwr_fan_stats(struct activity *a, int prev, int curr,
+                                       unsigned long long itv)
+{
+       stub_print_pwr_fan_stats(a, prev, curr, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display device temperature statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dispavg    True if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_pwr_temp_stats(struct activity *a, int prev, int curr, int dispavg)
+{
+       int i;
+       struct stats_pwr_temp *spc;
+       static double *avg_temp = NULL;
+       static double *avg_temp_min = NULL, *avg_temp_max = NULL;
+
+       /* Allocate arrays of temperatures */
+       if (!avg_temp) {
+               if ((avg_temp = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_temp, 0, sizeof(double) * a->nr);
+       }
+       if (!avg_temp_min) {
+               if ((avg_temp_min = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_temp_min, 0, sizeof(double) * a->nr);
+       }
+       if (!avg_temp_max) {
+               if ((avg_temp_max = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_temp_max, 0, sizeof(double) * a->nr);
+       }
+
+       if (dis) {
+               printf("\n%-11s    TEMP      degC     %%temp     %*s\n",
+                      timestamp[!curr], MAX_SENSORS_DEV_LEN, "DEVICE");
+       }
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_temp *) ((char *) a->buf[curr] + i * a->msize);
+
+               printf("%-11s     %3d", timestamp[curr], i + 1);
+
+               if (dispavg) {
+                       /* Display average values */
+                       printf(" %9.2f %9.2f",
+                              (double) avg_temp[i] / avg_count,
+                              (avg_temp_max[i] - avg_temp_min[i]) ?
+                              ((double) (avg_temp[i] / avg_count) - avg_temp_min[i]) / (avg_temp_max[i] - avg_temp_min[i]) * 100 :
+                              0.0);
+               }
+               else {
+                       /* Display instantaneous values */
+                       printf(" %9.2f %9.2f",
+                              spc->temp,
+                              (spc->temp_max - spc->temp_min) ?
+                              (spc->temp - spc->temp_min) / (spc->temp_max - spc->temp_min) * 100 :
+                              0.0);
+                       avg_temp[i] += spc->temp;
+                       /* Assume that min and max temperatures cannot vary */
+                       avg_temp_min[i] = spc->temp_min;
+                       avg_temp_max[i] = spc->temp_max;
+               }
+               
+               printf("     %*s\n", MAX_SENSORS_DEV_LEN, spc->device);
+       }
+
+       if (dispavg) {
+               if (avg_temp) {
+                       free(avg_temp);
+                       avg_temp = NULL;
+               }
+               if (avg_temp_min) {
+                       free(avg_temp_min);
+                       avg_temp_min = NULL;
+               }
+               if (avg_temp_max) {
+                       free(avg_temp_max);
+                       avg_temp_max = NULL;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display temperature statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_pwr_temp_stats(struct activity *a, int prev, int curr,
+                                    unsigned long long itv)
+{
+       stub_print_pwr_temp_stats(a, prev, curr, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average temperature statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_pwr_temp_stats(struct activity *a, int prev, int curr,
+                                        unsigned long long itv)
+{
+       stub_print_pwr_temp_stats(a, prev, curr, TRUE);
+}
+
+/*
+ ***************************************************************************
+ * Display voltage inputs statistics. This function is used to display
+ * instantaneous and average statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @dispavg    True if displaying average statistics.
+ ***************************************************************************
+ */
+void stub_print_pwr_in_stats(struct activity *a, int prev, int curr, int dispavg)
+{
+       int i;
+       struct stats_pwr_in *spc;
+       static double *avg_in = NULL;
+       static double *avg_in_min = NULL, *avg_in_max = NULL;
+
+       /* Allocate arrays of voltage inputs */
+       if (!avg_in) {
+               if ((avg_in = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_in, 0, sizeof(double) * a->nr);
+       }
+       if (!avg_in_min) {
+               if ((avg_in_min = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_in_min, 0, sizeof(double) * a->nr);
+       }
+       if (!avg_in_max) {
+               if ((avg_in_max = (double *) malloc(sizeof(double) * a->nr)) == NULL) {
+                       perror("malloc");
+                       exit(4);
+               }
+               memset(avg_in_max, 0, sizeof(double) * a->nr);
+       }
+
+       if (dis) {
+               printf("\n%-11s      IN       inV       %%in     %*s\n",
+                      timestamp[!curr], MAX_SENSORS_DEV_LEN, "DEVICE");
+       }
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_in *) ((char *) a->buf[curr] + i * a->msize);
+
+               printf("%-11s     %3d", timestamp[curr], i);
+
+               if (dispavg) {
+                       /* Display average values */
+                       printf(" %9.2f %9.2f",
+                              (double) avg_in[i] / avg_count,
+                              (avg_in_max[i] - avg_in_min[i]) ?
+                              ((double) (avg_in[i] / avg_count) - avg_in_min[i]) / (avg_in_max[i] - avg_in_min[i]) * 100 :
+                              0.0);
+               }
+               else {
+                       /* Display instantaneous values */
+                       printf(" %9.2f %9.2f",
+                              spc->in,
+                              (spc->in_max - spc->in_min) ?
+                              (spc->in - spc->in_min) / (spc->in_max - spc->in_min) * 100 :
+                              0.0);
+                       avg_in[i] += spc->in;
+                       /* Assume that min and max voltage inputs cannot vary */
+                       avg_in_min[i] = spc->in_min;
+                       avg_in_max[i] = spc->in_max;
+               }
+
+               printf("     %*s\n", MAX_SENSORS_DEV_LEN, spc->device);
+       }
+
+       if (dispavg) {
+               if (avg_in) {
+                       free(avg_in);
+                       avg_in = NULL;
+               }
+               if (avg_in_min) {
+                       free(avg_in_min);
+                       avg_in_min = NULL;
+               }
+               if (avg_in_max) {
+                       free(avg_in_max);
+                       avg_in_max = NULL;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display voltage inputs statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_pwr_in_stats(struct activity *a, int prev, int curr,
+                                  unsigned long long itv)
+{
+       stub_print_pwr_in_stats(a, prev, curr, FALSE);
+}
+
+/*
+ ***************************************************************************
+ * Display average voltage inputs statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @prev       Index in array where stats used as reference are.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t print_avg_pwr_in_stats(struct activity *a, int prev, int curr,
+                                      unsigned long long itv)
+{
+       stub_print_pwr_in_stats(a, prev, curr, TRUE);
+}
diff --git a/pr_stats.h b/pr_stats.h
new file mode 100644 (file)
index 0000000..8f6c6d9
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * pr_stats.h: Include file used to display system statistics
+ * (C) 1999-2010 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _PR_STATS_H
+#define _PR_STATS_H
+
+#include "common.h"
+
+
+/*
+ ***************************************************************************
+ * Prototypes for functions used to display system statistics
+ ***************************************************************************
+ */
+
+/* Functions used to display instantaneous statistics */
+extern __print_funct_t print_cpu_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_pcsw_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_irq_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_swap_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_paging_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_io_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_memory_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_ktables_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_queue_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_serial_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_disk_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_dev_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_edev_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_nfs_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_nfsd_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_sock_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_ip_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_eip_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_icmp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_eicmp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_tcp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_etcp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_udp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_sock6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_ip6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_eip6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_icmp6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_eicmp6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_net_udp6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_pwr_cpufreq_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_pwr_fan_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_pwr_temp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_pwr_in_stats
+       (struct activity *, int, int, unsigned long long);
+
+/* Functions used to display average statistics */
+extern __print_funct_t print_avg_memory_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_ktables_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_queue_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_net_sock_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_net_sock6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_pwr_cpufreq_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_pwr_fan_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_pwr_temp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t print_avg_pwr_in_stats
+       (struct activity *, int, int, unsigned long long);
+
+#endif /* _PR_STATS_H */
diff --git a/prf_stats.c b/prf_stats.c
new file mode 100644 (file)
index 0000000..f44f93f
--- /dev/null
@@ -0,0 +1,4164 @@
+/*
+ * prf_stats.c: Funtions used by sadf to display statistics
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "sa.h"
+#include "ioconf.h"
+#include "prf_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+static char *seps[] =  {"\t", ";"};
+
+extern unsigned int flags;
+
+/*
+ ***************************************************************************
+ * cons() -
+ *   encapsulate a pair of ints or pair of char * into a static Cons and
+ *   return a pointer to it.
+ *
+ * given:   t - type of Cons {iv, sv}
+ *         arg1 - unsigned long int (if iv), char * (if sv) to become
+ *                element 'a'
+ *         arg2 - unsigned long int (if iv), char * (if sv) to become
+ *                element 'b'
+ *
+ * does:    load a static Cons with values using the t parameter to
+ *         guide pulling values from the arglist
+ *
+ * return:  the address of it's static Cons.  If you need to keep
+ *         the contents of this Cons, copy it somewhere before calling
+ *         cons() against to avoid overwrite.
+ *         ie. don't do this:  f( cons( iv, i, j ), cons( iv, a, b ) );
+ ***************************************************************************
+ */
+static Cons *cons(tcons t, ...)
+{
+       va_list ap;
+       static Cons c;
+
+       c.t = t;
+
+       va_start(ap, t);
+       if (t == iv) {
+               c.a.i = va_arg(ap, unsigned long int);
+               c.b.i = va_arg(ap, unsigned long int);
+       }
+       else {
+               c.a.s = va_arg(ap, char *);
+               c.b.s = va_arg(ap, char *);
+       }
+       va_end(ap);
+       return(&c);
+}
+
+/*
+ ***************************************************************************
+ * render():
+ *
+ * given:    isdb - flag, true if db printing, false if ppc printing
+ *          pre  - prefix string for output entries
+ *          rflags - PT_.... rendering flags
+ *          pptxt - printf-format text required for ppc output (may be null)
+ *          dbtxt - printf-format text required for db output (may be null)
+ *          mid - pptxt/dbtxt format args as a Cons.
+ *          luval - %lu printable arg (PT_USEINT must be set)
+ *          dval  - %.2f printable arg (used unless PT_USEINT is set)
+ *
+ * does:     print [pre<sep>]([dbtxt,arg,arg<sep>]|[pptxt,arg,arg<sep>]) \
+ *                     (luval|dval)(<sep>|\n)
+ *
+ * return:   void.
+ ***************************************************************************
+ */
+static void render(int isdb, char *pre, int rflags, const char *pptxt,
+                  const char *dbtxt, Cons *mid, unsigned long int luval,
+                  double dval)
+{
+       static int newline = 1;
+       const char *txt[]  = {pptxt, dbtxt};
+
+       /* Start a new line? */
+       if (newline && !DISPLAY_HORIZONTALLY(flags)) {
+               printf("%s", pre);
+       }
+
+       /* Terminate this one ? ppc always gets a newline */
+       newline = ((rflags & PT_NEWLIN) || !isdb);
+
+       if (txt[isdb]) {
+               /* pp/dbtxt? */
+
+               printf("%s", seps[isdb]);       /* Only if something actually gets printed */
+
+               if (mid) {
+                       /* Got format args? */
+                       switch(mid->t) {
+                       case iv:
+                               printf(txt[isdb], mid->a.i, mid->b.i);
+                               break;
+                       case sv:
+                               printf(txt[isdb], mid->a.s, mid->b.s);
+                               break;
+                       }
+               }
+               else {
+                       printf(txt[isdb]);      /* No args */
+               }
+       }
+
+       if (rflags & PT_USEINT) {
+               printf("%s%lu", seps[isdb], luval);
+       }
+       else {
+               printf("%s%.2f", seps[isdb], dval);
+       }
+       if (newline) {
+               printf("\n");
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display CPU statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @g_itv      Interval of time in jiffies multiplied by the number
+ *             of processors.
+ ***************************************************************************
+ */
+__print_funct_t render_cpu_stats(struct activity *a, int isdb, char *pre,
+                                int curr, unsigned long long g_itv)
+{
+       int i, cpu_offline;
+       struct stats_cpu *scc, *scp;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+               
+               scc = (struct stats_cpu *) ((char *) a->buf[curr]  + i * a->msize);
+               scp = (struct stats_cpu *) ((char *) a->buf[!curr] + i * a->msize);
+
+               /* Should current CPU (including CPU "all") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+                       
+                       if (!i) {
+                               /* This is CPU "all" */
+                               if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                                       render(isdb, pre,
+                                              PT_NOFLAG,       /* that's zero but you know what it means */
+                                              "all\t%%user",   /* all ppctext is used as format, thus '%%' */
+                                              "-1",            /* look! dbtext */
+                                              NULL,            /* no args */
+                                              NOVAL,           /* another 0, named for readability */
+                                              ll_sp_value(scp->cpu_user, scc->cpu_user, g_itv));
+                               }
+                               else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "all\t%%usr", "-1", NULL,
+                                              NOVAL,
+                                              ll_sp_value(scp->cpu_user - scp->cpu_guest,
+                                                          scc->cpu_user - scc->cpu_guest,
+                                                          g_itv));
+                               }
+                               
+                               render(isdb, pre, PT_NOFLAG,
+                                      "all\t%%nice", NULL, NULL,
+                                      NOVAL,
+                                      ll_sp_value(scp->cpu_nice, scc->cpu_nice, g_itv));
+
+                               if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "all\t%%system", NULL, NULL,
+                                              NOVAL,
+                                              ll_sp_value(scp->cpu_sys + scp->cpu_hardirq + scp->cpu_softirq,
+                                                          scc->cpu_sys + scc->cpu_hardirq + scc->cpu_softirq,
+                                                          g_itv));
+                               }
+                               else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "all\t%%sys", NULL, NULL,
+                                              NOVAL,
+                                              ll_sp_value(scp->cpu_sys, scc->cpu_sys, g_itv));
+                               }
+                               
+                               render(isdb, pre, PT_NOFLAG,
+                                      "all\t%%iowait", NULL, NULL,
+                                      NOVAL,
+                                      ll_sp_value(scp->cpu_iowait, scc->cpu_iowait, g_itv));
+
+                               render(isdb, pre, PT_NOFLAG,
+                                      "all\t%%steal", NULL, NULL,
+                                      NOVAL,
+                                      ll_sp_value(scp->cpu_steal, scc->cpu_steal, g_itv));
+
+                               if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "all\t%%irq", NULL, NULL,
+                                              NOVAL,
+                                              ll_sp_value(scp->cpu_hardirq, scc->cpu_hardirq, g_itv));
+
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "all\t%%soft", NULL, NULL,
+                                              NOVAL,
+                                              ll_sp_value(scp->cpu_softirq, scc->cpu_softirq, g_itv));
+
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "all\t%%guest", NULL, NULL,
+                                              NOVAL,
+                                              ll_sp_value(scp->cpu_guest, scc->cpu_guest, g_itv));
+                               }
+
+                               render(isdb, pre, pt_newlin,
+                                      "all\t%%idle", NULL, NULL,
+                                      NOVAL,
+                                      (scc->cpu_idle < scp->cpu_idle) ?
+                                      0.0 :
+                                      ll_sp_value(scp->cpu_idle, scc->cpu_idle, g_itv));
+                       }
+                       else {
+                               /*
+                                * If the CPU is offline then it is omited from /proc/stat:
+                                * All the fields couldn't have been read and the sum of them is zero.
+                                * (Remember that guest time is already included in user mode.)
+                                */
+                               if ((scc->cpu_user    + scc->cpu_nice + scc->cpu_sys   +
+                                    scc->cpu_iowait  + scc->cpu_idle + scc->cpu_steal +
+                                    scc->cpu_hardirq + scc->cpu_softirq) == 0) {
+                                       /*
+                                        * Set current struct fields (which have been set to zero)
+                                        * to values from previous iteration. Hence their values won't
+                                        * jump from zero when the CPU comes back online.
+                                        */
+                                       *scc = *scp;
+                                       
+                                       g_itv = 0;
+                                       cpu_offline = TRUE;
+                               }
+                               else {
+                                       /*
+                                        * Recalculate itv for current proc.
+                                        * If the result is 0, then current CPU is a tickless one.
+                                        */
+                                       g_itv = get_per_cpu_interval(scc, scp);
+                                       cpu_offline = FALSE;
+                               }
+
+                               if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "cpu%d\t%%user",         /* ppc text with formatting */
+                                              "%d",                    /* db text with format char */
+                                              cons(iv, i - 1, NOVAL),  /* how we pass format args  */
+                                              NOVAL,
+                                              !g_itv ?
+                                              0.0 :                    /* CPU is offline or tickless */
+                                              ll_sp_value(scp->cpu_user, scc->cpu_user, g_itv));
+                               }
+                               else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "cpu%d\t%%usr", "%d", cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              !g_itv ?
+                                              0.0 :                    /* CPU is offline or tickless */
+                                              ll_sp_value(scp->cpu_user - scp->cpu_guest,
+                                                          scc->cpu_user - scc->cpu_guest, g_itv));
+                               }
+                               
+                               render(isdb, pre, PT_NOFLAG,
+                                      "cpu%d\t%%nice", NULL, cons(iv, i - 1, NOVAL),
+                                      NOVAL,
+                                      !g_itv ?
+                                      0.0 :
+                                      ll_sp_value(scp->cpu_nice, scc->cpu_nice, g_itv));
+
+                               if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "cpu%d\t%%system", NULL, cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              !g_itv ?
+                                              0.0 :
+                                              ll_sp_value(scp->cpu_sys + scp->cpu_hardirq + scp->cpu_softirq,
+                                                          scc->cpu_sys + scc->cpu_hardirq + scc->cpu_softirq,
+                                                          g_itv));
+                               }
+                               else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "cpu%d\t%%sys", NULL, cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              !g_itv ?
+                                              0.0 :
+                                              ll_sp_value(scp->cpu_sys, scc->cpu_sys, g_itv));
+                               }
+                               
+                               render(isdb, pre, PT_NOFLAG,
+                                      "cpu%d\t%%iowait", NULL, cons(iv, i - 1, NOVAL),
+                                      NOVAL,
+                                      !g_itv ?
+                                      0.0 :
+                                      ll_sp_value(scp->cpu_iowait, scc->cpu_iowait, g_itv));
+
+                               render(isdb, pre, PT_NOFLAG,
+                                      "cpu%d\t%%steal", NULL, cons(iv, i - 1, NOVAL),
+                                      NOVAL,
+                                      !g_itv ?
+                                      0.0 :
+                                      ll_sp_value(scp->cpu_steal, scc->cpu_steal, g_itv));
+
+                               if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "cpu%d\t%%irq", NULL, cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              !g_itv ?
+                                              0.0 :
+                                              ll_sp_value(scp->cpu_hardirq, scc->cpu_hardirq, g_itv));
+
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "cpu%d\t%%soft", NULL, cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              !g_itv ?
+                                              0.0 :
+                                              ll_sp_value(scp->cpu_softirq, scc->cpu_softirq, g_itv));
+                                       
+                                       render(isdb, pre, PT_NOFLAG,
+                                              "cpu%d\t%%guest", NULL, cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              !g_itv ?
+                                              0.0 :
+                                              ll_sp_value(scp->cpu_guest, scc->cpu_guest, g_itv));
+                               }
+                               
+                               if (!g_itv) {
+                                       /* CPU is offline or tickless */
+                                       render(isdb, pre, pt_newlin,
+                                              "cpu%d\t%%idle", NULL, cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              cpu_offline ?
+                                              0.0 : 100.0);
+                               }
+                               else {
+                                       render(isdb, pre, pt_newlin,
+                                              "cpu%d\t%%idle", NULL, cons(iv, i - 1, NOVAL),
+                                              NOVAL,
+                                              (scc->cpu_idle < scp->cpu_idle) ?
+                                              0.0 :
+                                              ll_sp_value(scp->cpu_idle, scc->cpu_idle, g_itv));
+                               }
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display task creation and context switch statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_pcsw_stats(struct activity *a, int isdb, char *pre,
+                                 int curr, unsigned long long itv)
+{
+       struct stats_pcsw
+               *spc = (struct stats_pcsw *) a->buf[curr],
+               *spp = (struct stats_pcsw *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       /* The first one as an example */
+       render(isdb,            /* db/ppc flag */
+              pre,             /* the preformatted line leader */
+              PT_NOFLAG,       /* is this the end of a db line? */
+              "-\tproc/s",     /* ppc text */
+              NULL,            /* db text */
+              NULL,            /* db/ppc text format args (Cons *) */
+              NOVAL,           /* %lu value (unused unless PT_USEINT) */
+              /* and %.2f value, used unless PT_USEINT */
+              S_VALUE(spp->processes, spc->processes, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tcswch/s", NULL, NULL,
+              NOVAL,
+              ll_s_value(spp->context_switch, spc->context_switch, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display interrupts statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_irq_stats(struct activity *a, int isdb, char *pre,
+                                int curr, unsigned long long itv)
+{
+       int i;
+       struct stats_irq *sic, *sip;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+
+               sic = (struct stats_irq *) ((char *) a->buf[curr]  + i * a->msize);
+               sip = (struct stats_irq *) ((char *) a->buf[!curr] + i * a->msize);
+               
+               /* Should current interrupt (including int "sum") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+                       
+                       /* Yes: Display it */
+                       if (!i) {
+                               /* This is interrupt "sum" */
+                               render(isdb, pre, pt_newlin,
+                                      "sum\tintr/s", "-1", NULL,
+                                      NOVAL,
+                                      ll_s_value(sip->irq_nr, sic->irq_nr, itv));
+                       }
+                       else {
+                               render(isdb, pre, pt_newlin,
+                                      "i%03d\tintr/s", "%d", cons(iv, i - 1, NOVAL),
+                                      NOVAL,
+                                      ll_s_value(sip->irq_nr, sic->irq_nr, itv));
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display swapping statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_swap_stats(struct activity *a, int isdb, char *pre,
+                                 int curr, unsigned long long itv)
+{
+       struct stats_swap
+               *ssc = (struct stats_swap *) a->buf[curr],
+               *ssp = (struct stats_swap *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpswpin/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(ssp->pswpin, ssc->pswpin, itv));
+       render(isdb, pre, pt_newlin,
+              "-\tpswpout/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(ssp->pswpout, ssc->pswpout, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display paging statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_paging_stats(struct activity *a, int isdb, char *pre,
+                                   int curr, unsigned long long itv)
+{
+       struct stats_paging
+               *spc = (struct stats_paging *) a->buf[curr],
+               *spp = (struct stats_paging *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpgpgin/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgpgin, spc->pgpgin, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpgpgout/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgpgout, spc->pgpgout, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tfault/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgfault, spc->pgfault, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tmajflt/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgmajfault, spc->pgmajfault, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpgfree/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgfree, spc->pgfree, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpgscank/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgscan_kswapd, spc->pgscan_kswapd, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpgscand/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgscan_direct, spc->pgscan_direct, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpgsteal/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(spp->pgsteal, spc->pgsteal, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\t%%vmeff", NULL, NULL,
+              NOVAL,
+              (spc->pgscan_kswapd + spc->pgscan_direct -
+               spp->pgscan_kswapd - spp->pgscan_direct) ?
+              SP_VALUE(spp->pgsteal, spc->pgsteal,
+                       spc->pgscan_kswapd + spc->pgscan_direct -
+                       spp->pgscan_kswapd - spp->pgscan_direct) : 0.0);
+}
+
+/*
+ ***************************************************************************
+ * Display I/O and transfer rate statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_io_stats(struct activity *a, int isdb, char *pre,
+                               int curr, unsigned long long itv)
+{
+       struct stats_io
+               *sic = (struct stats_io *) a->buf[curr],
+               *sip = (struct stats_io *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\ttps", NULL, NULL,
+              NOVAL,
+              S_VALUE(sip->dk_drive, sic->dk_drive, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\trtps", NULL, NULL,
+              NOVAL,
+              S_VALUE(sip->dk_drive_rio, sic->dk_drive_rio, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\twtps", NULL, NULL,
+              NOVAL,
+              S_VALUE(sip->dk_drive_wio, sic->dk_drive_wio, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tbread/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sip->dk_drive_rblk, sic->dk_drive_rblk, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tbwrtn/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sip->dk_drive_wblk, sic->dk_drive_wblk, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display memory and swap statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_memory_stats(struct activity *a, int isdb, char *pre,
+                                   int curr, unsigned long long itv)
+{
+       struct stats_memory
+               *smc = (struct stats_memory *) a->buf[curr],
+               *smp = (struct stats_memory *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+               
+       if (DISPLAY_MEMORY(a->opt_flags)) {
+
+               render(isdb, pre, PT_NOFLAG,
+                      "-\tfrmpg/s", NULL, NULL,
+                      NOVAL,
+                      S_VALUE((double) KB_TO_PG(smp->frmkb),
+                              (double) KB_TO_PG(smc->frmkb), itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "-\tbufpg/s", NULL, NULL,
+                      NOVAL,
+                      S_VALUE((double) KB_TO_PG(smp->bufkb),
+                              (double) KB_TO_PG(smc->bufkb), itv));
+
+               render(isdb, pre, pt_newlin,
+                      "-\tcampg/s", NULL, NULL,
+                      NOVAL,
+                      S_VALUE((double) KB_TO_PG(smp->camkb),
+                              (double) KB_TO_PG(smc->camkb), itv));
+       }
+
+       if (DISPLAY_MEM_AMT(a->opt_flags)) {
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbmemfree", NULL, NULL,
+                      smc->frmkb, DNOVAL);
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbmemused", NULL, NULL,
+                      smc->tlmkb - smc->frmkb, DNOVAL);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "-\t%%memused", NULL, NULL, NOVAL,
+                      smc->tlmkb ?
+                      SP_VALUE(smc->frmkb, smc->tlmkb, smc->tlmkb) :
+                      0.0);
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbbuffers", NULL, NULL,
+                      smc->bufkb, DNOVAL);
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbcached", NULL, NULL,
+                      smc->camkb, DNOVAL);
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbcommit", NULL, NULL,
+                      smc->comkb, DNOVAL);
+
+               render(isdb, pre, pt_newlin,
+                      "-\t%%commit", NULL, NULL, NOVAL,
+                      (smc->tlmkb + smc->tlskb) ?
+                      SP_VALUE(0, smc->comkb, smc->tlmkb + smc->tlskb) :
+                      0.0);
+       }
+       
+       if (DISPLAY_SWAP(a->opt_flags)) {
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbswpfree", NULL, NULL,
+                      smc->frskb, DNOVAL);
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbswpused", NULL, NULL,
+                      smc->tlskb - smc->frskb, DNOVAL);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "-\t%%swpused", NULL, NULL, NOVAL,
+                      smc->tlskb ?
+                      SP_VALUE(smc->frskb, smc->tlskb, smc->tlskb) :
+                      0.0);
+
+               render(isdb, pre, PT_USEINT,
+                      "-\tkbswpcad", NULL, NULL,
+                      smc->caskb, DNOVAL);
+
+               render(isdb, pre, pt_newlin,
+                      "-\t%%swpcad", NULL, NULL, NOVAL,
+                      (smc->tlskb - smc->frskb) ?
+                      SP_VALUE(0, smc->caskb, smc->tlskb - smc->frskb) :
+                      0.0);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display kernel tables statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_ktables_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       struct stats_ktables
+               *skc = (struct stats_ktables *) a->buf[curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_USEINT,
+              "-\tdentunusd", NULL, NULL,
+              skc->dentry_stat, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\tfile-nr", NULL, NULL,
+              skc->file_used, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\tinode-nr", NULL, NULL,
+              skc->inode_used, DNOVAL);
+
+       render(isdb, pre, PT_USEINT | pt_newlin,
+              "-\tpty-nr", NULL, NULL,
+              skc->pty_nr, DNOVAL);
+}
+
+/*
+ ***************************************************************************
+ * Display queue and load statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_queue_stats(struct activity *a, int isdb, char *pre,
+                                  int curr, unsigned long long itv)
+{
+       struct stats_queue
+               *sqc = (struct stats_queue *) a->buf[curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_USEINT,
+              "-\trunq-sz", NULL, NULL,
+              sqc->nr_running, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\tplist-sz", NULL, NULL,
+              sqc->nr_threads, DNOVAL);
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tldavg-1", NULL, NULL,
+              NOVAL,
+              (double) sqc->load_avg_1 / 100);
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tldavg-5", NULL, NULL,
+              NOVAL,
+              (double) sqc->load_avg_5 / 100);
+
+       render(isdb, pre, pt_newlin,
+              "-\tldavg-15", NULL, NULL,
+              NOVAL,
+              (double) sqc->load_avg_15 / 100);
+}
+
+/*
+ ***************************************************************************
+ * Display serial lines statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_serial_stats(struct activity *a, int isdb, char *pre,
+                                   int curr, unsigned long long itv)
+{
+       int i;
+       struct stats_serial *ssc, *ssp;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; i < a->nr; i++) {
+
+               ssc = (struct stats_serial *) ((char *) a->buf[curr]  + i * a->msize);
+               ssp = (struct stats_serial *) ((char *) a->buf[!curr] + i * a->msize);
+
+               if (ssc->line == 0)
+                       continue;
+
+               if (ssc->line == ssp->line) {
+                       render(isdb, pre, PT_NOFLAG,
+                              "ttyS%d\trcvin/s", "%d",
+                              cons(iv, ssc->line - 1, NOVAL),
+                              NOVAL,
+                              S_VALUE(ssp->rx, ssc->rx, itv));
+
+                       render(isdb, pre, PT_NOFLAG,
+                              "ttyS%d\txmtin/s", "%d",
+                              cons(iv, ssc->line - 1, NOVAL),
+                              NOVAL,
+                              S_VALUE(ssp->tx, ssc->tx, itv));
+
+                       render(isdb, pre, PT_NOFLAG,
+                              "ttyS%d\tframerr/s", "%d",
+                              cons(iv, ssc->line - 1, NOVAL),
+                              NOVAL,
+                              S_VALUE(ssp->frame, ssc->frame, itv));
+
+                       render(isdb, pre, PT_NOFLAG,
+                              "ttyS%d\tprtyerr/s", "%d",
+                              cons(iv, ssc->line - 1, NOVAL),
+                              NOVAL,
+                              S_VALUE(ssp->parity, ssc->parity, itv));
+
+                       render(isdb, pre, PT_NOFLAG,
+                              "ttyS%d\tbrk/s", "%d",
+                              cons(iv, ssc->line - 1, NOVAL),
+                              NOVAL,
+                              S_VALUE(ssp->brk, ssc->brk, itv));
+
+                       render(isdb, pre, pt_newlin,
+                              "ttyS%d\tovrun/s", "%d",
+                              cons(iv, ssc->line - 1, NOVAL),
+                              NOVAL,
+                              S_VALUE(ssp->overrun, ssc->overrun, itv));
+               }
+       }
+
+}
+
+/*
+ ***************************************************************************
+ * Display disks statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_disk_stats(struct activity *a, int isdb, char *pre,
+                                 int curr, unsigned long long itv)
+{
+       int i, j;
+       struct stats_disk *sdc, *sdp;
+       struct ext_disk_stats xds;
+       char *dev_name;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; i < a->nr; i++) {
+
+               sdc = (struct stats_disk *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!(sdc->major + sdc->minor))
+                       continue;
+
+               j = check_disk_reg(a, curr, !curr, i);
+               sdp = (struct stats_disk *) ((char *) a->buf[!curr] + j * a->msize);
+               
+               /* Compute extended stats (service time, etc.) */
+               compute_ext_disk_stats(sdc, sdp, itv, &xds);
+
+               dev_name = NULL;
+
+               if ((USE_PRETTY_OPTION(flags)) && (sdc->major == DEVMAP_MAJOR)) {
+                       dev_name = transform_devmapname(sdc->major, sdc->minor);
+               }
+
+               if (!dev_name) {
+                       dev_name = get_devname(sdc->major, sdc->minor,
+                                              USE_PRETTY_OPTION(flags));
+               }
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\ttps", "%s",
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      S_VALUE(sdp->nr_ios, sdc->nr_ios, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trd_sec/s", NULL,
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      ll_s_value(sdp->rd_sect, sdc->rd_sect, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\twr_sec/s", NULL,
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      ll_s_value(sdp->wr_sect, sdc->wr_sect, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\tavgrq-sz", NULL,
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      xds.arqsz);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\tavgqu-sz", NULL,
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      S_VALUE(sdp->rq_ticks, sdc->rq_ticks, itv) / 1000.0);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\tawait", NULL,
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      xds.await);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\tsvctm", NULL,
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      xds.svctm);
+
+               render(isdb, pre, pt_newlin,
+                      "%s\t%%util", NULL,
+                      cons(sv, dev_name, NULL),
+                      NOVAL,
+                      xds.util / 10.0);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display network interfaces statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_dev_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       int i, j;
+       struct stats_net_dev *sndc, *sndp;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; i < a->nr; i++) {
+
+               sndc = (struct stats_net_dev *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!strcmp(sndc->interface, ""))
+                       continue;
+               
+               j = check_net_dev_reg(a, curr, !curr, i);
+               sndp = (struct stats_net_dev *) ((char *) a->buf[!curr] + j * a->msize);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trxpck/s", "%s",
+                      cons(sv, sndc->interface, NULL), /* What if the format args are strings? */
+                      NOVAL,
+                      S_VALUE(sndp->rx_packets, sndc->rx_packets, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\ttxpck/s", NULL,
+                      cons(sv, sndc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(sndp->tx_packets, sndc->tx_packets, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trxkB/s", NULL,
+                      cons(sv, sndc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(sndp->rx_bytes, sndc->rx_bytes, itv) / 1024);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\ttxkB/s", NULL,
+                      cons(sv, sndc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(sndp->tx_bytes, sndc->tx_bytes, itv) / 1024);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trxcmp/s", NULL,
+                      cons(sv, sndc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(sndp->rx_compressed, sndc->rx_compressed, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\ttxcmp/s", NULL,
+                      cons(sv, sndc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(sndp->tx_compressed, sndc->tx_compressed, itv));
+
+               render(isdb, pre, pt_newlin,
+                      "%s\trxmcst/s", NULL,
+                      cons(sv, sndc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(sndp->multicast, sndc->multicast, itv));
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display network interface errors statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_edev_stats(struct activity *a, int isdb, char *pre,
+                                     int curr, unsigned long long itv)
+{
+       int i, j;
+       struct stats_net_edev *snedc, *snedp;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; i < a->nr; i++) {
+
+               snedc = (struct stats_net_edev *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!strcmp(snedc->interface, ""))
+                       continue;
+               
+               j = check_net_edev_reg(a, curr, !curr, i);
+               snedp = (struct stats_net_edev *) ((char *) a->buf[!curr] + j * a->msize);
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trxerr/s", "%s",
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->rx_errors, snedc->rx_errors, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\ttxerr/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->tx_errors, snedc->tx_errors, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\tcoll/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->collisions, snedc->collisions, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trxdrop/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->rx_dropped, snedc->rx_dropped, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\ttxdrop/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->tx_dropped, snedc->tx_dropped, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\ttxcarr/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->tx_carrier_errors, snedc->tx_carrier_errors, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trxfram/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->rx_frame_errors, snedc->rx_frame_errors, itv));
+
+               render(isdb, pre, PT_NOFLAG,
+                      "%s\trxfifo/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->rx_fifo_errors, snedc->rx_fifo_errors, itv));
+
+               render(isdb, pre, pt_newlin,
+                      "%s\ttxfifo/s", NULL,
+                      cons(sv, snedc->interface, NULL),
+                      NOVAL,
+                      S_VALUE(snedp->tx_fifo_errors, snedc->tx_fifo_errors, itv));
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display NFS client statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_nfs_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       struct stats_net_nfs
+               *snnc = (struct stats_net_nfs *) a->buf[curr],
+               *snnp = (struct stats_net_nfs *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tcall/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snnp->nfs_rpccnt, snnc->nfs_rpccnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tretrans/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snnp->nfs_rpcretrans, snnc->nfs_rpcretrans, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tread/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snnp->nfs_readcnt, snnc->nfs_readcnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\twrite/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snnp->nfs_writecnt, snnc->nfs_writecnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\taccess/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snnp->nfs_accesscnt, snnc->nfs_accesscnt, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tgetatt/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snnp->nfs_getattcnt, snnc->nfs_getattcnt, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display NFS server statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_nfsd_stats(struct activity *a, int isdb, char *pre,
+                                     int curr, unsigned long long itv)
+{
+       struct stats_net_nfsd
+               *snndc = (struct stats_net_nfsd *) a->buf[curr],
+               *snndp = (struct stats_net_nfsd *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tscall/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_rpccnt, snndc->nfsd_rpccnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tbadcall/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_rpcbad, snndc->nfsd_rpcbad, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpacket/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_netcnt, snndc->nfsd_netcnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tudp/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_netudpcnt, snndc->nfsd_netudpcnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\ttcp/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_nettcpcnt, snndc->nfsd_nettcpcnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\thit/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_rchits, snndc->nfsd_rchits, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tmiss/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_rcmisses, snndc->nfsd_rcmisses, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tsread/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_readcnt, snndc->nfsd_readcnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tswrite/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_writecnt, snndc->nfsd_writecnt, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tsaccess/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_accesscnt, snndc->nfsd_accesscnt, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tsgetatt/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snndp->nfsd_getattcnt, snndc->nfsd_getattcnt, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display network sockets statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_sock_stats(struct activity *a, int isdb, char *pre,
+                                     int curr, unsigned long long itv)
+{
+       struct stats_net_sock
+               *snsc = (struct stats_net_sock *) a->buf[curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       render(isdb, pre, PT_USEINT,
+              "-\ttotsck", NULL, NULL,
+              snsc->sock_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\ttcpsck", NULL, NULL,
+              snsc->tcp_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\tudpsck",  NULL, NULL,
+              snsc->udp_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\trawsck", NULL, NULL,
+              snsc->raw_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\tip-frag", NULL, NULL,
+              snsc->frag_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT | pt_newlin,
+              "-\ttcp-tw", NULL, NULL,
+              snsc->tcp_tw, DNOVAL);
+}
+
+/*
+ ***************************************************************************
+ * Display IP network statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_ip_stats(struct activity *a, int isdb, char *pre,
+                                   int curr, unsigned long long itv)
+{
+       struct stats_net_ip
+               *snic = (struct stats_net_ip *) a->buf[curr],
+               *snip = (struct stats_net_ip *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tirec/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InReceives, snic->InReceives, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tfwddgm/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->ForwDatagrams, snic->ForwDatagrams, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidel/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InDelivers, snic->InDelivers, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\torq/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutRequests, snic->OutRequests, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tasmrq/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->ReasmReqds, snic->ReasmReqds, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tasmok/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->ReasmOKs, snic->ReasmOKs, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tfragok/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->FragOKs, snic->FragOKs, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tfragcrt/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->FragCreates, snic->FragCreates, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display IP network error statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_eip_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       struct stats_net_eip
+               *sneic = (struct stats_net_eip *) a->buf[curr],
+               *sneip = (struct stats_net_eip *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tihdrerr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InHdrErrors, sneic->InHdrErrors, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiadrerr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InAddrErrors, sneic->InAddrErrors, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiukwnpr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InUnknownProtos, sneic->InUnknownProtos, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidisc/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InDiscards, sneic->InDiscards, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\todisc/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutDiscards, sneic->OutDiscards, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tonort/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutNoRoutes, sneic->OutNoRoutes, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tasmf/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->ReasmFails, sneic->ReasmFails, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tfragf/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->FragFails, sneic->FragFails, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMP network statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_icmp_stats(struct activity *a, int isdb, char *pre,
+                                     int curr, unsigned long long itv)
+{
+       struct stats_net_icmp
+               *snic = (struct stats_net_icmp *) a->buf[curr],
+               *snip = (struct stats_net_icmp *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\timsg/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InMsgs, snic->InMsgs, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tomsg/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutMsgs, snic->OutMsgs, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiech/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InEchos, snic->InEchos, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiechr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InEchoReps, snic->InEchoReps, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\toech/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutEchos, snic->OutEchos, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\toechr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutEchoReps, snic->OutEchoReps, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\titm/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InTimestamps, snic->InTimestamps, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\titmr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InTimestampReps, snic->InTimestampReps, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\totm/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutTimestamps, snic->OutTimestamps, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\totmr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutTimestampReps, snic->OutTimestampReps, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiadrmk/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InAddrMasks, snic->InAddrMasks, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiadrmkr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InAddrMaskReps, snic->InAddrMaskReps, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\toadrmk/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutAddrMasks, snic->OutAddrMasks, itv));
+       
+       render(isdb, pre, pt_newlin,
+              "-\toadrmkr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutAddrMaskReps, snic->OutAddrMaskReps, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMP error message statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_eicmp_stats(struct activity *a, int isdb, char *pre,
+                                      int curr, unsigned long long itv)
+{
+       struct stats_net_eicmp
+               *sneic = (struct stats_net_eicmp *) a->buf[curr],
+               *sneip = (struct stats_net_eicmp *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tierr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InErrors, sneic->InErrors, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\toerr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutErrors, sneic->OutErrors, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidstunr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InDestUnreachs, sneic->InDestUnreachs, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\todstunr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutDestUnreachs, sneic->OutDestUnreachs, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\titmex/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InTimeExcds, sneic->InTimeExcds, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\totmex/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutTimeExcds, sneic->OutTimeExcds, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiparmpb/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InParmProbs, sneic->InParmProbs, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\toparmpb/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutParmProbs, sneic->OutParmProbs, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tisrcq/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InSrcQuenchs, sneic->InSrcQuenchs, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tosrcq/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutSrcQuenchs, sneic->OutSrcQuenchs, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiredir/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InRedirects, sneic->InRedirects, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\toredir/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutRedirects, sneic->OutRedirects, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display TCP network statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_tcp_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       struct stats_net_tcp
+               *sntc = (struct stats_net_tcp *) a->buf[curr],
+               *sntp = (struct stats_net_tcp *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tactive/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sntp->ActiveOpens, sntc->ActiveOpens, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tpassive/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sntp->PassiveOpens, sntc->PassiveOpens, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiseg/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sntp->InSegs, sntc->InSegs, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\toseg/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sntp->OutSegs, sntc->OutSegs, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display TCP network error statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_etcp_stats(struct activity *a, int isdb, char *pre,
+                                     int curr, unsigned long long itv)
+{
+       struct stats_net_etcp
+               *snetc = (struct stats_net_etcp *) a->buf[curr],
+               *snetp = (struct stats_net_etcp *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tatmptf/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snetp->AttemptFails, snetc->AttemptFails, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\testres/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snetp->EstabResets, snetc->EstabResets, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tretrans/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snetp->RetransSegs, snetc->RetransSegs, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tisegerr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snetp->InErrs, snetc->InErrs, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\torsts/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snetp->OutRsts, snetc->OutRsts, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display UDP network statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_udp_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       struct stats_net_udp
+               *snuc = (struct stats_net_udp *) a->buf[curr],
+               *snup = (struct stats_net_udp *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidgm/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->InDatagrams, snuc->InDatagrams, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\todgm/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->OutDatagrams, snuc->OutDatagrams, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tnoport/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->NoPorts, snuc->NoPorts, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tidgmerr/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->InErrors, snuc->InErrors, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network sockets statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_sock6_stats(struct activity *a, int isdb, char *pre,
+                                      int curr, unsigned long long itv)
+{
+       struct stats_net_sock6
+               *snsc = (struct stats_net_sock6 *) a->buf[curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       render(isdb, pre, PT_USEINT,
+              "-\ttcp6sck", NULL, NULL,
+              snsc->tcp6_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\tudp6sck",  NULL, NULL,
+              snsc->udp6_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT,
+              "-\traw6sck", NULL, NULL,
+              snsc->raw6_inuse, DNOVAL);
+
+       render(isdb, pre, PT_USEINT | pt_newlin,
+              "-\tip6-frag", NULL, NULL,
+              snsc->frag6_inuse, DNOVAL);
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_ip6_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       struct stats_net_ip6
+               *snic = (struct stats_net_ip6 *) a->buf[curr],
+               *snip = (struct stats_net_ip6 *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tirec6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InReceives6, snic->InReceives6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tfwddgm6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutForwDatagrams6, snic->OutForwDatagrams6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidel6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InDelivers6, snic->InDelivers6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\torq6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutRequests6, snic->OutRequests6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tasmrq6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->ReasmReqds6, snic->ReasmReqds6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tasmok6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->ReasmOKs6, snic->ReasmOKs6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\timcpck6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InMcastPkts6, snic->InMcastPkts6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tomcpck6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutMcastPkts6, snic->OutMcastPkts6, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tfragok6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->FragOKs6, snic->FragOKs6, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tfragcr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->FragCreates6, snic->FragCreates6, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network error statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_eip6_stats(struct activity *a, int isdb, char *pre,
+                                     int curr, unsigned long long itv)
+{
+       struct stats_net_eip6
+               *sneic = (struct stats_net_eip6 *) a->buf[curr],
+               *sneip = (struct stats_net_eip6 *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tihdrer6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InHdrErrors6, sneic->InHdrErrors6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiadrer6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InAddrErrors6, sneic->InAddrErrors6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiukwnp6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InUnknownProtos6, sneic->InUnknownProtos6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\ti2big6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InTooBigErrors6, sneic->InTooBigErrors6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidisc6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InDiscards6, sneic->InDiscards6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\todisc6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutDiscards6, sneic->OutDiscards6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tinort6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InNoRoutes6, sneic->InNoRoutes6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tonort6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutNoRoutes6, sneic->OutNoRoutes6, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tasmf6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->ReasmFails6, sneic->ReasmFails6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tfragf6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->FragFails6, sneic->FragFails6, itv));
+       
+       render(isdb, pre, pt_newlin,
+              "-\titrpck6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InTruncatedPkts6, sneic->InTruncatedPkts6, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMPv6 network statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_icmp6_stats(struct activity *a, int isdb, char *pre,
+                                      int curr, unsigned long long itv)
+{
+       struct stats_net_icmp6
+               *snic = (struct stats_net_icmp6 *) a->buf[curr],
+               *snip = (struct stats_net_icmp6 *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\timsg6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InMsgs6, snic->InMsgs6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tomsg6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutMsgs6, snic->OutMsgs6, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiech6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InEchos6, snic->InEchos6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiechr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InEchoReplies6, snic->InEchoReplies6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\toechr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutEchoReplies6, snic->OutEchoReplies6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tigmbq6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InGroupMembQueries6, snic->InGroupMembQueries6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tigmbr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InGroupMembResponses6, snic->InGroupMembResponses6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\togmbr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutGroupMembResponses6, snic->OutGroupMembResponses6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tigmbrd6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InGroupMembReductions6, snic->InGroupMembReductions6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\togmbrd6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutGroupMembReductions6, snic->OutGroupMembReductions6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tirtsol6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InRouterSolicits6, snic->InRouterSolicits6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tortsol6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutRouterSolicits6, snic->OutRouterSolicits6, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tirtad6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InRouterAdvertisements6, snic->InRouterAdvertisements6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tinbsol6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InNeighborSolicits6, snic->InNeighborSolicits6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tonbsol6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutNeighborSolicits6, snic->OutNeighborSolicits6, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tinbad6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->InNeighborAdvertisements6, snic->InNeighborAdvertisements6, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tonbad6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snip->OutNeighborAdvertisements6, snic->OutNeighborAdvertisements6, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display ICMPv6 error message statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_eicmp6_stats(struct activity *a, int isdb, char *pre,
+                                       int curr, unsigned long long itv)
+{
+       struct stats_net_eicmp6
+               *sneic = (struct stats_net_eicmp6 *) a->buf[curr],
+               *sneip = (struct stats_net_eicmp6 *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tierr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InErrors6, sneic->InErrors6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidtunr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InDestUnreachs6, sneic->InDestUnreachs6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\todtunr6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutDestUnreachs6, sneic->OutDestUnreachs6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\titmex6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InTimeExcds6, sneic->InTimeExcds6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\totmex6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutTimeExcds6, sneic->OutTimeExcds6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiprmpb6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InParmProblems6, sneic->InParmProblems6, itv));
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\toprmpb6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutParmProblems6, sneic->OutParmProblems6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tiredir6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InRedirects6, sneic->InRedirects6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\toredir6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutRedirects6, sneic->OutRedirects6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tipck2b6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->InPktTooBigs6, sneic->InPktTooBigs6, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\topck2b6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(sneip->OutPktTooBigs6, sneic->OutPktTooBigs6, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display UDP6 network statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_net_udp6_stats(struct activity *a, int isdb, char *pre,
+                                     int curr, unsigned long long itv)
+{
+       struct stats_net_udp6
+               *snuc = (struct stats_net_udp6 *) a->buf[curr],
+               *snup = (struct stats_net_udp6 *) a->buf[!curr];
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+       
+       render(isdb, pre, PT_NOFLAG,
+              "-\tidgm6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->InDatagrams6, snuc->InDatagrams6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\todgm6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->OutDatagrams6, snuc->OutDatagrams6, itv));
+
+       render(isdb, pre, PT_NOFLAG,
+              "-\tnoport6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->NoPorts6, snuc->NoPorts6, itv));
+
+       render(isdb, pre, pt_newlin,
+              "-\tidgmer6/s", NULL, NULL,
+              NOVAL,
+              S_VALUE(snup->InErrors6, snuc->InErrors6, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display CPU frequency statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_pwr_cpufreq_stats(struct activity *a, int isdb, char *pre,
+                                        int curr, unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_cpufreq *spc;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+               
+               spc = (struct stats_pwr_cpufreq *) ((char *) a->buf[curr] + i * a->msize);
+
+               /* Should current CPU (including CPU "all") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+                       
+                       if (!i) {
+                               /* This is CPU "all" */
+                               render(isdb, pre, pt_newlin,
+                                      "all\tMHz",
+                                      "-1", NULL,
+                                      NOVAL,
+                                      ((double) spc->cpufreq) / 100);
+                       }
+                       else {
+                               render(isdb, pre, pt_newlin,
+                                      "cpu%d\tMHz",
+                                      "%d", cons(iv, i - 1, NOVAL),
+                                      NOVAL,
+                                      ((double) spc->cpufreq) / 100);
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display fan statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_pwr_fan_stats(struct activity *a, int isdb, char *pre,
+                                    int curr, unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_fan *spc;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_fan *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (isdb) {
+                       render(isdb, pre, PT_USEINT,
+                              "%s\tfan%d\trpm",
+                              "%s", cons(iv, spc->device, i + 1, NOVAL),
+                              i + 1,
+                              NOVAL);
+                       render(isdb, pre, PT_NOFLAG,
+                              "%s\trpm",
+                              NULL, cons(iv, spc->device, NOVAL),
+                              NOVAL,
+                              spc->rpm);
+                       render(isdb, pre, pt_newlin,
+                              "%s\tdrpm",
+                              NULL, cons(iv, spc->device, NOVAL),
+                              NOVAL,
+                              spc->rpm - spc->rpm_min);
+               }
+               else {
+                       render(isdb, pre, PT_NOFLAG,
+                              "fan%d\trpm",
+                              "%d", cons(iv, i + 1, NOVAL),
+                              NOVAL,
+                              spc->rpm);
+                       render(isdb, pre, pt_newlin,
+                              "fan%d\tdrpm",
+                              "%d", cons(iv, i + 1, NOVAL),
+                              NOVAL,
+                              spc->rpm - spc->rpm_min);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display temperature statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_pwr_temp_stats(struct activity *a, int isdb, char *pre,
+                                        int curr, unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_temp *spc;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_temp *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (isdb) {
+                       render(isdb, pre, PT_USEINT,
+                              "%s\ttemp%d\tdegC",
+                              "%s", cons(iv, spc->device, i + 1, NOVAL),
+                              i + 1,
+                              NOVAL);
+                       render(isdb, pre, PT_NOFLAG,
+                              "%s\tdegC",
+                              NULL, cons(iv, spc->device, NOVAL),
+                              NOVAL,
+                              spc->temp);
+                       render(isdb, pre, pt_newlin,
+                              "%s\t%%temp",
+                              NULL, cons(iv, spc->device, NOVAL),
+                              NOVAL,
+                              (spc->temp_max - spc->temp_min) ?
+                              (spc->temp - spc->temp_min) / (spc->temp_max - spc->temp_min) * 100 :
+                              0.0);
+
+               }
+               else {
+                       render(isdb, pre, PT_NOFLAG,
+                              "temp%d\tdegC",
+                              "%s", cons(iv, i + 1, NOVAL),
+                              NOVAL,
+                              spc->temp);
+                       render(isdb, pre, pt_newlin,
+                              "temp%d\t%%temp",
+                              "%s", cons(iv, i + 1, NOVAL),
+                              NOVAL,
+                              (spc->temp_max - spc->temp_min) ?
+                              (spc->temp - spc->temp_min) / (spc->temp_max - spc->temp_min) * 100 :
+                              0.0);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display voltage inputs statistics in selected format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @isdb       Flag, true if db printing, false if ppc printing.
+ * @pre                Prefix string for output entries
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t render_pwr_in_stats(struct activity *a, int isdb, char *pre,
+                                   int curr, unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_in *spc;
+       int pt_newlin
+               = (DISPLAY_HORIZONTALLY(flags) ? PT_NOFLAG : PT_NEWLIN);
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_in *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (isdb) {
+                       render(isdb, pre, PT_USEINT,
+                              "%s\tin%d\tinV",
+                              "%s", cons(iv, spc->device, i, NOVAL),
+                              i,
+                              NOVAL);
+                       render(isdb, pre, PT_NOFLAG,
+                              "%s\tinV",
+                              NULL, cons(iv, spc->device, NOVAL),
+                              NOVAL,
+                              spc->in);
+                       render(isdb, pre, pt_newlin,
+                              "%s\t%%in",
+                              NULL, cons(iv, spc->device, NOVAL),
+                              NOVAL,
+                              (spc->in_max - spc->in_min) ?
+                              (spc->in - spc->in_min) / (spc->in_max - spc->in_min) * 100 :
+                              0.0);
+
+               }
+               else {
+                       render(isdb, pre, PT_NOFLAG,
+                              "in%d\tinV",
+                              "%s", cons(iv, i, NOVAL),
+                              NOVAL,
+                              spc->in);
+                       render(isdb, pre, pt_newlin,
+                              "in%d\t%%in",
+                              "%s", cons(iv, i, NOVAL),
+                              NOVAL,
+                              (spc->in_max - spc->in_min) ?
+                              (spc->in - spc->in_min) / (spc->in_max - spc->in_min) * 100 :
+                              0.0);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Print tabulations
+ *
+ * IN:
+ * @nr_tab      Number of tabs to print.
+ ***************************************************************************
+ */
+void prtab(int nr_tab)
+{
+       int i;
+
+       for (i = 0; i < nr_tab; i++) {
+               printf("\t");
+       }
+}
+
+/*
+ ***************************************************************************
+ * printf() function modified for XML display
+ *
+ * IN:
+ * @nr_tab      Number of tabs to print.
+ * @fmt         printf() format.
+ ***************************************************************************
+ */
+void xprintf(int nr_tab, const char *fmt, ...)
+{
+       static char buf[1024];
+       va_list args;
+
+       va_start(args, fmt);
+       vsnprintf(buf, sizeof(buf), fmt, args);
+       va_end(args);
+
+       prtab(nr_tab);
+       printf("%s\n", buf);
+}
+
+/*
+ ***************************************************************************
+ * Open or close <network> markup.
+ *
+ * IN:
+ * @tab                Number of tabulations.
+ * @action     Open or close action.
+ ***************************************************************************
+ */
+void xml_markup_network(int tab, int action)
+{
+       static int markup_state = CLOSE_XML_MARKUP;
+
+       if (action == markup_state)
+               return;
+       markup_state = action;
+
+       if (action == OPEN_XML_MARKUP) {
+               /* Open markup */
+               xprintf(tab, "<network per=\"second\">");
+       }
+       else {
+               /* Close markup */
+               xprintf(tab, "</network>");
+       }
+}
+
+/*
+ ***************************************************************************
+ * Open or close <power-management> markup.
+ *
+ * IN:
+ * @tab                Number of tabulations.
+ * @action     Open or close action.
+ ***************************************************************************
+ */
+void xml_markup_power_management(int tab, int action)
+{
+       static int markup_state = CLOSE_XML_MARKUP;
+
+       if (action == markup_state)
+               return;
+       markup_state = action;
+
+       if (action == OPEN_XML_MARKUP) {
+               /* Open markup */
+               xprintf(tab, "<power-management>");
+       }
+       else {
+               /* Close markup */
+               xprintf(tab, "</power-management>");
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display CPU statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @g_itv      Interval of time in jiffies mutliplied by the number of
+ *             processors.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_cpu_stats(struct activity *a, int curr, int tab,
+                                   unsigned long long g_itv)
+{
+       int i, cpu_offline;
+       struct stats_cpu *scc, *scp;
+       char cpuno[8];
+
+       if (DISPLAY_CPU_DEF(a->opt_flags)) {
+               xprintf(tab++, "<cpu-load>");
+       }
+       else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+               xprintf(tab++, "<cpu-load-all>");
+       }
+
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+               
+               scc = (struct stats_cpu *) ((char *) a->buf[curr]  + i * a->msize);
+               scp = (struct stats_cpu *) ((char *) a->buf[!curr] + i * a->msize);
+
+               /* Should current CPU (including CPU "all") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+                       
+                       /* Yes: Display it */
+                       if (!i) {
+                               /* This is CPU "all" */
+                               strcpy(cpuno, "all");
+                       }
+                       else {
+                               sprintf(cpuno, "%d", i - 1);
+
+                               /*
+                                * If the CPU is offline then it is omited from /proc/stat:
+                                * All the fields couldn't have been read and the sum of them is zero.
+                                * (Remember that guest time is already included in user mode.)
+                                */
+                               if ((scc->cpu_user    + scc->cpu_nice + scc->cpu_sys   +
+                                    scc->cpu_iowait  + scc->cpu_idle + scc->cpu_steal +
+                                    scc->cpu_hardirq + scc->cpu_softirq) == 0) {
+                                       /*
+                                        * Set current struct fields (which have been set to zero)
+                                        * to values from previous iteration. Hence their values won't
+                                        * jump from zero when the CPU comes back online.
+                                        */
+                                       *scc = *scp;
+
+                                       g_itv = 0;
+                                       cpu_offline = TRUE;
+                               }
+                               else {
+                                       /*
+                                        * Recalculate interval for current proc.
+                                        * If result is 0 then current CPU is a tickless one.
+                                        */
+                                       g_itv = get_per_cpu_interval(scc, scp);
+                                       cpu_offline = FALSE;
+                               }
+                               
+                               if (!g_itv) {
+                                       /* Current CPU is offline or tickless */
+                                       if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                                               xprintf(tab, "<cpu number=\"%d\" "
+                                                       "user=\"%.2f\" "
+                                                       "nice=\"%.2f\" "
+                                                       "system=\"%.2f\" "
+                                                       "iowait=\"%.2f\" "
+                                                       "steal=\"%.2f\" "
+                                                       "idle=\"%.2f\"/>",
+                                                       i - 1, 0.0, 0.0, 0.0, 0.0, 0.0,
+                                                       cpu_offline ? 0.0 : 100.0);
+                                       }
+                                       else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                                               xprintf(tab, "<cpu number=\"%d\" "
+                                                       "usr=\"%.2f\" "
+                                                       "nice=\"%.2f\" "
+                                                       "sys=\"%.2f\" "
+                                                       "iowait=\"%.2f\" "
+                                                       "steal=\"%.2f\" "
+                                                       "irq=\"%.2f\" "
+                                                       "soft=\"%.2f\" "
+                                                       "guest=\"%.2f\" "
+                                                       "idle=\"%.2f\"/>",
+                                                       i - 1, 0.0, 0.0, 0.0, 0.0,
+                                                       0.0, 0.0, 0.0, 0.0,
+                                                       cpu_offline ? 0.0 : 100.0);
+                                       }
+                                       continue;
+                               }
+                       }
+
+                       if (DISPLAY_CPU_DEF(a->opt_flags)) {
+                               xprintf(tab, "<cpu number=\"%s\" "
+                                       "user=\"%.2f\" "
+                                       "nice=\"%.2f\" "
+                                       "system=\"%.2f\" "
+                                       "iowait=\"%.2f\" "
+                                       "steal=\"%.2f\" "
+                                       "idle=\"%.2f\"/>",
+                                       cpuno,
+                                       ll_sp_value(scp->cpu_user,   scc->cpu_user,   g_itv),
+                                       ll_sp_value(scp->cpu_nice,   scc->cpu_nice,   g_itv),
+                                       ll_sp_value(scp->cpu_sys + scp->cpu_hardirq + scp->cpu_softirq,
+                                                   scc->cpu_sys + scc->cpu_hardirq + scc->cpu_softirq,
+                                                   g_itv),
+                                       ll_sp_value(scp->cpu_iowait, scc->cpu_iowait, g_itv),
+                                       ll_sp_value(scp->cpu_steal,  scc->cpu_steal,  g_itv),
+                                       scc->cpu_idle < scp->cpu_idle ?
+                                       0.0 :
+                                       ll_sp_value(scp->cpu_idle,   scc->cpu_idle,   g_itv));
+                       }
+                       else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+                               xprintf(tab, "<cpu number=\"%s\" "
+                                       "usr=\"%.2f\" "
+                                       "nice=\"%.2f\" "
+                                       "sys=\"%.2f\" "
+                                       "iowait=\"%.2f\" "
+                                       "steal=\"%.2f\" "
+                                       "irq=\"%.2f\" "
+                                       "soft=\"%.2f\" "
+                                       "guest=\"%.2f\" "
+                                       "idle=\"%.2f\"/>",
+                                       cpuno,
+                                       ll_sp_value(scp->cpu_user - scp->cpu_guest,
+                                                   scc->cpu_user - scc->cpu_guest,     g_itv),
+                                       ll_sp_value(scp->cpu_nice,    scc->cpu_nice,    g_itv),
+                                       ll_sp_value(scp->cpu_sys,     scc->cpu_sys,     g_itv),
+                                       ll_sp_value(scp->cpu_iowait,  scc->cpu_iowait,  g_itv),
+                                       ll_sp_value(scp->cpu_steal,   scc->cpu_steal,   g_itv),
+                                       ll_sp_value(scp->cpu_hardirq, scc->cpu_hardirq, g_itv),
+                                       ll_sp_value(scp->cpu_softirq, scc->cpu_softirq, g_itv),
+                                       ll_sp_value(scp->cpu_guest,   scc->cpu_guest,   g_itv),
+                                       scc->cpu_idle < scp->cpu_idle ?
+                                       0.0 :
+                                       ll_sp_value(scp->cpu_idle,   scc->cpu_idle,   g_itv));
+                       }
+               }
+       }
+
+       if (DISPLAY_CPU_DEF(a->opt_flags)) {
+               xprintf(--tab, "</cpu-load>");
+       }
+       else if (DISPLAY_CPU_ALL(a->opt_flags)) {
+               xprintf(--tab, "</cpu-load-all>");
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display task creation and context switch statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_pcsw_stats(struct activity *a, int curr, int tab,
+                                    unsigned long long itv)
+{
+       struct stats_pcsw
+               *spc = (struct stats_pcsw *) a->buf[curr],
+               *spp = (struct stats_pcsw *) a->buf[!curr];
+
+       /* proc/s and cswch/s */
+       xprintf(tab, "<process-and-context-switch per=\"second\" "
+               "proc=\"%.2f\" "
+               "cswch=\"%.2f\"/>",
+               S_VALUE(spp->processes, spc->processes, itv),
+               ll_s_value(spp->context_switch, spc->context_switch, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display interrupts statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_irq_stats(struct activity *a, int curr, int tab,
+                                   unsigned long long itv)
+{
+       int i;
+       struct stats_irq *sic, *sip;
+       char irqno[8];
+       
+       xprintf(tab++, "<interrupts>");
+       xprintf(tab++, "<int-global per=\"second\">");
+
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+
+               sic = (struct stats_irq *) ((char *) a->buf[curr]  + i * a->msize);
+               sip = (struct stats_irq *) ((char *) a->buf[!curr] + i * a->msize);
+               
+               /* Should current interrupt (including int "sum") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+                       
+                       /* Yes: Display it */
+                       if (!i) {
+                               /* This is interrupt "sum" */
+                               strcpy(irqno, "sum");
+                       }
+                       else {
+                               sprintf(irqno, "%d", i - 1);
+                       }
+
+                       xprintf(tab, "<irq intr=\"%s\" value=\"%.2f\"/>", irqno,
+                               ll_s_value(sip->irq_nr, sic->irq_nr, itv));
+               }
+       }
+
+       xprintf(--tab, "</int-global>");
+       xprintf(--tab, "</interrupts>");
+}
+
+/*
+ ***************************************************************************
+ * Display swapping statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_swap_stats(struct activity *a, int curr, int tab,
+                                    unsigned long long itv)
+{
+       struct stats_swap
+               *ssc = (struct stats_swap *) a->buf[curr],
+               *ssp = (struct stats_swap *) a->buf[!curr];
+       
+       xprintf(tab, "<swap-pages per=\"second\" "
+               "pswpin=\"%.2f\" "
+               "pswpout=\"%.2f\"/>",
+               S_VALUE(ssp->pswpin,  ssc->pswpin,  itv),
+               S_VALUE(ssp->pswpout, ssc->pswpout, itv));
+}
+
+/*
+ ***************************************************************************
+ * Display paging statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_paging_stats(struct activity *a, int curr, int tab,
+                                      unsigned long long itv)
+{
+       struct stats_paging
+               *spc = (struct stats_paging *) a->buf[curr],
+               *spp = (struct stats_paging *) a->buf[!curr];
+
+       xprintf(tab, "<paging per=\"second\" "
+               "pgpgin=\"%.2f\" "
+               "pgpgout=\"%.2f\" "
+               "fault=\"%.2f\" "
+               "majflt=\"%.2f\" "
+               "pgfree=\"%.2f\" "
+               "pgscank=\"%.2f\" "
+               "pgscand=\"%.2f\" "
+               "pgsteal=\"%.2f\" "
+               "vmeff-percent=\"%.2f\"/>",
+              S_VALUE(spp->pgpgin,        spc->pgpgin,        itv),
+              S_VALUE(spp->pgpgout,       spc->pgpgout,       itv),
+              S_VALUE(spp->pgfault,       spc->pgfault,       itv),
+              S_VALUE(spp->pgmajfault,    spc->pgmajfault,    itv),
+              S_VALUE(spp->pgfree,        spc->pgfree,        itv),
+              S_VALUE(spp->pgscan_kswapd, spc->pgscan_kswapd, itv),
+              S_VALUE(spp->pgscan_direct, spc->pgscan_direct, itv),
+              S_VALUE(spp->pgsteal,       spc->pgsteal,       itv),
+              (spc->pgscan_kswapd + spc->pgscan_direct -
+               spp->pgscan_kswapd - spp->pgscan_direct) ?
+              SP_VALUE(spp->pgsteal, spc->pgsteal,
+                       spc->pgscan_kswapd + spc->pgscan_direct -
+                       spp->pgscan_kswapd - spp->pgscan_direct) : 0.0);
+}
+
+/*
+ ***************************************************************************
+ * Display I/O and transfer rate statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_io_stats(struct activity *a, int curr, int tab,
+                                  unsigned long long itv)
+{
+       struct stats_io
+               *sic = (struct stats_io *) a->buf[curr],
+               *sip = (struct stats_io *) a->buf[!curr];
+
+       xprintf(tab, "<io per=\"second\">");
+
+       xprintf(++tab, "<tps>%.2f</tps>",
+               S_VALUE(sip->dk_drive, sic->dk_drive, itv));
+       
+       xprintf(tab, "<io-reads rtps=\"%.2f\" bread=\"%.2f\"/>",
+               S_VALUE(sip->dk_drive_rio,  sic->dk_drive_rio,  itv),
+               S_VALUE(sip->dk_drive_rblk, sic->dk_drive_rblk, itv));
+       
+       xprintf(tab, "<io-writes wtps=\"%.2f\" bwrtn=\"%.2f\"/>",
+               S_VALUE(sip->dk_drive_wio,  sic->dk_drive_wio,  itv),
+               S_VALUE(sip->dk_drive_wblk, sic->dk_drive_wblk, itv));
+       
+       xprintf(--tab, "</io>");
+}
+
+/*
+ ***************************************************************************
+ * Display memory statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_memory_stats(struct activity *a, int curr, int tab,
+                                      unsigned long long itv)
+{
+       struct stats_memory
+               *smc = (struct stats_memory *) a->buf[curr],
+               *smp = (struct stats_memory *) a->buf[!curr];
+
+       xprintf(tab, "<memory per=\"second\" unit=\"kB\">");
+       
+       if (DISPLAY_MEM_AMT(a->opt_flags)) {
+
+               xprintf(++tab, "<memfree>%lu</memfree>",
+                       smc->frmkb);
+       
+               xprintf(tab, "<memused>%lu</memused>",
+                       smc->tlmkb - smc->frmkb);
+
+               xprintf(tab, "<memused-percent>%.2f</memused-percent>",
+                       smc->tlmkb ?
+                       SP_VALUE(smc->frmkb, smc->tlmkb, smc->tlmkb) :
+                       0.0);
+       
+               xprintf(tab, "<buffers>%lu</buffers>",
+                       smc->bufkb);
+       
+               xprintf(tab, "<cached>%lu</cached>",
+                       smc->camkb);
+
+               xprintf(tab, "<commit>%lu</commit>",
+                       smc->comkb);
+
+               xprintf(tab--, "<commit-percent>%.2f</commit-percent>",
+                       (smc->tlmkb + smc->tlskb) ?
+                       SP_VALUE(0, smc->comkb, smc->tlmkb + smc->tlskb) :
+                       0.0);
+       }
+               
+       if (DISPLAY_SWAP(a->opt_flags)) {
+
+               xprintf(++tab, "<swpfree>%lu</swpfree>",
+                       smc->frskb);
+       
+               xprintf(tab, "<swpused>%lu</swpused>",
+                       smc->tlskb - smc->frskb);
+       
+               xprintf(tab, "<swpused-percent>%.2f</swpused-percent>",
+                       smc->tlskb ?
+                       SP_VALUE(smc->frskb, smc->tlskb, smc->tlskb) :
+                       0.0);
+
+               xprintf(tab, "<swpcad>%lu</swpcad>",
+                       smc->caskb);
+
+               xprintf(tab--, "<swpcad-percent>%.2f</swpcad-percent>",
+                       (smc->tlskb - smc->frskb) ?
+                       SP_VALUE(0, smc->caskb, smc->tlskb - smc->frskb) :
+                       0.0);
+       }
+
+       if (DISPLAY_MEMORY(a->opt_flags)) {
+
+               xprintf(++tab, "<frmpg>%.2f</frmpg>",
+                       S_VALUE((double) KB_TO_PG(smp->frmkb),
+                               (double) KB_TO_PG(smc->frmkb), itv));
+       
+               xprintf(tab, "<bufpg>%.2f</bufpg>",
+                       S_VALUE((double) KB_TO_PG(smp->bufkb),
+                               (double) KB_TO_PG(smc->bufkb), itv));
+       
+               xprintf(tab--, "<campg>%.2f</campg>",
+                       S_VALUE((double) KB_TO_PG(smp->camkb),
+                               (double) KB_TO_PG(smc->camkb), itv));
+       }
+
+       xprintf(tab, "</memory>");
+}
+
+/*
+ ***************************************************************************
+ * Display kernel tables statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_ktables_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       struct stats_ktables
+               *skc = (struct stats_ktables *) a->buf[curr];
+       
+       xprintf(tab, "<kernel "
+               "dentunusd=\"%u\" "
+               "file-nr=\"%u\" "
+               "inode-nr=\"%u\" "
+               "pty-nr=\"%u\"/>",
+               skc->dentry_stat,
+               skc->file_used,
+               skc->inode_used,
+               skc->pty_nr);
+}
+
+/*
+ ***************************************************************************
+ * Display queue and load statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_queue_stats(struct activity *a, int curr, int tab,
+                                     unsigned long long itv)
+{
+       struct stats_queue
+               *sqc = (struct stats_queue *) a->buf[curr];
+       
+       xprintf(tab, "<queue "
+               "runq-sz=\"%lu\" "
+               "plist-sz=\"%u\" "
+               "ldavg-1=\"%.2f\" "
+               "ldavg-5=\"%.2f\" "
+               "ldavg-15=\"%.2f\"/>",
+               sqc->nr_running,
+               sqc->nr_threads,
+               (double) sqc->load_avg_1 / 100,
+               (double) sqc->load_avg_5 / 100,
+               (double) sqc->load_avg_15 / 100);
+}
+
+/*
+ ***************************************************************************
+ * Display serial lines statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_serial_stats(struct activity *a, int curr, int tab,
+                                      unsigned long long itv)
+{
+       int i;
+       struct stats_serial *ssc, *ssp;
+
+       xprintf(tab, "<serial per=\"second\">");
+       tab++;
+
+       for (i = 0; i < a->nr; i++) {
+
+               ssc = (struct stats_serial *) ((char *) a->buf[curr]  + i * a->msize);
+               ssp = (struct stats_serial *) ((char *) a->buf[!curr] + i * a->msize);
+
+               if (ssc->line == 0)
+                       continue;
+
+               if (ssc->line == ssp->line) {
+
+                       xprintf(tab, "<tty line=\"%d\" "
+                               "rcvin=\"%.2f\" "
+                               "xmtin=\"%.2f\" "
+                               "framerr=\"%.2f\" "
+                               "prtyerr=\"%.2f\" "
+                               "brk=\"%.2f\" "
+                               "ovrun=\"%.2f\"/>",
+                               ssc->line - 1,
+                               S_VALUE(ssp->rx,      ssc->rx,      itv),
+                               S_VALUE(ssp->tx,      ssc->tx,      itv),
+                               S_VALUE(ssp->frame,   ssc->frame,   itv),
+                               S_VALUE(ssp->parity,  ssc->parity,  itv),
+                               S_VALUE(ssp->brk,     ssc->brk,     itv),
+                               S_VALUE(ssp->overrun, ssc->overrun, itv));
+               }
+       }
+
+       xprintf(--tab, "</serial>");
+}
+
+/*
+ ***************************************************************************
+ * Display disks statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_disk_stats(struct activity *a, int curr, int tab,
+                                    unsigned long long itv)
+{
+       int i, j;
+       struct stats_disk *sdc, *sdp;
+       struct ext_disk_stats xds;
+       char *dev_name;
+
+       xprintf(tab, "<disk per=\"second\">");
+       tab++;
+
+       for (i = 0; i < a->nr; i++) {
+
+               sdc = (struct stats_disk *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!(sdc->major + sdc->minor))
+                       continue;
+
+               j = check_disk_reg(a, curr, !curr, i);
+               sdp = (struct stats_disk *) ((char *) a->buf[!curr] + j * a->msize);
+
+               /* Compute extended statistics values */
+               compute_ext_disk_stats(sdc, sdp, itv, &xds);
+               
+               dev_name = NULL;
+
+               if ((USE_PRETTY_OPTION(flags)) && (sdc->major == DEVMAP_MAJOR)) {
+                       dev_name = transform_devmapname(sdc->major, sdc->minor);
+               }
+
+               if (!dev_name) {
+                       dev_name = get_devname(sdc->major, sdc->minor,
+                                              USE_PRETTY_OPTION(flags));
+               }
+
+               xprintf(tab, "<disk-device dev=\"%s\" "
+                       "tps=\"%.2f\" "
+                       "rd_sec=\"%.2f\" "
+                       "wr_sec=\"%.2f\" "
+                       "avgrq-sz=\"%.2f\" "
+                       "avgqu-sz=\"%.2f\" "
+                       "await=\"%.2f\" "
+                       "svctm=\"%.2f\" "
+                       "util-percent=\"%.2f\"/>",
+                       /* Confusion possible here between index and minor numbers */
+                       dev_name,
+                       S_VALUE(sdp->nr_ios, sdc->nr_ios, itv),
+                       ll_s_value(sdp->rd_sect, sdc->rd_sect, itv),
+                       ll_s_value(sdp->wr_sect, sdc->wr_sect, itv),
+                       /* See iostat for explanations */
+                       xds.arqsz,
+                       S_VALUE(sdp->rq_ticks, sdc->rq_ticks, itv) / 1000.0,
+                       xds.await,
+                       xds.svctm,
+                       xds.util / 10.0);
+       }
+
+       xprintf(--tab, "</disk>");
+}
+
+/*
+ ***************************************************************************
+ * Display network interfaces statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_dev_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       int i, j;
+       struct stats_net_dev *sndc, *sndp;
+
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       for (i = 0; i < a->nr; i++) {
+
+               sndc = (struct stats_net_dev *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!strcmp(sndc->interface, ""))
+                       continue;
+               
+               j = check_net_dev_reg(a, curr, !curr, i);
+               sndp = (struct stats_net_dev *) ((char *) a->buf[!curr] + j * a->msize);
+
+               xprintf(tab, "<net-dev iface=\"%s\" "
+                       "rxpck=\"%.2f\" "
+                       "txpck=\"%.2f\" "
+                       "rxkB=\"%.2f\" "
+                       "txkB=\"%.2f\" "
+                       "rxcmp=\"%.2f\" "
+                       "txcmp=\"%.2f\" "
+                       "rxmcst=\"%.2f\"/>",
+                       sndc->interface,
+                       S_VALUE(sndp->rx_packets,    sndc->rx_packets,    itv),
+                       S_VALUE(sndp->tx_packets,    sndc->tx_packets,    itv),
+                       S_VALUE(sndp->rx_bytes,      sndc->rx_bytes,      itv) / 1024,
+                       S_VALUE(sndp->tx_bytes,      sndc->tx_bytes,      itv) / 1024,
+                       S_VALUE(sndp->rx_compressed, sndc->rx_compressed, itv),
+                       S_VALUE(sndp->tx_compressed, sndc->tx_compressed, itv),
+                       S_VALUE(sndp->multicast,     sndc->multicast,     itv));
+       }
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display network interfaces error statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_edev_stats(struct activity *a, int curr, int tab,
+                                        unsigned long long itv)
+{
+       int i, j;
+       struct stats_net_edev *snedc, *snedp;
+
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       for (i = 0; i < a->nr; i++) {
+
+               snedc = (struct stats_net_edev *) ((char *) a->buf[curr] + i * a->msize);
+
+               if (!strcmp(snedc->interface, ""))
+                       continue;
+               
+               j = check_net_edev_reg(a, curr, !curr, i);
+               snedp = (struct stats_net_edev *) ((char *) a->buf[!curr] + j * a->msize);
+
+               xprintf(tab, "<net-edev iface=\"%s\" "
+                       "rxerr=\"%.2f\" "
+                       "txerr=\"%.2f\" "
+                       "coll=\"%.2f\" "
+                       "rxdrop=\"%.2f\" "
+                       "txdrop=\"%.2f\" "
+                       "txcarr=\"%.2f\" "
+                       "rxfram=\"%.2f\" "
+                       "rxfifo=\"%.2f\" "
+                       "txfifo=\"%.2f\"/>",
+                       snedc->interface,
+                       S_VALUE(snedp->rx_errors,         snedc->rx_errors,         itv),
+                       S_VALUE(snedp->tx_errors,         snedc->tx_errors,         itv),
+                       S_VALUE(snedp->collisions,        snedc->collisions,        itv),
+                       S_VALUE(snedp->rx_dropped,        snedc->rx_dropped,        itv),
+                       S_VALUE(snedp->tx_dropped,        snedc->tx_dropped,        itv),
+                       S_VALUE(snedp->tx_carrier_errors, snedc->tx_carrier_errors, itv),
+                       S_VALUE(snedp->rx_frame_errors,   snedc->rx_frame_errors,   itv),
+                       S_VALUE(snedp->rx_fifo_errors,    snedc->rx_fifo_errors,    itv),
+                       S_VALUE(snedp->tx_fifo_errors,    snedc->tx_fifo_errors,    itv));
+       }
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display NFS client statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_nfs_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       struct stats_net_nfs
+               *snnc = (struct stats_net_nfs *) a->buf[curr],
+               *snnp = (struct stats_net_nfs *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-nfs "
+               "call=\"%.2f\" "
+               "retrans=\"%.2f\" "
+               "read=\"%.2f\" "
+               "write=\"%.2f\" "
+               "access=\"%.2f\" "
+               "getatt=\"%.2f\"/>",
+               S_VALUE(snnp->nfs_rpccnt,     snnc->nfs_rpccnt,     itv),
+               S_VALUE(snnp->nfs_rpcretrans, snnc->nfs_rpcretrans, itv),
+               S_VALUE(snnp->nfs_readcnt,    snnc->nfs_readcnt,    itv),
+               S_VALUE(snnp->nfs_writecnt,   snnc->nfs_writecnt,   itv),
+               S_VALUE(snnp->nfs_accesscnt,  snnc->nfs_accesscnt,  itv),
+               S_VALUE(snnp->nfs_getattcnt,  snnc->nfs_getattcnt,  itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display NFS server statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_nfsd_stats(struct activity *a, int curr, int tab,
+                                                unsigned long long itv)
+{
+       struct stats_net_nfsd
+               *snndc = (struct stats_net_nfsd *) a->buf[curr],
+               *snndp = (struct stats_net_nfsd *) a->buf[!curr];
+
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-nfsd "
+               "scall=\"%.2f\" "
+               "badcall=\"%.2f\" "
+               "packet=\"%.2f\" "
+               "udp=\"%.2f\" "
+               "tcp=\"%.2f\" "
+               "hit=\"%.2f\" "
+               "miss=\"%.2f\" "
+               "sread=\"%.2f\" "
+               "swrite=\"%.2f\" "
+               "saccess=\"%.2f\" "
+               "sgetatt=\"%.2f\"/>",
+               S_VALUE(snndp->nfsd_rpccnt,    snndc->nfsd_rpccnt,    itv),
+               S_VALUE(snndp->nfsd_rpcbad,    snndc->nfsd_rpcbad,    itv),
+               S_VALUE(snndp->nfsd_netcnt,    snndc->nfsd_netcnt,    itv),
+               S_VALUE(snndp->nfsd_netudpcnt, snndc->nfsd_netudpcnt, itv),
+               S_VALUE(snndp->nfsd_nettcpcnt, snndc->nfsd_nettcpcnt, itv),
+               S_VALUE(snndp->nfsd_rchits,    snndc->nfsd_rchits,    itv),
+               S_VALUE(snndp->nfsd_rcmisses,  snndc->nfsd_rcmisses,  itv),
+               S_VALUE(snndp->nfsd_readcnt,   snndc->nfsd_readcnt,   itv),
+               S_VALUE(snndp->nfsd_writecnt,  snndc->nfsd_writecnt,  itv),
+               S_VALUE(snndp->nfsd_accesscnt, snndc->nfsd_accesscnt, itv),
+               S_VALUE(snndp->nfsd_getattcnt, snndc->nfsd_getattcnt, itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display network socket statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_sock_stats(struct activity *a, int curr, int tab,
+                                                unsigned long long itv)
+{
+       struct stats_net_sock
+               *snsc = (struct stats_net_sock *) a->buf[curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-sock "
+               "totsck=\"%u\" "
+               "tcpsck=\"%u\" "
+               "udpsck=\"%u\" "
+               "rawsck=\"%u\" "
+               "ip-frag=\"%u\" "
+               "tcp-tw=\"%u\"/>",
+               snsc->sock_inuse,
+               snsc->tcp_inuse,
+               snsc->udp_inuse,
+                       snsc->raw_inuse,
+               snsc->frag_inuse,
+               snsc->tcp_tw);
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display IP network statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_ip_stats(struct activity *a, int curr, int tab,
+                                      unsigned long long itv)
+{
+       struct stats_net_ip
+               *snic = (struct stats_net_ip *) a->buf[curr],
+               *snip = (struct stats_net_ip *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-ip "
+               "irec=\"%.2f\" "
+               "fwddgm=\"%.2f\" "
+               "idel=\"%.2f\" "
+               "orq=\"%.2f\" "
+               "asmrq=\"%.2f\" "
+               "asmok=\"%.2f\" "
+               "fragok=\"%.2f\" "
+               "fragcrt=\"%.2f\"/>",
+               S_VALUE(snip->InReceives,    snic->InReceives,    itv),
+               S_VALUE(snip->ForwDatagrams, snic->ForwDatagrams, itv),
+               S_VALUE(snip->InDelivers,    snic->InDelivers,    itv),
+               S_VALUE(snip->OutRequests,   snic->OutRequests,   itv),
+               S_VALUE(snip->ReasmReqds,    snic->ReasmReqds,    itv),
+               S_VALUE(snip->ReasmOKs,      snic->ReasmOKs,      itv),
+               S_VALUE(snip->FragOKs,       snic->FragOKs,       itv),
+               S_VALUE(snip->FragCreates,   snic->FragCreates,   itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display IP network error statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_eip_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       struct stats_net_eip
+               *sneic = (struct stats_net_eip *) a->buf[curr],
+               *sneip = (struct stats_net_eip *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-eip "
+               "ihdrerr=\"%.2f\" "
+               "iadrerr=\"%.2f\" "
+               "iukwnpr=\"%.2f\" "
+               "idisc=\"%.2f\" "
+               "odisc=\"%.2f\" "
+               "onort=\"%.2f\" "
+               "asmf=\"%.2f\" "
+               "fragf=\"%.2f\"/>",
+               S_VALUE(sneip->InHdrErrors,     sneic->InHdrErrors,     itv),
+               S_VALUE(sneip->InAddrErrors,    sneic->InAddrErrors,    itv),
+               S_VALUE(sneip->InUnknownProtos, sneic->InUnknownProtos, itv),
+               S_VALUE(sneip->InDiscards,      sneic->InDiscards,      itv),
+               S_VALUE(sneip->OutDiscards,     sneic->OutDiscards,     itv),
+               S_VALUE(sneip->OutNoRoutes,     sneic->OutNoRoutes,     itv),
+               S_VALUE(sneip->ReasmFails,      sneic->ReasmFails,      itv),
+               S_VALUE(sneip->FragFails,       sneic->FragFails,       itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display ICMP network statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_icmp_stats(struct activity *a, int curr, int tab,
+                                        unsigned long long itv)
+{
+       struct stats_net_icmp
+               *snic = (struct stats_net_icmp *) a->buf[curr],
+               *snip = (struct stats_net_icmp *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-icmp "
+               "imsg=\"%.2f\" "
+               "omsg=\"%.2f\" "
+               "iech=\"%.2f\" "
+               "iechr=\"%.2f\" "
+               "oech=\"%.2f\" "
+               "oechr=\"%.2f\" "
+               "itm=\"%.2f\" "
+               "itmr=\"%.2f\" "
+               "otm=\"%.2f\" "
+               "otmr=\"%.2f\" "
+               "iadrmk=\"%.2f\" "
+               "iadrmkr=\"%.2f\" "
+               "oadrmk=\"%.2f\" "
+               "oadrmkr=\"%.2f\"/>",
+               S_VALUE(snip->InMsgs,           snic->InMsgs,           itv),
+               S_VALUE(snip->OutMsgs,          snic->OutMsgs,          itv),
+               S_VALUE(snip->InEchos,          snic->InEchos,          itv),
+               S_VALUE(snip->InEchoReps,       snic->InEchoReps,       itv),
+               S_VALUE(snip->OutEchos,         snic->OutEchos,         itv),
+               S_VALUE(snip->OutEchoReps,      snic->OutEchoReps,      itv),
+               S_VALUE(snip->InTimestamps,     snic->InTimestamps,     itv),
+               S_VALUE(snip->InTimestampReps,  snic->InTimestampReps,  itv),
+               S_VALUE(snip->OutTimestamps,    snic->OutTimestamps,    itv),
+               S_VALUE(snip->OutTimestampReps, snic->OutTimestampReps, itv),
+               S_VALUE(snip->InAddrMasks,      snic->InAddrMasks,      itv),
+               S_VALUE(snip->InAddrMaskReps,   snic->InAddrMaskReps,   itv),
+               S_VALUE(snip->OutAddrMasks,     snic->OutAddrMasks,     itv),
+               S_VALUE(snip->OutAddrMaskReps,  snic->OutAddrMaskReps,  itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display ICMP error message statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_eicmp_stats(struct activity *a, int curr, int tab,
+                                         unsigned long long itv)
+{
+       struct stats_net_eicmp
+               *sneic = (struct stats_net_eicmp *) a->buf[curr],
+               *sneip = (struct stats_net_eicmp *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-eicmp "
+               "ierr=\"%.2f\" "
+               "oerr=\"%.2f\" "
+               "idstunr=\"%.2f\" "
+               "odstunr=\"%.2f\" "
+               "itmex=\"%.2f\" "
+               "otmex=\"%.2f\" "
+               "iparmpb=\"%.2f\" "
+               "oparmpb=\"%.2f\" "
+               "isrcq=\"%.2f\" "
+               "osrcq=\"%.2f\" "
+               "iredir=\"%.2f\" "
+               "oredir=\"%.2f\"/>",
+               S_VALUE(sneip->InErrors,        sneic->InErrors,        itv),
+               S_VALUE(sneip->OutErrors,       sneic->OutErrors,       itv),
+               S_VALUE(sneip->InDestUnreachs,  sneic->InDestUnreachs,  itv),
+               S_VALUE(sneip->OutDestUnreachs, sneic->OutDestUnreachs, itv),
+               S_VALUE(sneip->InTimeExcds,     sneic->InTimeExcds,     itv),
+               S_VALUE(sneip->OutTimeExcds,    sneic->OutTimeExcds,    itv),
+               S_VALUE(sneip->InParmProbs,     sneic->InParmProbs,     itv),
+               S_VALUE(sneip->OutParmProbs,    sneic->OutParmProbs,    itv),
+               S_VALUE(sneip->InSrcQuenchs,    sneic->InSrcQuenchs,    itv),
+               S_VALUE(sneip->OutSrcQuenchs,   sneic->OutSrcQuenchs,   itv),
+               S_VALUE(sneip->InRedirects,     sneic->InRedirects,     itv),
+               S_VALUE(sneip->OutRedirects,    sneic->OutRedirects,    itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display TCP network statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_tcp_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       struct stats_net_tcp
+               *sntc = (struct stats_net_tcp *) a->buf[curr],
+               *sntp = (struct stats_net_tcp *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-tcp "
+               "active=\"%.2f\" "
+               "passive=\"%.2f\" "
+               "iseg=\"%.2f\" "
+               "oseg=\"%.2f\"/>",
+               S_VALUE(sntp->ActiveOpens,  sntc->ActiveOpens,  itv),
+               S_VALUE(sntp->PassiveOpens, sntc->PassiveOpens, itv),
+               S_VALUE(sntp->InSegs,       sntc->InSegs,       itv),
+               S_VALUE(sntp->OutSegs,      sntc->OutSegs,      itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display TCP network error statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_etcp_stats(struct activity *a, int curr, int tab,
+                                        unsigned long long itv)
+{
+       struct stats_net_etcp
+               *snetc = (struct stats_net_etcp *) a->buf[curr],
+               *snetp = (struct stats_net_etcp *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-etcp "
+               "atmptf=\"%.2f\" "
+               "estres=\"%.2f\" "
+               "retrans=\"%.2f\" "
+               "isegerr=\"%.2f\" "
+               "orsts=\"%.2f\"/>",
+               S_VALUE(snetp->AttemptFails, snetc->AttemptFails,  itv),
+               S_VALUE(snetp->EstabResets,  snetc->EstabResets,  itv),
+               S_VALUE(snetp->RetransSegs,  snetc->RetransSegs,  itv),
+               S_VALUE(snetp->InErrs,       snetc->InErrs,  itv),
+               S_VALUE(snetp->OutRsts,      snetc->OutRsts,  itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display UDP network statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_udp_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       struct stats_net_udp
+               *snuc = (struct stats_net_udp *) a->buf[curr],
+               *snup = (struct stats_net_udp *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-udp "
+               "idgm=\"%.2f\" "
+               "odgm=\"%.2f\" "
+               "noport=\"%.2f\" "
+               "idgmerr=\"%.2f\"/>",
+               S_VALUE(snup->InDatagrams,  snuc->InDatagrams,  itv),
+               S_VALUE(snup->OutDatagrams, snuc->OutDatagrams, itv),
+               S_VALUE(snup->NoPorts,      snuc->NoPorts,      itv),
+               S_VALUE(snup->InErrors,     snuc->InErrors,     itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network socket statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_sock6_stats(struct activity *a, int curr, int tab,
+                                         unsigned long long itv)
+{
+       struct stats_net_sock6
+               *snsc = (struct stats_net_sock6 *) a->buf[curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-sock6 "
+               "tcp6sck=\"%u\" "
+               "udp6sck=\"%u\" "
+               "raw6sck=\"%u\" "
+               "ip6-frag=\"%u\"/>",
+               snsc->tcp6_inuse,
+               snsc->udp6_inuse,
+                       snsc->raw6_inuse,
+               snsc->frag6_inuse);
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_ip6_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       struct stats_net_ip6
+               *snic = (struct stats_net_ip6 *) a->buf[curr],
+               *snip = (struct stats_net_ip6 *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-ip6 "
+               "irec6=\"%.2f\" "
+               "fwddgm6=\"%.2f\" "
+               "idel6=\"%.2f\" "
+               "orq6=\"%.2f\" "
+               "asmrq6=\"%.2f\" "
+               "asmok6=\"%.2f\" "
+               "imcpck6=\"%.2f\" "
+               "omcpck6=\"%.2f\" "
+               "fragok6=\"%.2f\" "
+               "fragcr6=\"%.2f\"/>",
+               S_VALUE(snip->InReceives6,       snic->InReceives6,       itv),
+               S_VALUE(snip->OutForwDatagrams6, snic->OutForwDatagrams6, itv),
+               S_VALUE(snip->InDelivers6,       snic->InDelivers6,       itv),
+               S_VALUE(snip->OutRequests6,      snic->OutRequests6,      itv),
+               S_VALUE(snip->ReasmReqds6,       snic->ReasmReqds6,       itv),
+               S_VALUE(snip->ReasmOKs6,         snic->ReasmOKs6,         itv),
+               S_VALUE(snip->InMcastPkts6,      snic->InMcastPkts6,      itv),
+               S_VALUE(snip->OutMcastPkts6,     snic->OutMcastPkts6,     itv),
+               S_VALUE(snip->FragOKs6,          snic->FragOKs6,          itv),
+               S_VALUE(snip->FragCreates6,      snic->FragCreates6,      itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display IPv6 network error statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_eip6_stats(struct activity *a, int curr, int tab,
+                                        unsigned long long itv)
+{
+       struct stats_net_eip6
+               *sneic = (struct stats_net_eip6 *) a->buf[curr],
+               *sneip = (struct stats_net_eip6 *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-eip6 "
+               "ihdrer6=\"%.2f\" "
+               "iadrer6=\"%.2f\" "
+               "iukwnp6=\"%.2f\" "
+               "i2big6=\"%.2f\" "
+               "idisc6=\"%.2f\" "
+               "odisc6=\"%.2f\" "
+               "inort6=\"%.2f\" "
+               "onort6=\"%.2f\" "
+               "asmf6=\"%.2f\" "
+               "fragf6=\"%.2f\" "
+               "itrpck6=\"%.2f\"/>",
+               S_VALUE(sneip->InHdrErrors6,     sneic->InHdrErrors6,     itv),
+               S_VALUE(sneip->InAddrErrors6,    sneic->InAddrErrors6,    itv),
+               S_VALUE(sneip->InUnknownProtos6, sneic->InUnknownProtos6, itv),
+               S_VALUE(sneip->InTooBigErrors6,  sneic->InTooBigErrors6,  itv),
+               S_VALUE(sneip->InDiscards6,      sneic->InDiscards6,      itv),
+               S_VALUE(sneip->OutDiscards6,     sneic->OutDiscards6,     itv),
+               S_VALUE(sneip->InNoRoutes6,      sneic->InNoRoutes6,      itv),
+               S_VALUE(sneip->OutNoRoutes6,     sneic->OutNoRoutes6,     itv),
+               S_VALUE(sneip->ReasmFails6,      sneic->ReasmFails6,      itv),
+               S_VALUE(sneip->FragFails6,       sneic->FragFails6,       itv),
+               S_VALUE(sneip->InTruncatedPkts6, sneic->InTruncatedPkts6, itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display ICMPv6 network statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_icmp6_stats(struct activity *a, int curr, int tab,
+                                         unsigned long long itv)
+{
+       struct stats_net_icmp6
+               *snic = (struct stats_net_icmp6 *) a->buf[curr],
+               *snip = (struct stats_net_icmp6 *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-icmp6 "
+               "imsg6=\"%.2f\" "
+               "omsg6=\"%.2f\" "
+               "iech6=\"%.2f\" "
+               "iechr6=\"%.2f\" "
+               "oechr6=\"%.2f\" "
+               "igmbq6=\"%.2f\" "
+               "igmbr6=\"%.2f\" "
+               "ogmbr6=\"%.2f\" "
+               "igmbrd6=\"%.2f\" "
+               "ogmbrd6=\"%.2f\" "
+               "irtsol6=\"%.2f\" "
+               "ortsol6=\"%.2f\" "
+               "irtad6=\"%.2f\" "
+               "inbsol6=\"%.2f\" "
+               "onbsol6=\"%.2f\" "
+               "inbad6=\"%.2f\" "
+               "onbad6=\"%.2f\"/>",
+               S_VALUE(snip->InMsgs6,                    snic->InMsgs6,                    itv),
+               S_VALUE(snip->OutMsgs6,                   snic->OutMsgs6,                   itv),
+               S_VALUE(snip->InEchos6,                   snic->InEchos6,                   itv),
+               S_VALUE(snip->InEchoReplies6,             snic->InEchoReplies6,             itv),
+               S_VALUE(snip->OutEchoReplies6,            snic->OutEchoReplies6,            itv),
+               S_VALUE(snip->InGroupMembQueries6,        snic->InGroupMembQueries6,        itv),
+               S_VALUE(snip->InGroupMembResponses6,      snic->InGroupMembResponses6,      itv),
+               S_VALUE(snip->OutGroupMembResponses6,     snic->OutGroupMembResponses6,     itv),
+               S_VALUE(snip->InGroupMembReductions6,     snic->InGroupMembReductions6,     itv),
+               S_VALUE(snip->OutGroupMembReductions6,    snic->OutGroupMembReductions6,    itv),
+               S_VALUE(snip->InRouterSolicits6,          snic->InRouterSolicits6,          itv),
+               S_VALUE(snip->OutRouterSolicits6,         snic->OutRouterSolicits6,         itv),
+               S_VALUE(snip->InRouterAdvertisements6,    snic->InRouterAdvertisements6,    itv),
+               S_VALUE(snip->InNeighborSolicits6,        snic->InNeighborSolicits6,        itv),
+               S_VALUE(snip->OutNeighborSolicits6,       snic->OutNeighborSolicits6,       itv),
+               S_VALUE(snip->InNeighborAdvertisements6,  snic->InNeighborAdvertisements6,  itv),
+               S_VALUE(snip->OutNeighborAdvertisements6, snic->OutNeighborAdvertisements6, itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display ICMPv6 error message statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_eicmp6_stats(struct activity *a, int curr, int tab,
+                                          unsigned long long itv)
+{
+       struct stats_net_eicmp6
+               *sneic = (struct stats_net_eicmp6 *) a->buf[curr],
+               *sneip = (struct stats_net_eicmp6 *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-eicmp6 "
+               "ierr6=\"%.2f\" "
+               "idtunr6=\"%.2f\" "
+               "odtunr6=\"%.2f\" "
+               "itmex6=\"%.2f\" "
+               "otmex6=\"%.2f\" "
+               "iprmpb6=\"%.2f\" "
+               "oprmpb6=\"%.2f\" "
+               "iredir6=\"%.2f\" "
+               "oredir6=\"%.2f\" "
+               "ipck2b6=\"%.2f\" "
+               "opck2b6=\"%.2f\"/>",
+               S_VALUE(sneip->InErrors6,        sneic->InErrors6,        itv),
+               S_VALUE(sneip->InDestUnreachs6,  sneic->InDestUnreachs6,  itv),
+               S_VALUE(sneip->OutDestUnreachs6, sneic->OutDestUnreachs6, itv),
+               S_VALUE(sneip->InTimeExcds6,     sneic->InTimeExcds6,     itv),
+               S_VALUE(sneip->OutTimeExcds6,    sneic->OutTimeExcds6,    itv),
+               S_VALUE(sneip->InParmProblems6,  sneic->InParmProblems6,  itv),
+               S_VALUE(sneip->OutParmProblems6, sneic->OutParmProblems6, itv),
+               S_VALUE(sneip->InRedirects6,     sneic->InRedirects6,     itv),
+               S_VALUE(sneip->OutRedirects6,    sneic->OutRedirects6,    itv),
+               S_VALUE(sneip->InPktTooBigs6,    sneic->InPktTooBigs6,    itv),
+               S_VALUE(sneip->OutPktTooBigs6,   sneic->OutPktTooBigs6,   itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display UDPv6 network statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_net_udp6_stats(struct activity *a, int curr, int tab,
+                                        unsigned long long itv)
+{
+       struct stats_net_udp6
+               *snuc = (struct stats_net_udp6 *) a->buf[curr],
+               *snup = (struct stats_net_udp6 *) a->buf[!curr];
+       
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_network(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab, "<net-udp6 "
+               "idgm6=\"%.2f\" "
+               "odgm6=\"%.2f\" "
+               "noport6=\"%.2f\" "
+               "idgmer6=\"%.2f\"/>",
+               S_VALUE(snup->InDatagrams6,  snuc->InDatagrams6,  itv),
+               S_VALUE(snup->OutDatagrams6, snuc->OutDatagrams6, itv),
+               S_VALUE(snup->NoPorts6,      snuc->NoPorts6,      itv),
+               S_VALUE(snup->InErrors6,     snuc->InErrors6,     itv));
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_network(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display CPU frequency statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_pwr_cpufreq_stats(struct activity *a, int curr, int tab,
+                                           unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_cpufreq *spc;
+       char cpuno[8];
+
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_power_management(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab++, "<cpu-frequency unit=\"MHz\">");
+       
+       for (i = 0; (i < a->nr) && (i < a->bitmap->b_size + 1); i++) {
+               
+               spc = (struct stats_pwr_cpufreq *) ((char *) a->buf[curr]  + i * a->msize);
+       
+               /* Should current CPU (including CPU "all") be displayed? */
+               if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) {
+
+                       /* Yes: Display it */
+                       if (!i) {
+                               /* This is CPU "all" */
+                               strcpy(cpuno, "all");
+                       }
+                       else {
+                               sprintf(cpuno, "%d", i - 1);
+                       }
+                       
+                       xprintf(tab, "<cpu number=\"%s\" "
+                               "frequency=\"%.2f\"/>",
+                               cpuno,
+                               ((double) spc->cpufreq) / 100);
+               }
+       }
+       
+       xprintf(--tab, "</cpu-frequency>");
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_power_management(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display fan statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_pwr_fan_stats(struct activity *a, int curr, int tab,
+                                       unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_fan *spc;
+
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_power_management(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab++, "<fan-speed unit=\"rpm\">");
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_fan *) ((char *) a->buf[curr]  + i * a->msize);
+
+               xprintf(tab, "<fan number=\"%d\" rpm=\"%llu\" drpm=\"%llu\" device=\"%s\"/>",
+                       i + 1,
+                       (unsigned long long) spc->rpm,
+                       (unsigned long long) (spc->rpm - spc->rpm_min),
+                       spc->device);
+       }
+
+       xprintf(--tab, "</fan-speed>");
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_power_management(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display temperature statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_pwr_temp_stats(struct activity *a, int curr, int tab,
+                                           unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_temp *spc;
+
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_power_management(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab++, "<temperature unit=\"degree Celsius\">");
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_temp *) ((char *) a->buf[curr]  + i * a->msize);
+
+               xprintf(tab, "<temp number=\"%d\" degC=\"%.2f\" percent-temp=\"%.2f\" device=\"%s\"/>",
+                       i + 1,
+                       spc->temp,
+                       (spc->temp_max - spc->temp_min) ?
+                       (spc->temp - spc->temp_min) / (spc->temp_max - spc->temp_min) * 100 :
+                       0.0,
+                       spc->device);
+       }
+
+       xprintf(--tab, "</temperature>");
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_power_management(tab, CLOSE_XML_MARKUP);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display voltage inputs statistics in XML.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @tab                Indentation in XML output.
+ * @itv                Interval of time in jiffies.
+ ***************************************************************************
+ */
+__print_funct_t xml_print_pwr_in_stats(struct activity *a, int curr, int tab,
+                                      unsigned long long itv)
+{
+       int i;
+       struct stats_pwr_in *spc;
+
+       if (!IS_SELECTED(a->options) || (a->nr <= 0))
+               goto close_xml_markup;
+
+       xml_markup_power_management(tab, OPEN_XML_MARKUP);
+       tab++;
+
+       xprintf(tab++, "<voltage-input unit=\"V\">");
+
+       for (i = 0; i < a->nr; i++) {
+               spc = (struct stats_pwr_in *) ((char *) a->buf[curr]  + i * a->msize);
+
+               xprintf(tab, "<in number=\"%d\" inV=\"%.2f\" percent-in=\"%.2f\" device=\"%s\"/>",
+                       i,
+                       spc->in,
+                       (spc->in_max - spc->in_min) ?
+                       (spc->in - spc->in_min) / (spc->in_max - spc->in_min) * 100 :
+                       0.0,
+                       spc->device);
+       }
+
+       xprintf(--tab, "</voltage-input>");
+       tab--;
+
+close_xml_markup:
+       if (CLOSE_MARKUP(a->options)) {
+               xml_markup_power_management(tab, CLOSE_XML_MARKUP);
+       }
+}
diff --git a/prf_stats.h b/prf_stats.h
new file mode 100644 (file)
index 0000000..a24818f
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * pr_stats.h: Include file used to display system statistics
+ * (C) 1999-2010 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _PRF_STATS_H
+#define _PRF_STATS_H
+
+#include "common.h"
+
+/*
+ ***************************************************************************
+ * Definitions for functions used by sadf.
+ ***************************************************************************
+ */
+
+#define PT_NOFLAG  0x0000      /* Prevent undescribed '0' in render calls */
+#define PT_USEINT  0x0001      /* Use the integer final arg, not double */
+#define PT_NEWLIN  0x0002      /* Terminate the current output line */
+
+#define NOVAL      0           /* For placeholder zeros */
+#define DNOVAL     0.0         /* Wilma!  */
+
+/*
+ * Conses are used to type independent passing
+ * of variable optional data into our rendering routine.
+ */
+
+typedef enum e_tcons {iv, sv} tcons; /* Types of conses */
+
+typedef struct {
+       tcons t;                /* Type in {iv,sv} */
+       union {
+               unsigned long int i;
+               char *s;
+       } a, b;                 /* Value pair, either ints or char *s */
+} Cons;
+
+/*
+ ***************************************************************************
+ * Prototypes for functions used to display system statistics
+ ***************************************************************************
+ */
+
+/* Functions used to display statistics in the format selected by sadf */
+extern __print_funct_t render_pcsw_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_cpu_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_irq_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_swap_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_paging_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_io_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_memory_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_ktables_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_queue_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_serial_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_disk_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_dev_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_edev_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_nfs_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_nfsd_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_sock_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_ip_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_eip_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_icmp_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_eicmp_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_tcp_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_etcp_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_udp_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_sock6_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_ip6_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_eip6_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_icmp6_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_eicmp6_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_net_udp6_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_pwr_cpufreq_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_pwr_fan_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_pwr_temp_stats
+       (struct activity *, int, char *, int, unsigned long long);
+extern __print_funct_t render_pwr_in_stats
+       (struct activity *, int, char *, int, unsigned long long);
+
+/* Functions used to display statistics in XML */
+extern void xprintf
+       (int, const char *, ...);
+extern __print_funct_t xml_print_cpu_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_pcsw_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_irq_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_swap_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_paging_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_io_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_memory_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_ktables_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_queue_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_serial_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_disk_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_dev_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_edev_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_nfs_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_nfsd_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_sock_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_ip_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_eip_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_icmp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_eicmp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_tcp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_etcp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_udp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_sock6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_ip6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_eip6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_icmp6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_eicmp6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_net_udp6_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_pwr_cpufreq_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_pwr_fan_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_pwr_temp_stats
+       (struct activity *, int, int, unsigned long long);
+extern __print_funct_t xml_print_pwr_in_stats
+       (struct activity *, int, int, unsigned long long);
+
+#endif /* _PRF_STATS_H */
diff --git a/rd_stats.c b/rd_stats.c
new file mode 100644 (file)
index 0000000..f84c14d
--- /dev/null
@@ -0,0 +1,2237 @@
+/*
+ * rd_stats.c: Read system statistics
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "common.h"
+#include "rd_stats.h"
+#include "ioconf.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#ifdef HAVE_SENSORS
+#include "sensors/sensors.h"
+#endif
+
+/*
+ ***************************************************************************
+ * Read CPU statistics and machine uptime.
+ *
+ * IN:
+ * @st_cpu     Structure where stats will be saved.
+ * @nbr                Total number of CPU (including cpu "all").
+ *
+ * OUT:
+ * @st_cpu     Structure with statistics.
+ * @uptime     Machine uptime multiplied by the number of processors.
+ * @uptime0    Machine uptime. Filled only if previously set to zero.
+ ***************************************************************************
+ */
+void read_stat_cpu(struct stats_cpu *st_cpu, int nbr,
+                  unsigned long long *uptime, unsigned long long *uptime0)
+{
+       FILE *fp;
+       struct stats_cpu *st_cpu_i;
+       struct stats_cpu sc;
+       char line[8192];
+       int proc_nb;
+
+       if ((fp = fopen(STAT, "r")) == NULL) {
+               fprintf(stderr, _("Cannot open %s: %s\n"), STAT, strerror(errno));
+               exit(2);
+       }
+
+       while (fgets(line, 8192, fp) != NULL) {
+
+               if (!strncmp(line, "cpu ", 4)) {
+
+                       /*
+                        * All the fields don't necessarily exist,
+                        * depending on the kernel version used.
+                        */
+                       memset(st_cpu, 0, STATS_CPU_SIZE);
+
+                       /*
+                        * Read the number of jiffies spent in the different modes
+                        * (user, nice, etc.) among all proc. CPU usage is not reduced
+                        * to one processor to avoid rounding problems.
+                        */
+                       sscanf(line + 5, "%llu %llu %llu %llu %llu %llu %llu %llu %llu",
+                              &st_cpu->cpu_user,
+                              &st_cpu->cpu_nice,
+                              &st_cpu->cpu_sys,
+                              &st_cpu->cpu_idle,
+                              &st_cpu->cpu_iowait,
+                              &st_cpu->cpu_hardirq,
+                              &st_cpu->cpu_softirq,
+                              &st_cpu->cpu_steal,
+                              &st_cpu->cpu_guest);
+
+                       /*
+                        * Compute the uptime of the system in jiffies (1/100ths of a second
+                        * if HZ=100).
+                        * Machine uptime is multiplied by the number of processors here.
+                        *
+                        * NB: Don't add cpu_guest because cpu_user already includes it.
+                        */
+                       *uptime = st_cpu->cpu_user + st_cpu->cpu_nice    +
+                               st_cpu->cpu_sys    + st_cpu->cpu_idle    +
+                               st_cpu->cpu_iowait + st_cpu->cpu_hardirq +
+                               st_cpu->cpu_steal  + st_cpu->cpu_softirq;
+               }
+
+               else if (!strncmp(line, "cpu", 3)) {
+                       if (nbr > 1) {
+                               /* All the fields don't necessarily exist */
+                               memset(&sc, 0, STATS_CPU_SIZE);
+                               /*
+                                * Read the number of jiffies spent in the different modes
+                                * (user, nice, etc) for current proc.
+                                * This is done only on SMP machines.
+                                */
+                               sscanf(line + 3, "%d %llu %llu %llu %llu %llu %llu %llu %llu %llu",
+                                      &proc_nb,
+                                      &sc.cpu_user,
+                                      &sc.cpu_nice,
+                                      &sc.cpu_sys,
+                                      &sc.cpu_idle,
+                                      &sc.cpu_iowait,
+                                      &sc.cpu_hardirq,
+                                      &sc.cpu_softirq,
+                                      &sc.cpu_steal,
+                                      &sc.cpu_guest);
+
+                               if (proc_nb < (nbr - 1)) {
+                                       st_cpu_i = st_cpu + proc_nb + 1;
+                                       *st_cpu_i = sc;
+                               }
+                               /*
+                                * else additional CPUs have been dynamically registered
+                                * in /proc/stat.
+                                */
+
+                               if (!proc_nb && !*uptime0) {
+                                       /*
+                                        * Compute uptime reduced to one proc using proc#0.
+                                        * Done if /proc/uptime was unavailable.
+                                        *
+                                        * NB: Don't add cpu_guest because cpu_user already
+                                        * includes it.
+                                        */
+                                       *uptime0 = sc.cpu_user + sc.cpu_nice  +
+                                               sc.cpu_sys     + sc.cpu_idle  +
+                                               sc.cpu_iowait  + sc.cpu_steal +
+                                               sc.cpu_hardirq + sc.cpu_softirq;
+                               }
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read processes (tasks) creation and context switches statistics from
+ * /proc/stat
+ *
+ * IN:
+ * @st_pcsw    Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_pcsw    Structure with statistics.
+ ***************************************************************************
+ */
+void read_stat_pcsw(struct stats_pcsw *st_pcsw)
+{
+       FILE *fp;
+       char line[8192];
+
+       if ((fp = fopen(STAT, "r")) == NULL)
+               return;
+
+       while (fgets(line, 8192, fp) != NULL) {
+
+               if (!strncmp(line, "ctxt ", 5)) {
+                       /* Read number of context switches */
+                       sscanf(line + 5, "%llu", &st_pcsw->context_switch);
+               }
+
+               else if (!strncmp(line, "processes ", 10)) {
+                       /* Read number of processes created since system boot */
+                       sscanf(line + 10, "%lu", &st_pcsw->processes);
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read interrupts statistics from /proc/stat.
+ *
+ * IN:
+ * @st_irq     Structure where stats will be saved.
+ * @nbr                Number of interrupts to read, including the total number
+ *             of interrupts.
+ *
+ * OUT:
+ * @st_irq     Structure with statistics.
+ ***************************************************************************
+ */
+void read_stat_irq(struct stats_irq *st_irq, int nbr)
+{
+       FILE *fp;
+       struct stats_irq *st_irq_i;
+       char line[8192];
+       int i, pos;
+
+       if ((fp = fopen(STAT, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 8192, fp) != NULL) {
+
+               if (!strncmp(line, "intr ", 5)) {
+                       /* Read total number of interrupts received since system boot */
+                       sscanf(line + 5, "%llu", &st_irq->irq_nr);
+                       pos = strcspn(line + 5, " ") + 5;
+
+                       for (i = 1; i < nbr; i++) {
+                               st_irq_i = st_irq + i;
+                               sscanf(line + pos, " %llu", &st_irq_i->irq_nr);
+                               pos += strcspn(line + pos + 1, " ") + 1;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read queue and load statistics from /proc/loadavg.
+ *
+ * IN:
+ * @st_queue   Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_queue   Structure with statistics.
+ ***************************************************************************
+ */
+void read_loadavg(struct stats_queue *st_queue)
+{
+       FILE *fp;
+       int load_tmp[3];
+
+       if ((fp = fopen(LOADAVG, "r")) == NULL)
+               return;
+       
+       /* Read load averages and queue length */
+       fscanf(fp, "%d.%d %d.%d %d.%d %ld/%d %*d\n",
+              &load_tmp[0], &st_queue->load_avg_1,
+              &load_tmp[1], &st_queue->load_avg_5,
+              &load_tmp[2], &st_queue->load_avg_15,
+              &st_queue->nr_running,
+              &st_queue->nr_threads);
+
+       fclose(fp);
+
+       st_queue->load_avg_1  += load_tmp[0] * 100;
+       st_queue->load_avg_5  += load_tmp[1] * 100;
+       st_queue->load_avg_15 += load_tmp[2] * 100;
+
+       if (st_queue->nr_running) {
+               /* Do not take current process into account */
+               st_queue->nr_running--;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read memory statistics from /proc/meminfo.
+ *
+ * IN:
+ * @st_memory  Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_memory  Structure with statistics.
+ ***************************************************************************
+ */
+void read_meminfo(struct stats_memory *st_memory)
+{
+       FILE *fp;
+       char line[128];
+       
+       if ((fp = fopen(MEMINFO, "r")) == NULL)
+               return;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "MemTotal:", 9)) {
+                       /* Read the total amount of memory in kB */
+                       sscanf(line + 9, "%lu", &st_memory->tlmkb);
+               }
+               else if (!strncmp(line, "MemFree:", 8)) {
+                       /* Read the amount of free memory in kB */
+                       sscanf(line + 8, "%lu", &st_memory->frmkb);
+               }
+               else if (!strncmp(line, "Buffers:", 8)) {
+                       /* Read the amount of buffered memory in kB */
+                       sscanf(line + 8, "%lu", &st_memory->bufkb);
+               }
+               else if (!strncmp(line, "Cached:", 7)) {
+                       /* Read the amount of cached memory in kB */
+                       sscanf(line + 7, "%lu", &st_memory->camkb);
+               }
+               else if (!strncmp(line, "SwapCached:", 11)) {
+                       /* Read the amount of cached swap in kB */
+                       sscanf(line + 11, "%lu", &st_memory->caskb);
+               }
+               else if (!strncmp(line, "SwapTotal:", 10)) {
+                       /* Read the total amount of swap memory in kB */
+                       sscanf(line + 10, "%lu", &st_memory->tlskb);
+               }
+               else if (!strncmp(line, "SwapFree:", 9)) {
+                       /* Read the amount of free swap memory in kB */
+                       sscanf(line + 9, "%lu", &st_memory->frskb);
+               }
+               else if (!strncmp(line, "Committed_AS:", 13)) {
+                       /* Read the amount of commited memory in kB */
+                       sscanf(line + 13, "%lu", &st_memory->comkb);
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read swapping statistics from /proc/vmstat.
+ *
+ * IN:
+ * @st_swap    Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_swap    Structure with statistics.
+ ***************************************************************************
+ */
+void read_vmstat_swap(struct stats_swap *st_swap)
+{
+       FILE *fp;
+       char line[128];
+
+       if ((fp = fopen(VMSTAT, "r")) == NULL)
+               return;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "pswpin ", 7)) {
+                       /* Read number of swap pages brought in */
+                       sscanf(line + 7, "%lu", &st_swap->pswpin);
+               }
+               else if (!strncmp(line, "pswpout ", 8)) {
+                       /* Read number of swap pages brought out */
+                       sscanf(line + 8, "%lu", &st_swap->pswpout);
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read paging statistics from /proc/vmstat.
+ *
+ * IN:
+ * @st_paging  Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_paging  Structure with statistics.
+ ***************************************************************************
+ */
+void read_vmstat_paging(struct stats_paging *st_paging)
+{
+       FILE *fp;
+       char line[128];
+       unsigned long pgtmp;
+
+       if ((fp = fopen(VMSTAT, "r")) == NULL)
+               return;
+
+       st_paging->pgsteal = 0;
+       st_paging->pgscan_kswapd = st_paging->pgscan_direct = 0;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "pgpgin ", 7)) {
+                       /* Read number of pages the system paged in */
+                       sscanf(line + 7, "%lu", &st_paging->pgpgin);
+               }
+               else if (!strncmp(line, "pgpgout ", 8)) {
+                       /* Read number of pages the system paged out */
+                       sscanf(line + 8, "%lu", &st_paging->pgpgout);
+               }
+               else if (!strncmp(line, "pgfault ", 8)) {
+                       /* Read number of faults (major+minor) made by the system */
+                       sscanf(line + 8, "%lu", &st_paging->pgfault);
+               }
+               else if (!strncmp(line, "pgmajfault ", 11)) {
+                       /* Read number of faults (major only) made by the system */
+                       sscanf(line + 11, "%lu", &st_paging->pgmajfault);
+               }
+               else if (!strncmp(line, "pgfree ", 7)) {
+                       /* Read number of pages freed by the system */
+                       sscanf(line + 7, "%lu", &st_paging->pgfree);
+               }
+               else if (!strncmp(line, "pgsteal_", 8)) {
+                       /* Read number of pages stolen by the system */
+                       sscanf(strchr(line, ' '), "%lu", &pgtmp);
+                       st_paging->pgsteal += pgtmp;
+               }
+               else if (!strncmp(line, "pgscan_kswapd_", 14)) {
+                       /* Read number of pages scanned by the kswapd daemon */
+                       sscanf(strchr(line, ' '), "%lu", &pgtmp);
+                       st_paging->pgscan_kswapd += pgtmp;
+               }
+               else if (!strncmp(line, "pgscan_direct_", 14)) {
+                       /* Read number of pages scanned directly */
+                       sscanf(strchr(line, ' '), "%lu", &pgtmp);
+                       st_paging->pgscan_direct += pgtmp;
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read I/O and transfer rates statistics from /proc/diskstats.
+ *
+ * IN:
+ * @st_io      Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_io      Structure with statistics.
+ ***************************************************************************
+ */
+void read_diskstats_io(struct stats_io *st_io)
+{
+       FILE *fp;
+       char line[256];
+       char dev_name[MAX_NAME_LEN];
+       unsigned int major, minor;
+       unsigned long rd_ios, wr_ios;
+       unsigned long long rd_sec, wr_sec;
+
+       if ((fp = fopen(DISKSTATS, "r")) == NULL)
+               return;
+
+       while (fgets(line, 256, fp) != NULL) {
+
+               if (sscanf(line, "%u %u %s %lu %*u %llu %*u %lu %*u %llu",
+                          &major, &minor, dev_name,
+                          &rd_ios, &rd_sec, &wr_ios, &wr_sec) == 7) {
+                       
+                       if (is_device(dev_name)) {
+                               /*
+                                * OK: It's a device and not a partition.
+                                * Note: Structure should have been initialized first!
+                                */
+                               st_io->dk_drive      += rd_ios + wr_ios;
+                               st_io->dk_drive_rio  += rd_ios;
+                               st_io->dk_drive_rblk += (unsigned int) rd_sec;
+                               st_io->dk_drive_wio  += wr_ios;
+                               st_io->dk_drive_wblk += (unsigned int) wr_sec;
+                       }
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read block devices statistics from /proc/diskstats.
+ *
+ * IN:
+ * @st_disk    Structure where stats will be saved.
+ * @nbr                Maximum number of block devices.
+ * @read_part  True if disks *and* partitions should be read; False if only
+ *             disks are read.
+ *
+ * OUT:
+ * @st_disk    Structure with statistics.
+ ***************************************************************************
+ */
+void read_diskstats_disk(struct stats_disk *st_disk, int nbr, int read_part)
+{
+       FILE *fp;
+       char line[256];
+       char dev_name[MAX_NAME_LEN];
+       int dsk = 0;
+       struct stats_disk *st_disk_i;
+       unsigned int major, minor;
+       unsigned long rd_ios, wr_ios, rd_ticks, wr_ticks;
+       unsigned long tot_ticks, rq_ticks;
+       unsigned long long rd_sec, wr_sec;
+
+       if ((fp = fopen(DISKSTATS, "r")) == NULL)
+               return;
+
+       while ((fgets(line, 256, fp) != NULL) && (dsk < nbr)) {
+
+               if (sscanf(line, "%u %u %s %lu %*u %llu %lu %lu %*u %llu"
+                          " %lu %*u %lu %lu",
+                          &major, &minor, dev_name,
+                          &rd_ios, &rd_sec, &rd_ticks, &wr_ios, &wr_sec, &wr_ticks,
+                          &tot_ticks, &rq_ticks) == 11) {
+                       
+                       if (!rd_ios && !wr_ios)
+                               /* Unused device: ignore it */
+                               continue;
+                       if (read_part || is_device(dev_name)) {
+                               st_disk_i = st_disk + dsk++;
+                               st_disk_i->major     = major;
+                               st_disk_i->minor     = minor;
+                               st_disk_i->nr_ios    = rd_ios + wr_ios;
+                               st_disk_i->rd_sect   = rd_sec;
+                               st_disk_i->wr_sect   = wr_sec;
+                               st_disk_i->rd_ticks  = rd_ticks;
+                               st_disk_i->wr_ticks  = wr_ticks;
+                               st_disk_i->tot_ticks = tot_ticks;
+                               st_disk_i->rq_ticks  = rq_ticks;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read serial lines statistics from /proc/tty/driver/serial.
+ *
+ * IN:
+ * @st_serial  Structure where stats will be saved.
+ * @nbr                Maximum number of serial lines.
+ *
+ * OUT:
+ * @st_serial  Structure with statistics.
+ ***************************************************************************
+ */
+void read_tty_driver_serial(struct stats_serial *st_serial, int nbr)
+{
+       FILE *fp;
+       struct stats_serial *st_serial_i;
+       int sl = 0;
+       char line[256];
+       char *p;
+
+       if ((fp = fopen(SERIAL, "r")) == NULL)
+               return;
+
+       while ((fgets(line, 256, fp) != NULL) && (sl < nbr)) {
+
+               if ((p = strstr(line, "tx:")) != NULL) {
+                       st_serial_i = st_serial + sl;
+                       sscanf(line, "%u", &st_serial_i->line);
+                       /*
+                        * A value of 0 means an unused structure.
+                        * So increment it to make sure it is not null.
+                        */
+                       (st_serial_i->line)++;
+                       /*
+                        * Read the number of chars transmitted and received by
+                        * current serial line.
+                        */
+                       sscanf(p + 3, "%u", &st_serial_i->tx);
+                       if ((p = strstr(line, "rx:")) != NULL) {
+                               sscanf(p + 3, "%u", &st_serial_i->rx);
+                       }
+                       if ((p = strstr(line, "fe:")) != NULL) {
+                               sscanf(p + 3, "%u", &st_serial_i->frame);
+                       }
+                       if ((p = strstr(line, "pe:")) != NULL) {
+                               sscanf(p + 3, "%u", &st_serial_i->parity);
+                       }
+                       if ((p = strstr(line, "brk:")) != NULL) {
+                               sscanf(p + 4, "%u", &st_serial_i->brk);
+                       }
+                       if ((p = strstr(line, "oe:")) != NULL) {
+                               sscanf(p + 3, "%u", &st_serial_i->overrun);
+                       }
+                       
+                       sl++;
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read kernel tables statistics from various system files.
+ *
+ * IN:
+ * @st_ktables Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_ktables Structure with statistics.
+ ***************************************************************************
+ */
+void read_kernel_tables(struct stats_ktables *st_ktables)
+{
+       FILE *fp;
+       unsigned int parm;
+       
+       /* Open /proc/sys/fs/dentry-state file */
+       if ((fp = fopen(FDENTRY_STATE, "r")) != NULL) {
+               fscanf(fp, "%*d %u",
+                      &st_ktables->dentry_stat);
+               fclose(fp);
+       }
+
+       /* Open /proc/sys/fs/file-nr file */
+       if ((fp = fopen(FFILE_NR, "r")) != NULL) {
+               fscanf(fp, "%u %u",
+                      &st_ktables->file_used, &parm);
+               fclose(fp);
+               /*
+                * The number of used handles is the number of allocated ones
+                * minus the number of free ones.
+                */
+               st_ktables->file_used -= parm;
+       }
+
+       /* Open /proc/sys/fs/inode-state file */
+       if ((fp = fopen(FINODE_STATE, "r")) != NULL) {
+               fscanf(fp, "%u %u",
+                      &st_ktables->inode_used, &parm);
+               fclose(fp);
+               /*
+                * The number of inuse inodes is the number of allocated ones
+                * minus the number of free ones.
+                */
+               st_ktables->inode_used -= parm;
+       }
+
+       /* Open /proc/sys/kernel/pty/nr file */
+       if ((fp = fopen(PTY_NR, "r")) != NULL) {
+               fscanf(fp, "%u",
+                      &st_ktables->pty_nr);
+               fclose(fp);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read network interfaces statistics from /proc/net/dev.
+ *
+ * IN:
+ * @st_net_dev Structure where stats will be saved.
+ * @nbr                Maximum number of network interfaces.
+ *
+ * OUT:
+ * @st_net_dev Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_dev(struct stats_net_dev *st_net_dev, int nbr)
+{
+       FILE *fp;
+       struct stats_net_dev *st_net_dev_i;
+       char line[256];
+       char iface[MAX_IFACE_LEN];
+       int dev = 0;
+       int pos;
+
+       if ((fp = fopen(NET_DEV, "r")) == NULL)
+               return;
+       
+       while ((fgets(line, 256, fp) != NULL) && (dev < nbr)) {
+
+               pos = strcspn(line, ":");
+               if (pos < strlen(line)) {
+                       st_net_dev_i = st_net_dev + dev;
+                       strncpy(iface, line, MINIMUM(pos, MAX_IFACE_LEN - 1));
+                       iface[MINIMUM(pos, MAX_IFACE_LEN - 1)] = '\0';
+                       sscanf(iface, "%s", st_net_dev_i->interface); /* Skip heading spaces */
+                       sscanf(line + pos + 1, "%lu %lu %*u %*u %*u %*u %lu %lu %lu %lu "
+                              "%*u %*u %*u %*u %*u %lu",
+                              &st_net_dev_i->rx_bytes,
+                              &st_net_dev_i->rx_packets,
+                              &st_net_dev_i->rx_compressed,
+                              &st_net_dev_i->multicast,
+                              &st_net_dev_i->tx_bytes,
+                              &st_net_dev_i->tx_packets,
+                              &st_net_dev_i->tx_compressed);
+                       dev++;
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read network interfaces errors statistics from /proc/net/dev.
+ *
+ * IN:
+ * @st_net_edev        Structure where stats will be saved.
+ * @nbr                Maximum number of network interfaces.
+ *
+ * OUT:
+ * @st_net_edev        Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_edev(struct stats_net_edev *st_net_edev, int nbr)
+{
+       FILE *fp;
+       struct stats_net_edev *st_net_edev_i;
+       static char line[256];
+       char iface[MAX_IFACE_LEN];
+       int dev = 0;
+       int pos;
+
+       if ((fp = fopen(NET_DEV, "r")) == NULL)
+               return;
+
+       while ((fgets(line, 256, fp) != NULL) && (dev < nbr)) {
+
+               pos = strcspn(line, ":");
+               if (pos < strlen(line)) {
+                       st_net_edev_i = st_net_edev + dev;
+                       strncpy(iface, line, MINIMUM(pos, MAX_IFACE_LEN - 1));
+                       iface[MINIMUM(pos, MAX_IFACE_LEN - 1)] = '\0';
+                       sscanf(iface, "%s", st_net_edev_i->interface); /* Skip heading spaces */
+                       sscanf(line + pos + 1, "%*u %*u %lu %lu %lu %lu %*u %*u %*u %*u "
+                              "%lu %lu %lu %lu %lu",
+                              &st_net_edev_i->rx_errors,
+                              &st_net_edev_i->rx_dropped,
+                              &st_net_edev_i->rx_fifo_errors,
+                              &st_net_edev_i->rx_frame_errors,
+                              &st_net_edev_i->tx_errors,
+                              &st_net_edev_i->tx_dropped,
+                              &st_net_edev_i->tx_fifo_errors,
+                              &st_net_edev_i->collisions,
+                              &st_net_edev_i->tx_carrier_errors);
+                       dev++;
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read NFS client statistics from /proc/net/rpc/nfs.
+ *
+ * IN:
+ * @st_net_nfs Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_nfs Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_nfs(struct stats_net_nfs *st_net_nfs)
+{
+       FILE *fp;
+       char line[256];
+       unsigned int getattcnt = 0, accesscnt = 0, readcnt = 0, writecnt = 0;
+
+       if ((fp = fopen(NET_RPC_NFS, "r")) == NULL)
+               return;
+
+       memset(st_net_nfs, 0, STATS_NET_NFS_SIZE);
+       
+       while (fgets(line, 256, fp) != NULL) {
+
+               if (!strncmp(line, "rpc ", 4)) {
+                       sscanf(line + 4, "%u %u",
+                              &st_net_nfs->nfs_rpccnt, &st_net_nfs->nfs_rpcretrans);
+               }
+               else if (!strncmp(line, "proc3 ", 6)) {
+                       sscanf(line + 6, "%*u %*u %u %*u %*u %u %*u %u %u",
+                              &getattcnt, &accesscnt, &readcnt, &writecnt);
+                       
+                       st_net_nfs->nfs_getattcnt += getattcnt;
+                       st_net_nfs->nfs_accesscnt += accesscnt;
+                       st_net_nfs->nfs_readcnt   += readcnt;
+                       st_net_nfs->nfs_writecnt  += writecnt;
+               }
+               else if (!strncmp(line, "proc4 ", 6)) {
+                       sscanf(line + 6, "%*u %*u %u %u "
+                              "%*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u %u",
+                              &readcnt, &writecnt, &accesscnt, &getattcnt);
+                       
+                       st_net_nfs->nfs_getattcnt += getattcnt;
+                       st_net_nfs->nfs_accesscnt += accesscnt;
+                       st_net_nfs->nfs_readcnt   += readcnt;
+                       st_net_nfs->nfs_writecnt  += writecnt;
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read NFS server statistics from /proc/net/rpc/nfsd.
+ *
+ * IN:
+ * @st_net_nfsd        Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_nfsd        Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_nfsd(struct stats_net_nfsd *st_net_nfsd)
+{
+       FILE *fp;
+       char line[256];
+       unsigned int getattcnt = 0, accesscnt = 0, readcnt = 0, writecnt = 0;
+
+       if ((fp = fopen(NET_RPC_NFSD, "r")) == NULL)
+               return;
+       
+       memset(st_net_nfsd, 0, STATS_NET_NFSD_SIZE);
+
+       while (fgets(line, 256, fp) != NULL) {
+
+               if (!strncmp(line, "rc ", 3)) {
+                       sscanf(line + 3, "%u %u",
+                              &st_net_nfsd->nfsd_rchits, &st_net_nfsd->nfsd_rcmisses);
+               }
+               else if (!strncmp(line, "net ", 4)) {
+                       sscanf(line + 4, "%u %u %u",
+                              &st_net_nfsd->nfsd_netcnt, &st_net_nfsd->nfsd_netudpcnt,
+                              &st_net_nfsd->nfsd_nettcpcnt);
+               }
+               else if (!strncmp(line, "rpc ", 4)) {
+                       sscanf(line + 4, "%u %u",
+                              &st_net_nfsd->nfsd_rpccnt, &st_net_nfsd->nfsd_rpcbad);
+               }
+               else if (!strncmp(line, "proc3 ", 6)) {
+                       sscanf(line + 6, "%*u %*u %u %*u %*u %u %*u %u %u",
+                              &getattcnt, &accesscnt, &readcnt, &writecnt);
+
+                       st_net_nfsd->nfsd_getattcnt += getattcnt;
+                       st_net_nfsd->nfsd_accesscnt += accesscnt;
+                       st_net_nfsd->nfsd_readcnt   += readcnt;
+                       st_net_nfsd->nfsd_writecnt  += writecnt;
+                       
+               }
+               else if (!strncmp(line, "proc4ops ", 9)) {
+                       sscanf(line + 9, "%*u %*u %*u %*u %u "
+                              "%*u %*u %*u %*u %*u %u "
+                              "%*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u "
+                              "%*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %u",
+                              &accesscnt, &getattcnt, &readcnt, &writecnt);
+                       
+                       st_net_nfsd->nfsd_getattcnt += getattcnt;
+                       st_net_nfsd->nfsd_accesscnt += accesscnt;
+                       st_net_nfsd->nfsd_readcnt   += readcnt;
+                       st_net_nfsd->nfsd_writecnt  += writecnt;
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read network sockets statistics from /proc/net/sockstat.
+ *
+ * IN:
+ * @st_net_sock        Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_sock        Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_sock(struct stats_net_sock *st_net_sock)
+{
+       FILE *fp;
+       char line[96];
+       char *p;
+
+       if ((fp = fopen(NET_SOCKSTAT, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 96, fp) != NULL) {
+
+               if (!strncmp(line, "sockets:", 8)) {
+                       /* Sockets */
+                       sscanf(line + 14, "%u", &st_net_sock->sock_inuse);
+               }
+               else if (!strncmp(line, "TCP:", 4)) {
+                       /* TCP sockets */
+                       sscanf(line + 11, "%u", &st_net_sock->tcp_inuse);
+                       if ((p = strstr(line, "tw")) != NULL) {
+                               sscanf(p + 2, "%u", &st_net_sock->tcp_tw);
+                       }
+               }
+               else if (!strncmp(line, "UDP:", 4)) {
+                       /* UDP sockets */
+                       sscanf(line + 11, "%u", &st_net_sock->udp_inuse);
+               }
+               else if (!strncmp(line, "RAW:", 4)) {
+                       /* RAW sockets */
+                       sscanf(line + 11, "%u", &st_net_sock->raw_inuse);
+               }
+               else if (!strncmp(line, "FRAG:", 5)) {
+                       /* FRAGments */
+                       sscanf(line + 12, "%u", &st_net_sock->frag_inuse);
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read IP network traffic statistics from /proc/net/snmp.
+ *
+ * IN:
+ * @st_net_ip  Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_ip  Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_ip(struct stats_net_ip *st_net_ip)
+{
+       FILE *fp;
+       char line[1024];
+       int sw = FALSE;
+
+       if ((fp = fopen(NET_SNMP, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+
+               if (!strncmp(line, "Ip:", 3)) {
+                       if (sw) {
+                               sscanf(line + 3, "%*u %*u %lu %*u %*u %lu %*u %*u "
+                                      "%lu %lu %*u %*u %*u %lu %lu %*u %lu %*u %lu",
+                                      &st_net_ip->InReceives,
+                                      &st_net_ip->ForwDatagrams,
+                                      &st_net_ip->InDelivers,
+                                      &st_net_ip->OutRequests,
+                                      &st_net_ip->ReasmReqds,
+                                      &st_net_ip->ReasmOKs,
+                                      &st_net_ip->FragOKs,
+                                      &st_net_ip->FragCreates);
+                               
+                               break;
+                       }
+                       else {
+                               sw = TRUE;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read IP network error statistics from /proc/net/snmp.
+ *
+ * IN:
+ * @st_net_eip Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_eip Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_eip(struct stats_net_eip *st_net_eip)
+{
+       FILE *fp;
+       char line[1024];
+       int sw = FALSE;
+
+       if ((fp = fopen(NET_SNMP, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+
+               if (!strncmp(line, "Ip:", 3)) {
+                       if (sw) {
+                               sscanf(line + 3, "%*u %*u %*u %lu %lu %*u %lu %lu "
+                                      "%*u %*u %lu %lu %*u %*u %*u %lu %*u %lu",
+                                      &st_net_eip->InHdrErrors,
+                                      &st_net_eip->InAddrErrors,
+                                      &st_net_eip->InUnknownProtos,
+                                      &st_net_eip->InDiscards,
+                                      &st_net_eip->OutDiscards,
+                                      &st_net_eip->OutNoRoutes,
+                                      &st_net_eip->ReasmFails,
+                                      &st_net_eip->FragFails);
+                               
+                               break;
+                       }
+                       else {
+                               sw = TRUE;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read ICMP network traffic statistics from /proc/net/snmp.
+ *
+ * IN:
+ * @st_net_icmp        Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_icmp        Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_icmp(struct stats_net_icmp *st_net_icmp)
+{
+       FILE *fp;
+       char line[1024];
+       int sw = FALSE;
+
+       if ((fp = fopen(NET_SNMP, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+
+               if (!strncmp(line, "Icmp:", 5)) {
+                       if (sw) {
+                               sscanf(line + 5, "%lu %*u %*u %*u %*u %*u %*u "
+                                      "%lu %lu %lu %lu %lu %lu %lu %*u %*u %*u %*u "
+                                      "%*u %*u %lu %lu %lu %lu %lu %lu",
+                                      &st_net_icmp->InMsgs,
+                                      &st_net_icmp->InEchos,
+                                      &st_net_icmp->InEchoReps,
+                                      &st_net_icmp->InTimestamps,
+                                      &st_net_icmp->InTimestampReps,
+                                      &st_net_icmp->InAddrMasks,
+                                      &st_net_icmp->InAddrMaskReps,
+                                      &st_net_icmp->OutMsgs,
+                                      &st_net_icmp->OutEchos,
+                                      &st_net_icmp->OutEchoReps,
+                                      &st_net_icmp->OutTimestamps,
+                                      &st_net_icmp->OutTimestampReps,
+                                      &st_net_icmp->OutAddrMasks,
+                                      &st_net_icmp->OutAddrMaskReps);
+
+                               break;
+                       }
+                       else {
+                               sw = TRUE;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read ICMP network error statistics from /proc/net/snmp.
+ *
+ * IN:
+ * @st_net_eicmp       Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_eicmp       Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_eicmp(struct stats_net_eicmp *st_net_eicmp)
+{
+       FILE *fp;
+       char line[1024];
+       int sw = FALSE;
+
+       if ((fp = fopen(NET_SNMP, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+
+               if (!strncmp(line, "Icmp:", 5)) {
+                       if (sw) {
+                               sscanf(line + 5, "%*u %lu %lu %lu %lu %lu %lu %*u %*u "
+                                      "%*u %*u %*u %*u %*u %lu %lu %lu %lu %lu %lu",
+                                      &st_net_eicmp->InErrors,
+                                      &st_net_eicmp->InDestUnreachs,
+                                      &st_net_eicmp->InTimeExcds,
+                                      &st_net_eicmp->InParmProbs,
+                                      &st_net_eicmp->InSrcQuenchs,
+                                      &st_net_eicmp->InRedirects,
+                                      &st_net_eicmp->OutErrors,
+                                      &st_net_eicmp->OutDestUnreachs,
+                                      &st_net_eicmp->OutTimeExcds,
+                                      &st_net_eicmp->OutParmProbs,
+                                      &st_net_eicmp->OutSrcQuenchs,
+                                      &st_net_eicmp->OutRedirects);
+
+                               break;
+                       }
+                       else {
+                               sw = TRUE;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read TCP network traffic statistics from /proc/net/snmp.
+ *
+ * IN:
+ * @st_net_tcp Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_tcp Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_tcp(struct stats_net_tcp *st_net_tcp)
+{
+       FILE *fp;
+       char line[1024];
+       int sw = FALSE;
+
+       if ((fp = fopen(NET_SNMP, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+
+               if (!strncmp(line, "Tcp:", 4)) {
+                       if (sw) {
+                               sscanf(line + 4, "%*u %*u %*u %*d %lu %lu "
+                                      "%*u %*u %*u %lu %lu",
+                                      &st_net_tcp->ActiveOpens,
+                                      &st_net_tcp->PassiveOpens,
+                                      &st_net_tcp->InSegs,
+                                      &st_net_tcp->OutSegs);
+
+                               break;
+                       }
+                       else {
+                               sw = TRUE;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read TCP network error statistics from /proc/net/snmp.
+ *
+ * IN:
+ * @st_net_etcp        Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_etcp        Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_etcp(struct stats_net_etcp *st_net_etcp)
+{
+       FILE *fp;
+       char line[1024];
+       int sw = FALSE;
+
+       if ((fp = fopen(NET_SNMP, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+
+               if (!strncmp(line, "Tcp:", 4)) {
+                       if (sw) {
+                               sscanf(line + 4, "%*u %*u %*u %*d %*u %*u "
+                                      "%lu %lu %*u %*u %*u %lu %lu %lu",
+                                      &st_net_etcp->AttemptFails,
+                                      &st_net_etcp->EstabResets,
+                                      &st_net_etcp->RetransSegs,
+                                      &st_net_etcp->InErrs,
+                                      &st_net_etcp->OutRsts);
+
+                               break;
+                       }
+                       else {
+                               sw = TRUE;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read UDP network traffic statistics from /proc/net/snmp.
+ *
+ * IN:
+ * @st_net_udp Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_udp Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_udp(struct stats_net_udp *st_net_udp)
+{
+       FILE *fp;
+       char line[1024];
+       int sw = FALSE;
+
+       if ((fp = fopen(NET_SNMP, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+
+               if (!strncmp(line, "Udp:", 4)) {
+                       if (sw) {
+                               sscanf(line + 4, "%lu %lu %lu %lu",
+                                      &st_net_udp->InDatagrams,
+                                      &st_net_udp->NoPorts,
+                                      &st_net_udp->InErrors,
+                                      &st_net_udp->OutDatagrams);
+
+                               break;
+                       }
+                       else {
+                               sw = TRUE;
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read IPv6 network sockets statistics from /proc/net/sockstat6.
+ *
+ * IN:
+ * @st_net_sock6       Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_sock6       Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_sock6(struct stats_net_sock6 *st_net_sock6)
+{
+       FILE *fp;
+       char line[96];
+
+       if ((fp = fopen(NET_SOCKSTAT6, "r")) == NULL)
+               return;
+       
+       while (fgets(line, 96, fp) != NULL) {
+
+               if (!strncmp(line, "TCP6:", 5)) {
+                       /* TCPv6 sockets */
+                       sscanf(line + 12, "%u", &st_net_sock6->tcp6_inuse);
+               }
+               else if (!strncmp(line, "UDP6:", 5)) {
+                       /* UDPv6 sockets */
+                       sscanf(line + 12, "%u", &st_net_sock6->udp6_inuse);
+               }
+               else if (!strncmp(line, "RAW6:", 5)) {
+                       /* IPv6 RAW sockets */
+                       sscanf(line + 12, "%u", &st_net_sock6->raw6_inuse);
+               }
+               else if (!strncmp(line, "FRAG6:", 6)) {
+                       /* IPv6 FRAGments */
+                       sscanf(line + 13, "%u", &st_net_sock6->frag6_inuse);
+               }
+       }
+
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read IPv6 network traffic statistics from /proc/net/snmp6.
+ *
+ * IN:
+ * @st_net_ip6 Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_ip6 Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_ip6(struct stats_net_ip6 *st_net_ip6)
+{
+       FILE *fp;
+       char line[128];
+
+       if ((fp = fopen(NET_SNMP6, "r")) == NULL)
+               return;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "Ip6InReceives ", 14)) {
+                       sscanf(line + 14, "%lu", &st_net_ip6->InReceives6);
+               }
+               else if (!strncmp(line, "Ip6OutForwDatagrams ", 20)) {
+                       sscanf(line + 20, "%lu", &st_net_ip6->OutForwDatagrams6);
+               }
+               else if (!strncmp(line, "Ip6InDelivers ", 14)) {
+                       sscanf(line + 14, "%lu", &st_net_ip6->InDelivers6);
+               }
+               else if (!strncmp(line, "Ip6OutRequests ", 15)) {
+                       sscanf(line + 15, "%lu", &st_net_ip6->OutRequests6);
+               }
+               else if (!strncmp(line, "Ip6ReasmReqds ", 14)) {
+                       sscanf(line + 14, "%lu", &st_net_ip6->ReasmReqds6);
+               }
+               else if (!strncmp(line, "Ip6ReasmOKs ", 12)) {
+                       sscanf(line + 12, "%lu", &st_net_ip6->ReasmOKs6);
+               }
+               else if (!strncmp(line, "Ip6InMcastPkts ", 15)) {
+                       sscanf(line + 15, "%lu", &st_net_ip6->InMcastPkts6);
+               }
+               else if (!strncmp(line, "Ip6OutMcastPkts ", 16)) {
+                       sscanf(line + 16, "%lu", &st_net_ip6->OutMcastPkts6);
+               }
+               else if (!strncmp(line, "Ip6FragOKs ", 11)) {
+                       sscanf(line + 11, "%lu", &st_net_ip6->FragOKs6);
+               }
+               else if (!strncmp(line, "Ip6FragCreates ", 15)) {
+                       sscanf(line + 15, "%lu", &st_net_ip6->FragCreates6);
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read IPv6 network error statistics from /proc/net/snmp6.
+ *
+ * IN:
+ * @st_net_eip6        Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_eip6        Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_eip6(struct stats_net_eip6 *st_net_eip6)
+{
+       FILE *fp;
+       char line[128];
+
+       if ((fp = fopen(NET_SNMP6, "r")) == NULL)
+               return;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "Ip6InHdrErrors ", 15)) {
+                       sscanf(line + 15, "%lu", &st_net_eip6->InHdrErrors6);
+               }
+               else if (!strncmp(line, "Ip6InAddrErrors ", 16)) {
+                       sscanf(line + 16, "%lu", &st_net_eip6->InAddrErrors6);
+               }
+               else if (!strncmp(line, "Ip6InUnknownProtos ", 19)) {
+                       sscanf(line + 19, "%lu", &st_net_eip6->InUnknownProtos6);
+               }
+               else if (!strncmp(line, "Ip6InTooBigErrors ", 18)) {
+                       sscanf(line + 18, "%lu", &st_net_eip6->InTooBigErrors6);
+               }
+               else if (!strncmp(line, "Ip6InDiscards ", 14)) {
+                       sscanf(line + 14, "%lu", &st_net_eip6->InDiscards6);
+               }
+               else if (!strncmp(line, "Ip6OutDiscards ", 15)) {
+                       sscanf(line + 15, "%lu", &st_net_eip6->OutDiscards6);
+               }
+               else if (!strncmp(line, "Ip6InNoRoutes ", 14)) {
+                       sscanf(line + 14, "%lu", &st_net_eip6->InNoRoutes6);
+               }
+               else if (!strncmp(line, "Ip6OutNoRoutes ", 15)) {
+                       sscanf(line + 15, "%lu", &st_net_eip6->OutNoRoutes6);
+               }
+               else if (!strncmp(line, "Ip6ReasmFails ", 14)) {
+                       sscanf(line + 14, "%lu", &st_net_eip6->ReasmFails6);
+               }
+               else if (!strncmp(line, "Ip6FragFails ", 13)) {
+                       sscanf(line + 13, "%lu", &st_net_eip6->FragFails6);
+               }
+               else if (!strncmp(line, "Ip6InTruncatedPkts ", 19)) {
+                       sscanf(line + 19, "%lu", &st_net_eip6->InTruncatedPkts6);
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read ICMPv6 network traffic statistics from /proc/net/snmp6.
+ *
+ * IN:
+ * @st_net_icmp6       Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_icmp6       Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_icmp6(struct stats_net_icmp6 *st_net_icmp6)
+{
+       FILE *fp;
+       char line[128];
+
+       if ((fp = fopen(NET_SNMP6, "r")) == NULL)
+               return;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "Icmp6InMsgs ", 12)) {
+                       sscanf(line + 12, "%lu", &st_net_icmp6->InMsgs6);
+               }
+               else if (!strncmp(line, "Icmp6OutMsgs ", 13)) {
+                       sscanf(line + 13, "%lu", &st_net_icmp6->OutMsgs6);
+               }
+               else if (!strncmp(line, "Icmp6InEchos ", 13)) {
+                       sscanf(line + 13, "%lu", &st_net_icmp6->InEchos6);
+               }
+               else if (!strncmp(line, "Icmp6InEchoReplies ", 19)) {
+                       sscanf(line + 19, "%lu", &st_net_icmp6->InEchoReplies6);
+               }
+               else if (!strncmp(line, "Icmp6OutEchoReplies ", 20)) {
+                       sscanf(line + 20, "%lu", &st_net_icmp6->OutEchoReplies6);
+               }
+               else if (!strncmp(line, "Icmp6InGroupMembQueries ", 24)) {
+                       sscanf(line + 24, "%lu", &st_net_icmp6->InGroupMembQueries6);
+               }
+               else if (!strncmp(line, "Icmp6InGroupMembResponses ", 26)) {
+                       sscanf(line + 26, "%lu", &st_net_icmp6->InGroupMembResponses6);
+               }
+               else if (!strncmp(line, "Icmp6OutGroupMembResponses ", 27)) {
+                       sscanf(line + 27, "%lu", &st_net_icmp6->OutGroupMembResponses6);
+               }
+               else if (!strncmp(line, "Icmp6InGroupMembReductions ", 27)) {
+                       sscanf(line + 27, "%lu", &st_net_icmp6->InGroupMembReductions6);
+               }
+               else if (!strncmp(line, "Icmp6OutGroupMembReductions ", 28)) {
+                       sscanf(line + 28, "%lu", &st_net_icmp6->OutGroupMembReductions6);
+               }
+               else if (!strncmp(line, "Icmp6InRouterSolicits ", 22)) {
+                       sscanf(line + 22, "%lu", &st_net_icmp6->InRouterSolicits6);
+               }
+               else if (!strncmp(line, "Icmp6OutRouterSolicits ", 23)) {
+                       sscanf(line + 23, "%lu", &st_net_icmp6->OutRouterSolicits6);
+               }
+               else if (!strncmp(line, "Icmp6InRouterAdvertisements ", 28)) {
+                       sscanf(line + 28, "%lu", &st_net_icmp6->InRouterAdvertisements6);
+               }
+               else if (!strncmp(line, "Icmp6InNeighborSolicits ", 24)) {
+                       sscanf(line + 24, "%lu", &st_net_icmp6->InNeighborSolicits6);
+               }
+               else if (!strncmp(line, "Icmp6OutNeighborSolicits ", 25)) {
+                       sscanf(line + 25, "%lu", &st_net_icmp6->OutNeighborSolicits6);
+               }
+               else if (!strncmp(line, "Icmp6InNeighborAdvertisements ", 30)) {
+                       sscanf(line + 30, "%lu", &st_net_icmp6->InNeighborAdvertisements6);
+               }
+               else if (!strncmp(line, "Icmp6OutNeighborAdvertisements ", 31)) {
+                       sscanf(line + 31, "%lu", &st_net_icmp6->OutNeighborAdvertisements6);
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read ICMPv6 network error statistics from /proc/net/snmp6.
+ *
+ * IN:
+ * @st_net_eicmp6      Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_eicmp6      Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_eicmp6(struct stats_net_eicmp6 *st_net_eicmp6)
+{
+       FILE *fp;
+       char line[128];
+
+       if ((fp = fopen(NET_SNMP6, "r")) == NULL)
+               return;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "Icmp6InErrors ", 14)) {
+                       sscanf(line + 14, "%lu", &st_net_eicmp6->InErrors6);
+               }
+               else if (!strncmp(line, "Icmp6InDestUnreachs ", 20)) {
+                       sscanf(line + 20, "%lu", &st_net_eicmp6->InDestUnreachs6);
+               }
+               else if (!strncmp(line, "Icmp6OutDestUnreachs ", 21)) {
+                       sscanf(line + 21, "%lu", &st_net_eicmp6->OutDestUnreachs6);
+               }
+               else if (!strncmp(line, "Icmp6InTimeExcds ", 17)) {
+                       sscanf(line + 17, "%lu", &st_net_eicmp6->InTimeExcds6);
+               }
+               else if (!strncmp(line, "Icmp6OutTimeExcds ", 18)) {
+                       sscanf(line + 18, "%lu", &st_net_eicmp6->OutTimeExcds6);
+               }
+               else if (!strncmp(line, "Icmp6InParmProblems ", 20)) {
+                       sscanf(line + 20, "%lu", &st_net_eicmp6->InParmProblems6);
+               }
+               else if (!strncmp(line, "Icmp6OutParmProblems ", 21)) {
+                       sscanf(line + 21, "%lu", &st_net_eicmp6->OutParmProblems6);
+               }
+               else if (!strncmp(line, "Icmp6InRedirects ", 17)) {
+                       sscanf(line + 17, "%lu", &st_net_eicmp6->InRedirects6);
+               }
+               else if (!strncmp(line, "Icmp6OutRedirects ", 18)) {
+                       sscanf(line + 18, "%lu", &st_net_eicmp6->OutRedirects6);
+               }
+               else if (!strncmp(line, "Icmp6InPktTooBigs ", 18)) {
+                       sscanf(line + 18, "%lu", &st_net_eicmp6->InPktTooBigs6);
+               }
+               else if (!strncmp(line, "Icmp6OutPktTooBigs ", 19)) {
+                       sscanf(line + 19, "%lu", &st_net_eicmp6->OutPktTooBigs6);
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read UDPv6 network traffic statistics from /proc/net/snmp6.
+ *
+ * IN:
+ * @st_net_udp6        Structure where stats will be saved.
+ *
+ * OUT:
+ * @st_net_udp6        Structure with statistics.
+ ***************************************************************************
+ */
+void read_net_udp6(struct stats_net_udp6 *st_net_udp6)
+{
+       FILE *fp;
+       char line[128];
+
+       if ((fp = fopen(NET_SNMP6, "r")) == NULL)
+               return;
+
+       while (fgets(line, 128, fp) != NULL) {
+
+               if (!strncmp(line, "Udp6InDatagrams ", 16)) {
+                       sscanf(line + 16, "%lu", &st_net_udp6->InDatagrams6);
+               }
+               else if (!strncmp(line, "Udp6OutDatagrams ", 17)) {
+                       sscanf(line + 17, "%lu", &st_net_udp6->OutDatagrams6);
+               }
+               else if (!strncmp(line, "Udp6NoPorts ", 12)) {
+                       sscanf(line + 12, "%lu", &st_net_udp6->NoPorts6);
+               }
+               else if (!strncmp(line, "Udp6InErrors ", 13)) {
+                       sscanf(line + 13, "%lu", &st_net_udp6->InErrors6);
+               }
+       }
+       
+       fclose(fp);
+}
+
+/*
+ ***************************************************************************
+ * Read machine uptime, independently of the number of processors.
+ *
+ * OUT:
+ * @uptime     Uptime value in jiffies.
+ ***************************************************************************
+ */
+void read_uptime(unsigned long long *uptime)
+{
+       FILE *fp;
+       char line[128];
+       unsigned long up_sec, up_cent;
+
+       if ((fp = fopen(UPTIME, "r")) == NULL)
+               return;
+
+       if (fgets(line, 128, fp) == NULL)
+               return;
+
+       sscanf(line, "%lu.%lu", &up_sec, &up_cent);
+       *uptime = (unsigned long long) up_sec * HZ + (unsigned long long) up_cent * HZ / 100;
+
+       fclose(fp);
+
+}
+
+/*
+ ***************************************************************************
+ * Count number of interrupts that are in /proc/stat file.
+ *
+ * RETURNS:
+ * Number of interrupts, including total number of interrupts.
+ ***************************************************************************
+ */
+int get_irq_nr(void)
+{
+       FILE *fp;
+       char line[8192];
+       int in = 0;
+       int pos = 4;
+
+       if ((fp = fopen(STAT, "r")) == NULL)
+               return 0;
+       
+       while (fgets(line, 8192, fp) != NULL) {
+
+               if (!strncmp(line, "intr ", 5)) {
+                       
+                       while (pos < strlen(line)) {
+                               in++;
+                               pos += strcspn(line + pos + 1, " ") + 1;
+                       }
+               }
+       }
+
+       fclose(fp);
+       
+       return in;
+}
+
+/*
+ ***************************************************************************
+ * Find number of serial lines that support tx/rx accounting
+ * in /proc/tty/driver/serial file.
+ *
+ * RETURNS:
+ * Number of serial lines supporting tx/rx accouting.
+ ***************************************************************************
+ */
+int get_serial_nr(void)
+{
+       FILE *fp;
+       char line[256];
+       int sl = 0;
+
+       if ((fp = fopen(SERIAL, "r")) == NULL)
+               return 0;       /* No SERIAL file */
+
+       while (fgets(line, 256, fp) != NULL) {
+               /*
+                * tx/rx statistics are always present,
+                * except when serial line is unknown.
+                */
+               if (strstr(line, "tx:") != NULL) {
+                       sl++;
+               }
+       }
+
+       fclose(fp);
+
+       return sl;
+}
+
+/*
+ ***************************************************************************
+ * Find number of interfaces (network devices) that are in /proc/net/dev
+ * file.
+ *
+ * RETURNS:
+ * Number of network interfaces.
+ ***************************************************************************
+ */
+int get_iface_nr(void)
+{
+       FILE *fp;
+       char line[128];
+       int iface = 0;
+
+       if ((fp = fopen(NET_DEV, "r")) == NULL)
+               return 0;       /* No network device file */
+
+       while (fgets(line, 128, fp) != NULL) {
+               if (strchr(line, ':')) {
+                       iface++;
+               }
+       }
+
+       fclose(fp);
+
+       return iface;
+}
+
+/*
+ ***************************************************************************
+ * Find number of devices and partitions available in /proc/diskstats.
+ *
+ * IN:
+ * @count_part         Set to TRUE if devices _and_ partitions are to be
+ *                     counted.
+ * @only_used_dev      When counting devices, set to TRUE if only devices
+ *                     with non zero stats must be counted.
+ *
+ * RETURNS:
+ * Number of devices (and partitions).
+ ***************************************************************************
+ */
+int get_diskstats_dev_nr(int count_part, int only_used_dev)
+{
+       FILE *fp;
+       char line[256];
+       char dev_name[MAX_NAME_LEN];
+       int dev = 0, i;
+       unsigned long rd_ios, wr_ios;
+
+       if ((fp = fopen(DISKSTATS, "r")) == NULL)
+               /* File non-existent */
+               return 0;
+
+       /*
+        * Counting devices and partitions is simply a matter of counting
+        * the number of lines...
+        */
+       while (fgets(line, 256, fp) != NULL) {
+               if (!count_part) {
+                       i = sscanf(line, "%*d %*d %s %lu %*u %*u %*u %lu",
+                                  dev_name, &rd_ios, &wr_ios);
+                       if ((i == 2) || !is_device(dev_name))
+                               /* It was a partition and not a device */
+                               continue;
+                       if (only_used_dev && !rd_ios && !wr_ios)
+                               /* Unused device */
+                               continue;
+               }
+               dev++;
+       }
+
+       fclose(fp);
+
+       return dev;
+}
+
+/*
+ ***************************************************************************
+ * Get number of devices in /proc/diskstats.
+ *
+ * IN:
+ * @f  Non zero (true) if disks *and* partitions should be counted, and
+ *     zero (false) if only disks must be counted.
+ *
+ * RETURNS:
+ * Number of devices.
+ ***************************************************************************
+ */
+int get_disk_nr(unsigned int f)
+{
+       int disk_nr;
+       
+       /*
+        * Partitions are taken into account by sar -d only with
+        * kernels 2.6.25 and later.
+        */
+       disk_nr = get_diskstats_dev_nr(f, CNT_USED_DEV);
+
+       return disk_nr;
+}
+
+/*
+ ***************************************************************************
+ * Count number of processors in /sys.
+ *
+ * RETURNS:
+ * Number of processors (online and offline).
+ * A value of 0 means that /sys was not mounted.
+ * A value of N (!=0) means N processor(s) (0 .. N-1).
+ ***************************************************************************
+ */
+int get_sys_cpu_nr(void)
+{
+       DIR *dir;
+       struct dirent *drd;
+       struct stat buf;
+       char line[MAX_PF_NAME];
+       int proc_nr = 0;
+
+       /* Open relevant /sys directory */
+       if ((dir = opendir(SYSFS_DEVCPU)) == NULL)
+               return 0;
+
+       /* Get current file entry */
+       while ((drd = readdir(dir)) != NULL) {
+
+               if (!strncmp(drd->d_name, "cpu", 3) && isdigit(drd->d_name[3])) {
+                       snprintf(line, MAX_PF_NAME, "%s/%s", SYSFS_DEVCPU, drd->d_name);
+                       line[MAX_PF_NAME - 1] = '\0';
+                       if (stat(line, &buf) < 0)
+                               continue;
+                       if (S_ISDIR(buf.st_mode)) {
+                               proc_nr++;
+                       }
+               }
+       }
+
+       /* Close directory */
+       closedir(dir);
+
+       return proc_nr;
+}
+
+/*
+ ***************************************************************************
+ * Count number of processors in /proc/stat.
+ *
+ * RETURNS:
+ * Number of processors. The returned value is greater than or equal to the
+ * number of online processors.
+ * A value of 0 means one processor and non SMP kernel.
+ * A value of N (!=0) means N processor(s) (0 .. N-1) with SMP kernel.
+ ***************************************************************************
+ */
+int get_proc_cpu_nr(void)
+{
+       FILE *fp;
+       char line[16];
+       int num_proc, proc_nr = -1;
+
+       if ((fp = fopen(STAT, "r")) == NULL) {
+               fprintf(stderr, _("Cannot open %s: %s\n"), STAT, strerror(errno));
+               exit(1);
+       }
+
+       while (fgets(line, 16, fp) != NULL) {
+
+               if (strncmp(line, "cpu ", 4) && !strncmp(line, "cpu", 3)) {
+                       sscanf(line + 3, "%d", &num_proc);
+                       if (num_proc > proc_nr) {
+                               proc_nr = num_proc;
+                       }
+               }
+       }
+
+       fclose(fp);
+
+       return (proc_nr + 1);
+}
+
+/*
+ ***************************************************************************
+ * Count the number of processors on the machine.
+ * Try to use /sys for that, or /proc/stat if /sys doesn't exist.
+ *
+ * IN:
+ * @max_nr_cpus        Maximum number of proc that sysstat can handle.
+ *
+ * RETURNS:
+ * Number of processors.
+ * 0: one proc and non SMP kernel.
+ * 1: one proc and SMP kernel (NB: On SMP machines where all the CPUs but
+ *    one have been disabled, we get the total number of proc since we use
+ *    /sys to count them).
+ * 2: two proc...
+ ***************************************************************************
+ */
+int get_cpu_nr(unsigned int max_nr_cpus)
+{
+       int cpu_nr;
+
+       if ((cpu_nr = get_sys_cpu_nr()) == 0) {
+               /* /sys may be not mounted. Use /proc/stat instead */
+               cpu_nr = get_proc_cpu_nr();
+       }
+
+       if (cpu_nr > max_nr_cpus) {
+               fprintf(stderr, _("Cannot handle so many processors!\n"));
+               exit(1);
+       }
+
+       return cpu_nr;
+}
+
+/*
+ ***************************************************************************
+ * Find number of interrupts available per processor (use
+ * /proc/interrupts file or /proc/softirqs).
+ *
+ * IN:
+ * @file               /proc file to read (interrupts or softirqs).
+ * @max_nr_irqcpu       Maximum number of interrupts per processor that
+ *                      sadc can handle.
+ * @cpu_nr             Number of processors.
+ *
+ * RETURNS:
+ * Number of interrupts per processor + a pre-allocation constant.
+ ***************************************************************************
+ */
+int get_irqcpu_nr(char *file, int max_nr_irqcpu, int cpu_nr)
+{
+       FILE *fp;
+       char *line = NULL;
+       unsigned int irq = 0;
+       int p;
+
+       if ((fp = fopen(file, "r")) == NULL)
+               return 0;       /* No interrupts file */
+
+       SREALLOC(line, char, INTERRUPTS_LINE + 11 * cpu_nr);
+
+       while ((fgets(line, INTERRUPTS_LINE + 11 * cpu_nr , fp) != NULL) &&
+              (irq < max_nr_irqcpu)) {
+               p = strcspn(line, ":");
+               if ((p > 0) && (p < 16)) {
+                       irq++;
+               }
+       }
+
+       fclose(fp);
+       
+       if (line) {
+               free(line);
+       }
+
+       return irq;
+}
+
+/*
+ ***************************************************************************
+ * Read CPU frequency statistics.
+ *
+ * IN:
+ * @st_pwr_cpufreq     Structure where stats will be saved.
+ * @nbr                        Total number of CPU (including cpu "all").
+ *
+ * OUT:
+ * @st_pwr_cpufreq     Structure with statistics.
+ ***************************************************************************
+ */
+void read_cpuinfo(struct stats_pwr_cpufreq *st_pwr_cpufreq, int nbr)
+{
+       FILE *fp;
+       struct stats_pwr_cpufreq *st_pwr_cpufreq_i;
+       char line[1024];
+       int proc_nb = 0, nr = 0;
+       unsigned int ifreq, dfreq;
+       
+       if ((fp = fopen(CPUINFO, "r")) == NULL)
+               return;
+       
+       st_pwr_cpufreq->cpufreq = 0;
+       
+       while (fgets(line, 1024, fp) != NULL) {
+               
+               if (!strncmp(line, "processor\t", 10)) {
+                       sscanf(strchr(line, ':') + 1, "%d", &proc_nb);
+               }
+               
+               else if (!strncmp(line, "cpu MHz\t", 8)) {
+                       sscanf(strchr(line, ':') + 1, "%u.%u", &ifreq, &dfreq);
+                       
+                       if (proc_nb < (nbr - 1)) {
+                               /* Save current CPU frequency */
+                               st_pwr_cpufreq_i = st_pwr_cpufreq + proc_nb + 1;
+                               st_pwr_cpufreq_i->cpufreq = ifreq * 100 + dfreq / 10;
+                               
+                               /* Also save it to compute an average CPU frequency */
+                               st_pwr_cpufreq->cpufreq += st_pwr_cpufreq_i->cpufreq;
+                               nr++;
+                       }
+               }
+       }
+       
+       fclose(fp);
+       
+       if (nr) {
+               /* Compute average CPU frequency for this machine */
+               st_pwr_cpufreq->cpufreq /= nr;
+       }
+}
+
+#ifdef HAVE_SENSORS
+/*
+ ***************************************************************************
+ * Count the number of sensors of given type on the machine.
+ *
+ * IN:
+ * @type       Type of sensors.
+ *
+ * RETURNS:
+ * Number of sensors.
+ ***************************************************************************
+ */
+int get_sensors_nr(sensors_feature_type type) {
+       int count = 0;
+       const sensors_chip_name *chip;
+       const sensors_feature *feature;
+       int chip_nr = 0;
+       int i;
+
+       while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) {
+               i = 0;
+               while ((feature = sensors_get_features(chip, &i))) {
+                       if (feature->type == type) {
+                               count++;
+                       }
+               }
+       }
+
+       return count;
+}
+#endif /* HAVE_SENSORS */
+
+/*
+ ***************************************************************************
+ * Count the number of fans on the machine.
+ *
+ * RETURNS:
+ * Number of fans.
+ ***************************************************************************
+ */
+int get_fan_nr(void)
+{
+#ifdef HAVE_SENSORS
+       return get_sensors_nr(SENSORS_FEATURE_FAN);
+#else
+       return 0;
+#endif /* HAVE_SENSORS */
+}
+
+/*
+ ***************************************************************************
+ * Read fan statistics.
+ *
+ * IN:
+ * @st_pwr_fan Structure where stats will be saved.
+ * @nbr                Total number of fans.
+ *
+ * OUT:
+ * @st_pwr_fan Structure with statistics.
+ ***************************************************************************
+ */
+void read_fan(struct stats_pwr_fan *st_pwr_fan, int nbr)
+{
+#ifdef HAVE_SENSORS
+       int count = 0;
+       const sensors_chip_name *chip;
+       const sensors_feature *feature;
+       const sensors_subfeature *sub;
+       struct stats_pwr_fan *st_pwr_fan_i;
+       int chip_nr = 0;
+       int i, j;
+
+       memset(st_pwr_fan, 0, STATS_PWR_FAN_SIZE);
+       int err = 0;
+
+       while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) {
+               i = 0;
+               while ((feature = sensors_get_features(chip, &i))) {
+                       if ((feature->type == SENSORS_FEATURE_FAN) && (count < nbr)) {
+                               j = 0;
+                               st_pwr_fan_i = st_pwr_fan + count;
+                               sensors_snprintf_chip_name(st_pwr_fan_i->device, MAX_SENSORS_DEV_LEN, chip);
+                               
+                               while ((sub = sensors_get_all_subfeatures(chip, feature, &j))) {
+                                       if ((sub->type == SENSORS_SUBFEATURE_FAN_INPUT) &&
+                                           (sub->flags & SENSORS_MODE_R)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_fan_i->rpm))) {
+                                                       st_pwr_fan_i->rpm = 0;
+                                               }
+                                       }
+                                       else if ((sub->type == SENSORS_SUBFEATURE_FAN_MIN)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_fan_i->rpm_min))) {
+                                                       st_pwr_fan_i->rpm_min = 0;
+                                               }
+                                       }
+                               }
+                               count++;
+                       }
+               }
+       }
+#endif /* HAVE_SENSORS */
+}
+
+/*
+ ***************************************************************************
+ * Count the number of temperature sensors on the machine.
+ *
+ * RETURNS:
+ * Number of temperature sensors.
+ ***************************************************************************
+ */
+int get_temp_nr(void)
+{
+#ifdef HAVE_SENSORS
+       return get_sensors_nr(SENSORS_FEATURE_TEMP);
+#else
+       return 0;
+#endif /* HAVE_SENSORS */
+
+}
+
+/*
+ ***************************************************************************
+ * Read device temperature statistics.
+ *
+ * IN:
+ * @st_pwr_temp        Structure where stats will be saved.
+ * @nbr                Total number of fans.
+ *
+ * OUT:
+ * @st_pwr_temp        Structure with statistics.
+ ***************************************************************************
+ */
+void read_temp(struct stats_pwr_temp *st_pwr_temp, int nbr)
+{
+#ifdef HAVE_SENSORS
+       int count = 0;
+       const sensors_chip_name *chip;
+       const sensors_feature *feature;
+       const sensors_subfeature *sub;
+       struct stats_pwr_temp *st_pwr_temp_i;
+       int chip_nr = 0;
+       int i, j;
+
+       memset(st_pwr_temp, 0, STATS_PWR_TEMP_SIZE);
+       int err = 0;
+
+       while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) {
+               i = 0;
+               while ((feature = sensors_get_features(chip, &i))) {
+                       if ((feature->type == SENSORS_FEATURE_TEMP) && (count < nbr)) {
+                               j = 0;
+                               st_pwr_temp_i = st_pwr_temp + count;
+                               sensors_snprintf_chip_name(st_pwr_temp_i->device, MAX_SENSORS_DEV_LEN, chip);
+                               
+                               while ((sub = sensors_get_all_subfeatures(chip, feature, &j))) {
+                                       if ((sub->type == SENSORS_SUBFEATURE_TEMP_INPUT) &&
+                                               (sub->flags & SENSORS_MODE_R)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_temp_i->temp))) {
+                                                       st_pwr_temp_i->temp = 0;
+                                               }
+                                       }
+                                       else if ((sub->type == SENSORS_SUBFEATURE_TEMP_MIN)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_temp_i->temp_min))) {
+                                                       st_pwr_temp_i->temp_min = 0;
+                                               }
+                                       }
+                                       else if ((sub->type == SENSORS_SUBFEATURE_TEMP_MAX)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_temp_i->temp_max))) {
+                                                       st_pwr_temp_i->temp_max = 0;
+                                               }
+                                       }
+                               }
+                               count++;
+                       }
+               }
+       }
+#endif /* HAVE_SENSORS */
+}
+
+/*
+ ***************************************************************************
+ * Count the number of voltage inputs on the machine.
+ *
+ * RETURNS:
+ * Number of voltage inputs.
+ ***************************************************************************
+ */
+int get_in_nr(void)
+{
+#ifdef HAVE_SENSORS
+       return get_sensors_nr(SENSORS_FEATURE_IN);
+#else
+       return 0;
+#endif /* HAVE_SENSORS */
+
+}
+
+/*
+ ***************************************************************************
+ * Read voltage inputs statistics.
+ *
+ * IN:
+ * @st_pwr_in  Structure where stats will be saved.
+ * @nbr                Total number of voltage inputs.
+ *
+ * OUT:
+ * @st_pwr_in  Structure with statistics.
+ ***************************************************************************
+ */
+void read_in(struct stats_pwr_in *st_pwr_in, int nbr)
+{
+#ifdef HAVE_SENSORS
+       int count = 0;
+       const sensors_chip_name *chip;
+       const sensors_feature *feature;
+       const sensors_subfeature *sub;
+       struct stats_pwr_in *st_pwr_in_i;
+       int chip_nr = 0;
+       int i, j;
+
+       memset(st_pwr_in, 0, STATS_PWR_IN_SIZE);
+       int err = 0;
+
+       while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) {
+               i = 0;
+               while ((feature = sensors_get_features(chip, &i))) {
+                       if ((feature->type == SENSORS_FEATURE_IN) && (count < nbr)) {
+                               j = 0;
+                               st_pwr_in_i = st_pwr_in + count;
+                               sensors_snprintf_chip_name(st_pwr_in_i->device, MAX_SENSORS_DEV_LEN, chip);
+
+                               while ((sub = sensors_get_all_subfeatures(chip, feature, &j))) {
+                                       if ((sub->type == SENSORS_SUBFEATURE_IN_INPUT) &&
+                                               (sub->flags & SENSORS_MODE_R)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_in_i->in))) {
+                                                       st_pwr_in_i->in = 0;
+                                               }
+                                       }
+                                       else if ((sub->type == SENSORS_SUBFEATURE_IN_MIN)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_in_i->in_min))) {
+                                                       st_pwr_in_i->in_min = 0;
+                                               }
+                                       }
+                                       else if ((sub->type == SENSORS_SUBFEATURE_IN_MAX)) {
+                                               if ((err = sensors_get_value(chip, sub->number, &st_pwr_in_i->in_max))) {
+                                                       st_pwr_in_i->in_max = 0;
+                                               }
+                                       }
+                               }
+                               count++;
+                       }
+               }
+       }
+#endif /* HAVE_SENSORS */
+}
diff --git a/rd_stats.h b/rd_stats.h
new file mode 100644 (file)
index 0000000..bbb1124
--- /dev/null
@@ -0,0 +1,622 @@
+/*
+ * rd_stats.h: Include file used to read system statistics
+ * (C) 1999-2010 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _RD_STATS_H
+#define _RD_STATS_H
+
+#include "common.h"
+
+
+/*
+ ***************************************************************************
+ * Miscellaneous constants
+ ***************************************************************************
+ */
+
+/* Get IFNAMSIZ */
+#include <net/if.h>
+#ifndef IFNAMSIZ
+#define IFNAMSIZ       16
+#endif
+
+/* Maximum length of network interface name */
+#define MAX_IFACE_LEN  IFNAMSIZ
+
+#define CNT_DEV                0
+#define CNT_PART       1
+#define CNT_ALL_DEV    0
+#define CNT_USED_DEV   1
+
+#define READ_PROC_STAT         0
+#define READ_DISKSTATS         1
+#define READ_PPARTITIONS       2
+
+/*
+ ***************************************************************************
+ * System files containing statistics
+ ***************************************************************************
+ */
+
+/* Files */
+#define PROC           "/proc"
+#define SERIAL         "/proc/tty/driver/serial"
+#define FDENTRY_STATE  "/proc/sys/fs/dentry-state"
+#define FFILE_NR       "/proc/sys/fs/file-nr"
+#define FINODE_STATE   "/proc/sys/fs/inode-state"
+#define PTY_NR         "/proc/sys/kernel/pty/nr"
+#define NET_DEV                "/proc/net/dev"
+#define NET_SOCKSTAT   "/proc/net/sockstat"
+#define NET_SOCKSTAT6  "/proc/net/sockstat6"
+#define NET_RPC_NFS    "/proc/net/rpc/nfs"
+#define NET_RPC_NFSD   "/proc/net/rpc/nfsd"
+#define LOADAVG                "/proc/loadavg"
+#define VMSTAT         "/proc/vmstat"
+#define NET_SNMP       "/proc/net/snmp"
+#define NET_SNMP6      "/proc/net/snmp6"
+#define CPUINFO                "/proc/cpuinfo"
+
+
+/*
+ ***************************************************************************
+ * Definitions of structures for system statistics
+ ***************************************************************************
+ */
+
+/*
+ * Structure for CPU statistics.
+ * In activity buffer: First structure is for global CPU utilisation ("all").
+ * Following structures are for each individual CPU (0, 1, etc.)
+ */
+struct stats_cpu {
+       unsigned long long cpu_user     __attribute__ ((aligned (16)));
+       unsigned long long cpu_nice     __attribute__ ((aligned (16)));
+       unsigned long long cpu_sys      __attribute__ ((aligned (16)));
+       unsigned long long cpu_idle     __attribute__ ((aligned (16)));
+       unsigned long long cpu_iowait   __attribute__ ((aligned (16)));
+       unsigned long long cpu_steal    __attribute__ ((aligned (16)));
+       unsigned long long cpu_hardirq  __attribute__ ((aligned (16)));
+       unsigned long long cpu_softirq  __attribute__ ((aligned (16)));
+       unsigned long long cpu_guest    __attribute__ ((aligned (16)));
+};
+
+#define STATS_CPU_SIZE (sizeof(struct stats_cpu))
+
+/*
+ * Structure for task creation and context switch statistics.
+ * The attribute (aligned(16)) is necessary so that sizeof(structure) has
+ * the same value on 32 and 64-bit architectures.
+ */
+struct stats_pcsw {
+       unsigned long long context_switch       __attribute__ ((aligned (16)));
+       unsigned long processes                 __attribute__ ((aligned (16)));
+};
+
+#define STATS_PCSW_SIZE        (sizeof(struct stats_pcsw))
+
+/*
+ * Structure for interrupts statistics.
+ * In activity buffer: First structure is for total number of interrupts ("SUM").
+ * Following structures are for each individual interrupt (0, 1, etc.)
+ *
+ * NOTE: The total number of interrupts is saved as a %llu by the kernel,
+ * whereas individual interrupts are saved as %u.
+ */
+struct stats_irq {
+       unsigned long long irq_nr       __attribute__ ((aligned (16)));
+};
+
+#define STATS_IRQ_SIZE (sizeof(struct stats_irq))
+
+/* Structure for swapping statistics */
+struct stats_swap {
+       unsigned long pswpin    __attribute__ ((aligned (8)));
+       unsigned long pswpout   __attribute__ ((aligned (8)));
+};
+
+#define STATS_SWAP_SIZE        (sizeof(struct stats_swap))
+
+/* Structure for paging statistics */
+struct stats_paging {
+       unsigned long pgpgin            __attribute__ ((aligned (8)));
+       unsigned long pgpgout           __attribute__ ((aligned (8)));
+       unsigned long pgfault           __attribute__ ((aligned (8)));
+       unsigned long pgmajfault        __attribute__ ((aligned (8)));
+       unsigned long pgfree            __attribute__ ((aligned (8)));
+       unsigned long pgscan_kswapd     __attribute__ ((aligned (8)));
+       unsigned long pgscan_direct     __attribute__ ((aligned (8)));
+       unsigned long pgsteal           __attribute__ ((aligned (8)));
+};
+
+#define STATS_PAGING_SIZE      (sizeof(struct stats_paging))
+
+/* Structure for I/O and transfer rate statistics */
+struct stats_io {
+       unsigned int  dk_drive                  __attribute__ ((aligned (4)));
+       unsigned int  dk_drive_rio              __attribute__ ((packed));
+       unsigned int  dk_drive_wio              __attribute__ ((packed));
+       unsigned int  dk_drive_rblk             __attribute__ ((packed));
+       unsigned int  dk_drive_wblk             __attribute__ ((packed));
+};
+
+#define STATS_IO_SIZE  (sizeof(struct stats_io))
+
+/* Structure for memory and swap space utilization statistics */
+struct stats_memory {
+       unsigned long frmkb     __attribute__ ((aligned (8)));
+       unsigned long bufkb     __attribute__ ((aligned (8)));
+       unsigned long camkb     __attribute__ ((aligned (8)));
+       unsigned long tlmkb     __attribute__ ((aligned (8)));
+       unsigned long frskb     __attribute__ ((aligned (8)));
+       unsigned long tlskb     __attribute__ ((aligned (8)));
+       unsigned long caskb     __attribute__ ((aligned (8)));
+       unsigned long comkb     __attribute__ ((aligned (8)));
+};
+
+#define STATS_MEMORY_SIZE      (sizeof(struct stats_memory))
+
+/* Structure for kernel tables statistics */
+struct stats_ktables {
+       unsigned int  file_used         __attribute__ ((aligned (4)));
+       unsigned int  inode_used        __attribute__ ((packed));
+       unsigned int  dentry_stat       __attribute__ ((packed));
+       unsigned int  pty_nr            __attribute__ ((packed));
+};
+
+#define STATS_KTABLES_SIZE     (sizeof(struct stats_ktables))
+
+/* Structure for queue and load statistics */
+struct stats_queue {
+       unsigned long nr_running        __attribute__ ((aligned (8)));
+       unsigned int  load_avg_1        __attribute__ ((aligned (8)));
+       unsigned int  load_avg_5        __attribute__ ((packed));
+       unsigned int  load_avg_15       __attribute__ ((packed));
+       unsigned int  nr_threads        __attribute__ ((packed));
+};
+
+#define STATS_QUEUE_SIZE       (sizeof(struct stats_queue))
+
+/* Structure for serial statistics */
+struct stats_serial {
+       unsigned int rx         __attribute__ ((aligned (4)));
+       unsigned int tx         __attribute__ ((packed));
+       unsigned int frame      __attribute__ ((packed));
+       unsigned int parity     __attribute__ ((packed));
+       unsigned int brk        __attribute__ ((packed));
+       unsigned int overrun    __attribute__ ((packed));
+       /*
+        * A value of 0 means that the structure is unused.
+        * To avoid the confusion, the line number is saved as (line# + 1)
+        */
+       unsigned int line       __attribute__ ((packed));
+};
+
+#define STATS_SERIAL_SIZE      (sizeof(struct stats_serial))
+
+/* Structure for block devices statistics */
+struct stats_disk {
+       unsigned long long rd_sect      __attribute__ ((aligned (16)));
+       unsigned long long wr_sect      __attribute__ ((aligned (16)));
+       unsigned long rd_ticks          __attribute__ ((aligned (16)));
+       unsigned long wr_ticks          __attribute__ ((aligned (8)));
+       unsigned long tot_ticks         __attribute__ ((aligned (8)));
+       unsigned long rq_ticks          __attribute__ ((aligned (8)));
+       unsigned long nr_ios            __attribute__ ((aligned (8)));
+       unsigned int  major             __attribute__ ((aligned (8)));
+       unsigned int  minor             __attribute__ ((packed));
+};
+
+#define STATS_DISK_SIZE        (sizeof(struct stats_disk))
+
+/* Structure for network interfaces statistics */
+struct stats_net_dev {
+       unsigned long rx_packets                __attribute__ ((aligned (8)));
+       unsigned long tx_packets                __attribute__ ((aligned (8)));
+       unsigned long rx_bytes                  __attribute__ ((aligned (8)));
+       unsigned long tx_bytes                  __attribute__ ((aligned (8)));
+       unsigned long rx_compressed             __attribute__ ((aligned (8)));
+       unsigned long tx_compressed             __attribute__ ((aligned (8)));
+       unsigned long multicast                 __attribute__ ((aligned (8)));
+       char          interface[MAX_IFACE_LEN]  __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_DEV_SIZE     (sizeof(struct stats_net_dev))
+
+/* Structure for network interface errors statistics */
+struct stats_net_edev {
+       unsigned long collisions                __attribute__ ((aligned (8)));
+       unsigned long rx_errors                 __attribute__ ((aligned (8)));
+       unsigned long tx_errors                 __attribute__ ((aligned (8)));
+       unsigned long rx_dropped                __attribute__ ((aligned (8)));
+       unsigned long tx_dropped                __attribute__ ((aligned (8)));
+       unsigned long rx_fifo_errors            __attribute__ ((aligned (8)));
+       unsigned long tx_fifo_errors            __attribute__ ((aligned (8)));
+       unsigned long rx_frame_errors           __attribute__ ((aligned (8)));
+       unsigned long tx_carrier_errors         __attribute__ ((aligned (8)));
+       char          interface[MAX_IFACE_LEN]  __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_EDEV_SIZE    (sizeof(struct stats_net_edev))
+
+/* Structure for NFS client statistics */
+struct stats_net_nfs {
+       unsigned int  nfs_rpccnt        __attribute__ ((aligned (4)));
+       unsigned int  nfs_rpcretrans    __attribute__ ((packed));
+       unsigned int  nfs_readcnt       __attribute__ ((packed));
+       unsigned int  nfs_writecnt      __attribute__ ((packed));
+       unsigned int  nfs_accesscnt     __attribute__ ((packed));
+       unsigned int  nfs_getattcnt     __attribute__ ((packed));
+};
+
+#define STATS_NET_NFS_SIZE     (sizeof(struct stats_net_nfs))
+
+/* Structure for NFS server statistics */
+struct stats_net_nfsd {
+       unsigned int  nfsd_rpccnt       __attribute__ ((aligned (4)));
+       unsigned int  nfsd_rpcbad       __attribute__ ((packed));
+       unsigned int  nfsd_netcnt       __attribute__ ((packed));
+       unsigned int  nfsd_netudpcnt    __attribute__ ((packed));
+       unsigned int  nfsd_nettcpcnt    __attribute__ ((packed));
+       unsigned int  nfsd_rchits       __attribute__ ((packed));
+       unsigned int  nfsd_rcmisses     __attribute__ ((packed));
+       unsigned int  nfsd_readcnt      __attribute__ ((packed));
+       unsigned int  nfsd_writecnt     __attribute__ ((packed));
+       unsigned int  nfsd_accesscnt    __attribute__ ((packed));
+       unsigned int  nfsd_getattcnt    __attribute__ ((packed));
+};
+
+#define STATS_NET_NFSD_SIZE    (sizeof(struct stats_net_nfsd))
+
+/* Structure for IPv4 sockets statistics */
+struct stats_net_sock {
+       unsigned int  sock_inuse        __attribute__ ((aligned (4)));
+       unsigned int  tcp_inuse         __attribute__ ((packed));
+       unsigned int  tcp_tw            __attribute__ ((packed));
+       unsigned int  udp_inuse         __attribute__ ((packed));
+       unsigned int  raw_inuse         __attribute__ ((packed));
+       unsigned int  frag_inuse        __attribute__ ((packed));
+};
+
+#define STATS_NET_SOCK_SIZE    (sizeof(struct stats_net_sock))
+
+/* Structure for IP statistics */
+struct stats_net_ip {
+       unsigned long InReceives        __attribute__ ((aligned (8)));
+       unsigned long ForwDatagrams     __attribute__ ((aligned (8)));
+       unsigned long InDelivers        __attribute__ ((aligned (8)));
+       unsigned long OutRequests       __attribute__ ((aligned (8)));
+       unsigned long ReasmReqds        __attribute__ ((aligned (8)));
+       unsigned long ReasmOKs          __attribute__ ((aligned (8)));
+       unsigned long FragOKs           __attribute__ ((aligned (8)));
+       unsigned long FragCreates       __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_IP_SIZE      (sizeof(struct stats_net_ip))
+
+/* Structure for IP errors statistics */
+struct stats_net_eip {
+       unsigned long InHdrErrors       __attribute__ ((aligned (8)));
+       unsigned long InAddrErrors      __attribute__ ((aligned (8)));
+       unsigned long InUnknownProtos   __attribute__ ((aligned (8)));
+       unsigned long InDiscards        __attribute__ ((aligned (8)));
+       unsigned long OutDiscards       __attribute__ ((aligned (8)));
+       unsigned long OutNoRoutes       __attribute__ ((aligned (8)));
+       unsigned long ReasmFails        __attribute__ ((aligned (8)));
+       unsigned long FragFails         __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_EIP_SIZE     (sizeof(struct stats_net_eip))
+
+/* Structure for ICMP statistics */
+struct stats_net_icmp {
+       unsigned long InMsgs            __attribute__ ((aligned (8)));
+       unsigned long OutMsgs           __attribute__ ((aligned (8)));
+       unsigned long InEchos           __attribute__ ((aligned (8)));
+       unsigned long InEchoReps        __attribute__ ((aligned (8)));
+       unsigned long OutEchos          __attribute__ ((aligned (8)));
+       unsigned long OutEchoReps       __attribute__ ((aligned (8)));
+       unsigned long InTimestamps      __attribute__ ((aligned (8)));
+       unsigned long InTimestampReps   __attribute__ ((aligned (8)));
+       unsigned long OutTimestamps     __attribute__ ((aligned (8)));
+       unsigned long OutTimestampReps  __attribute__ ((aligned (8)));
+       unsigned long InAddrMasks       __attribute__ ((aligned (8)));
+       unsigned long InAddrMaskReps    __attribute__ ((aligned (8)));
+       unsigned long OutAddrMasks      __attribute__ ((aligned (8)));
+       unsigned long OutAddrMaskReps   __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_ICMP_SIZE    (sizeof(struct stats_net_icmp))
+
+/* Structure for ICMP error message statistics */
+struct stats_net_eicmp {
+       unsigned long InErrors          __attribute__ ((aligned (8)));
+       unsigned long OutErrors         __attribute__ ((aligned (8)));
+       unsigned long InDestUnreachs    __attribute__ ((aligned (8)));
+       unsigned long OutDestUnreachs   __attribute__ ((aligned (8)));
+       unsigned long InTimeExcds       __attribute__ ((aligned (8)));
+       unsigned long OutTimeExcds      __attribute__ ((aligned (8)));
+       unsigned long InParmProbs       __attribute__ ((aligned (8)));
+       unsigned long OutParmProbs      __attribute__ ((aligned (8)));
+       unsigned long InSrcQuenchs      __attribute__ ((aligned (8)));
+       unsigned long OutSrcQuenchs     __attribute__ ((aligned (8)));
+       unsigned long InRedirects       __attribute__ ((aligned (8)));
+       unsigned long OutRedirects      __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_EICMP_SIZE   (sizeof(struct stats_net_eicmp))
+
+/* Structure for TCP statistics */
+struct stats_net_tcp {
+       unsigned long ActiveOpens       __attribute__ ((aligned (8)));
+       unsigned long PassiveOpens      __attribute__ ((aligned (8)));
+       unsigned long InSegs            __attribute__ ((aligned (8)));
+       unsigned long OutSegs           __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_TCP_SIZE     (sizeof(struct stats_net_tcp))
+
+/* Structure for TCP errors statistics */
+struct stats_net_etcp {
+       unsigned long AttemptFails      __attribute__ ((aligned (8)));
+       unsigned long EstabResets       __attribute__ ((aligned (8)));
+       unsigned long RetransSegs       __attribute__ ((aligned (8)));
+       unsigned long InErrs            __attribute__ ((aligned (8)));
+       unsigned long OutRsts           __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_ETCP_SIZE    (sizeof(struct stats_net_etcp))
+
+/* Structure for UDP statistics */
+struct stats_net_udp {
+       unsigned long InDatagrams       __attribute__ ((aligned (8)));
+       unsigned long OutDatagrams      __attribute__ ((aligned (8)));
+       unsigned long NoPorts           __attribute__ ((aligned (8)));
+       unsigned long InErrors          __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_UDP_SIZE     (sizeof(struct stats_net_udp))
+
+/* Structure for IPv6 statistics */
+struct stats_net_ip6 {
+       unsigned long InReceives6       __attribute__ ((aligned (8)));
+       unsigned long OutForwDatagrams6 __attribute__ ((aligned (8)));
+       unsigned long InDelivers6       __attribute__ ((aligned (8)));
+       unsigned long OutRequests6      __attribute__ ((aligned (8)));
+       unsigned long ReasmReqds6       __attribute__ ((aligned (8)));
+       unsigned long ReasmOKs6         __attribute__ ((aligned (8)));
+       unsigned long InMcastPkts6      __attribute__ ((aligned (8)));
+       unsigned long OutMcastPkts6     __attribute__ ((aligned (8)));
+       unsigned long FragOKs6          __attribute__ ((aligned (8)));
+       unsigned long FragCreates6      __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_IP6_SIZE     (sizeof(struct stats_net_ip6))
+
+/* Structure for IPv6 errors statistics */
+struct stats_net_eip6 {
+       unsigned long InHdrErrors6      __attribute__ ((aligned (8)));
+       unsigned long InAddrErrors6     __attribute__ ((aligned (8)));
+       unsigned long InUnknownProtos6  __attribute__ ((aligned (8)));
+       unsigned long InTooBigErrors6   __attribute__ ((aligned (8)));
+       unsigned long InDiscards6       __attribute__ ((aligned (8)));
+       unsigned long OutDiscards6      __attribute__ ((aligned (8)));
+       unsigned long InNoRoutes6       __attribute__ ((aligned (8)));
+       unsigned long OutNoRoutes6      __attribute__ ((aligned (8)));
+       unsigned long ReasmFails6       __attribute__ ((aligned (8)));
+       unsigned long FragFails6        __attribute__ ((aligned (8)));
+       unsigned long InTruncatedPkts6  __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_EIP6_SIZE    (sizeof(struct stats_net_eip6))
+
+/* Structure for ICMPv6 statistics */
+struct stats_net_icmp6 {
+       unsigned long InMsgs6                           __attribute__ ((aligned (8)));
+       unsigned long OutMsgs6                          __attribute__ ((aligned (8)));
+       unsigned long InEchos6                          __attribute__ ((aligned (8)));
+       unsigned long InEchoReplies6                    __attribute__ ((aligned (8)));
+       unsigned long OutEchoReplies6                   __attribute__ ((aligned (8)));
+       unsigned long InGroupMembQueries6               __attribute__ ((aligned (8)));
+       unsigned long InGroupMembResponses6             __attribute__ ((aligned (8)));
+       unsigned long OutGroupMembResponses6            __attribute__ ((aligned (8)));
+       unsigned long InGroupMembReductions6            __attribute__ ((aligned (8)));
+       unsigned long OutGroupMembReductions6           __attribute__ ((aligned (8)));
+       unsigned long InRouterSolicits6                 __attribute__ ((aligned (8)));
+       unsigned long OutRouterSolicits6                __attribute__ ((aligned (8)));
+       unsigned long InRouterAdvertisements6           __attribute__ ((aligned (8)));
+       unsigned long InNeighborSolicits6               __attribute__ ((aligned (8)));
+       unsigned long OutNeighborSolicits6              __attribute__ ((aligned (8)));
+       unsigned long InNeighborAdvertisements6         __attribute__ ((aligned (8)));
+       unsigned long OutNeighborAdvertisements6        __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_ICMP6_SIZE   (sizeof(struct stats_net_icmp6))
+
+/* Structure for ICMPv6 error message statistics */
+struct stats_net_eicmp6 {
+       unsigned long InErrors6         __attribute__ ((aligned (8)));
+       unsigned long InDestUnreachs6   __attribute__ ((aligned (8)));
+       unsigned long OutDestUnreachs6  __attribute__ ((aligned (8)));
+       unsigned long InTimeExcds6      __attribute__ ((aligned (8)));
+       unsigned long OutTimeExcds6     __attribute__ ((aligned (8)));
+       unsigned long InParmProblems6   __attribute__ ((aligned (8)));
+       unsigned long OutParmProblems6  __attribute__ ((aligned (8)));
+       unsigned long InRedirects6      __attribute__ ((aligned (8)));
+       unsigned long OutRedirects6     __attribute__ ((aligned (8)));
+       unsigned long InPktTooBigs6     __attribute__ ((aligned (8)));
+       unsigned long OutPktTooBigs6    __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_EICMP6_SIZE  (sizeof(struct stats_net_eicmp6))
+
+/* Structure for UDPv6 statistics */
+struct stats_net_udp6 {
+       unsigned long InDatagrams6      __attribute__ ((aligned (8)));
+       unsigned long OutDatagrams6     __attribute__ ((aligned (8)));
+       unsigned long NoPorts6          __attribute__ ((aligned (8)));
+       unsigned long InErrors6         __attribute__ ((aligned (8)));
+};
+
+#define STATS_NET_UDP6_SIZE    (sizeof(struct stats_net_udp6))
+
+/* Structure for IPv6 sockets statistics */
+struct stats_net_sock6 {
+       unsigned int  tcp6_inuse        __attribute__ ((aligned (4)));
+       unsigned int  udp6_inuse        __attribute__ ((packed));
+       unsigned int  raw6_inuse        __attribute__ ((packed));
+       unsigned int  frag6_inuse       __attribute__ ((packed));
+};
+
+#define STATS_NET_SOCK6_SIZE   (sizeof(struct stats_net_sock6))
+
+/*
+ * Structure for CPU frequency statistics.
+ * In activity buffer: First structure is for global CPU utilisation ("all").
+ * Following structures are for each individual CPU (0, 1, etc.)
+ */
+struct stats_pwr_cpufreq {
+       unsigned long cpufreq   __attribute__ ((aligned (8)));
+};
+
+#define STATS_PWR_CPUFREQ_SIZE (sizeof(struct stats_pwr_cpufreq))
+
+/*
+ * Structure for fan statistics.
+ */
+struct stats_pwr_fan {
+       double  rpm                             __attribute__ ((aligned (8)));
+       double  rpm_min                         __attribute__ ((aligned (8)));
+       char    device[MAX_SENSORS_DEV_LEN]     __attribute__ ((aligned (8)));
+};
+
+#define STATS_PWR_FAN_SIZE     (sizeof(struct stats_pwr_fan))
+
+/*
+ * Structure for device temperature statistics.
+ */
+struct stats_pwr_temp {
+       double  temp                            __attribute__ ((aligned (8)));
+       double  temp_min                        __attribute__ ((aligned (8)));
+       double  temp_max                        __attribute__ ((aligned (8)));
+       char    device[MAX_SENSORS_DEV_LEN]     __attribute__ ((aligned (8)));
+};
+
+#define STATS_PWR_TEMP_SIZE    (sizeof(struct stats_pwr_temp))
+
+/*
+ * Structure for voltage inputs statistics.
+ */
+struct stats_pwr_in {
+       double  in                              __attribute__ ((aligned (8)));
+       double  in_min                          __attribute__ ((aligned (8)));
+       double  in_max                          __attribute__ ((aligned (8)));
+       char    device[MAX_SENSORS_DEV_LEN]     __attribute__ ((aligned (8)));
+};
+
+#define STATS_PWR_IN_SIZE    (sizeof(struct stats_pwr_in))
+
+/*
+ ***************************************************************************
+ * Prototypes for functions used to read system statistics
+ ***************************************************************************
+ */
+
+extern void
+       read_stat_cpu(struct stats_cpu *, int,
+                     unsigned long long *, unsigned long long *);
+extern void
+       read_stat_pcsw(struct stats_pcsw *);
+extern void
+       read_stat_irq(struct stats_irq *, int);
+extern void
+       read_loadavg(struct stats_queue *);
+extern void
+       read_meminfo(struct stats_memory *);
+extern void
+       read_vmstat_swap(struct stats_swap *);
+extern void
+       read_vmstat_paging(struct stats_paging *);
+extern void
+       read_diskstats_io(struct stats_io *);
+extern void
+       read_diskstats_disk(struct stats_disk *, int, int);
+extern void
+       read_tty_driver_serial(struct stats_serial *, int);
+extern void
+       read_kernel_tables(struct stats_ktables *);
+extern void
+       read_net_dev(struct stats_net_dev *, int);
+extern void
+       read_net_edev(struct stats_net_edev *, int);
+extern void
+       read_net_nfs(struct stats_net_nfs *);
+extern void
+       read_net_nfsd(struct stats_net_nfsd *);
+extern void
+       read_net_sock(struct stats_net_sock *);
+extern void
+       read_net_ip(struct stats_net_ip *);
+extern void
+       read_net_eip(struct stats_net_eip *);
+extern void
+       read_net_icmp(struct stats_net_icmp *);
+extern void
+       read_net_eicmp(struct stats_net_eicmp *);
+extern void
+       read_net_tcp(struct stats_net_tcp *);
+extern void
+       read_net_etcp(struct stats_net_etcp *);
+extern void
+       read_net_udp(struct stats_net_udp *);
+extern void
+       read_uptime(unsigned long long *);
+extern void
+       read_net_sock6(struct stats_net_sock6 *);
+extern void
+       read_net_ip6(struct stats_net_ip6 *);
+extern void
+       read_net_eip6(struct stats_net_eip6 *);
+extern void
+       read_net_icmp6(struct stats_net_icmp6 *);
+extern void
+       read_net_eicmp6(struct stats_net_eicmp6 *);
+extern void
+       read_net_udp6(struct stats_net_udp6 *);
+extern void
+       read_cpuinfo(struct stats_pwr_cpufreq *, int);
+extern void
+       read_fan(struct stats_pwr_fan *, int);
+extern void
+       read_temp(struct stats_pwr_temp *, int);
+extern void
+       read_in(struct stats_pwr_in *, int);
+
+/*
+ ***************************************************************************
+ * Prototypes for functions used to count number of items
+ ***************************************************************************
+ */
+
+extern int
+       get_irq_nr(void);
+extern int
+       get_serial_nr(void);
+extern int
+       get_iface_nr(void);
+extern int
+       get_diskstats_dev_nr(int, int);
+extern int
+       get_disk_nr(unsigned int);
+extern int
+       get_cpu_nr(unsigned int);
+extern int
+       get_irqcpu_nr(char *, int, int);
+extern int
+       get_fan_nr(void);
+extern int
+       get_temp_nr(void);
+extern int
+       get_in_nr(void);
+
+#endif /* _RD_STATS_H */
diff --git a/sa.h b/sa.h
new file mode 100644 (file)
index 0000000..ac5cc40
--- /dev/null
+++ b/sa.h
@@ -0,0 +1,755 @@
+/*
+ * sar/sadc: Report system activity
+ * (C) 1999-2010 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _SA_H
+#define _SA_H
+
+#include "common.h"
+#include "rd_stats.h"
+
+
+/*
+ ***************************************************************************
+ * Activity identification values.
+ ***************************************************************************
+ */
+
+/* Number of activities */
+#define NR_ACT 33
+
+/* Activities */
+#define A_CPU          1
+#define A_PCSW         2
+#define A_IRQ          3
+#define A_SWAP         4
+#define A_PAGE         5
+#define A_IO           6
+#define A_MEMORY       7
+#define A_KTABLES      8
+#define A_QUEUE                9
+#define A_SERIAL       10
+#define A_DISK         11
+#define A_NET_DEV      12
+#define A_NET_EDEV     13
+#define A_NET_NFS      14
+#define A_NET_NFSD     15
+#define A_NET_SOCK     16
+#define A_NET_IP       17
+#define A_NET_EIP      18
+#define A_NET_ICMP     19
+#define A_NET_EICMP    20
+#define A_NET_TCP      21
+#define A_NET_ETCP     22
+#define A_NET_UDP      23
+#define A_NET_SOCK6    24
+#define A_NET_IP6      25
+#define A_NET_EIP6     26
+#define A_NET_ICMP6    27
+#define A_NET_EICMP6   28
+#define A_NET_UDP6     29
+#define A_PWR_CPUFREQ  30
+#define A_PWR_FAN      31
+#define A_PWR_TEMP     32
+#define A_PWR_IN       33
+
+
+/* Macro used to flag an activity that should be collected */
+#define COLLECT_ACTIVITY(m)    act[get_activity_position(act, m)]->options |= AO_COLLECTED
+
+/* Macro used to flag an activity that should be selected */
+#define SELECT_ACTIVITY(m)     act[get_activity_position(act, m)]->options |= AO_SELECTED
+
+
+/*
+ ***************************************************************************
+ * Flags.
+ ***************************************************************************
+ */
+
+#define S_F_SINCE_BOOT         0x00000001
+#define S_F_SA_ROTAT           0x00000002
+#define S_F_DEV_PRETTY         0x00000004
+#define S_F_FORCE_FILE         0x00000008
+#define S_F_INTERVAL_SET       0x00000010
+#define S_F_TRUE_TIME          0x00000020
+#define S_F_LOCK_FILE          0x00000040
+/* Unused                      0x00000080 */
+/* Unused                      0x00000100 */
+#define S_F_FILE_LOCKED                0x00000200
+#define S_F_PER_PROC           0x00000400
+#define S_F_HORIZONTALLY       0x00000800
+#define S_F_COMMENT            0x00001000
+
+#define WANT_SINCE_BOOT(m)     (((m) & S_F_SINCE_BOOT)   == S_F_SINCE_BOOT)
+#define WANT_SA_ROTAT(m)       (((m) & S_F_SA_ROTAT)     == S_F_SA_ROTAT)
+#define USE_PRETTY_OPTION(m)   (((m) & S_F_DEV_PRETTY)   == S_F_DEV_PRETTY)
+#define FORCE_FILE(m)          (((m) & S_F_FORCE_FILE)   == S_F_FORCE_FILE)
+#define INTERVAL_SET(m)                (((m) & S_F_INTERVAL_SET) == S_F_INTERVAL_SET)
+#define PRINT_TRUE_TIME(m)     (((m) & S_F_TRUE_TIME)    == S_F_TRUE_TIME)
+#define LOCK_FILE(m)           (((m) & S_F_LOCK_FILE)    == S_F_LOCK_FILE)
+#define FILE_LOCKED(m)         (((m) & S_F_FILE_LOCKED)  == S_F_FILE_LOCKED)
+#define WANT_PER_PROC(m)       (((m) & S_F_PER_PROC)     == S_F_PER_PROC)
+#define DISPLAY_HORIZONTALLY(m)        (((m) & S_F_HORIZONTALLY) == S_F_HORIZONTALLY)
+#define DISPLAY_COMMENT(m)     (((m) & S_F_COMMENT)      == S_F_COMMENT)
+
+/* Output flags for options -R / -r / -S */
+#define AO_F_MEM_DIA           0x00000001
+#define AO_F_MEM_AMT           0x00000002
+#define AO_F_MEM_SWAP          0x00000004
+
+#define DISPLAY_MEMORY(m)      (((m) & AO_F_MEM_DIA)     == AO_F_MEM_DIA)
+#define DISPLAY_MEM_AMT(m)     (((m) & AO_F_MEM_AMT)     == AO_F_MEM_AMT)
+#define DISPLAY_SWAP(m)                (((m) & AO_F_MEM_SWAP)    == AO_F_MEM_SWAP)
+
+/* Output flags for option -u [ ALL ] */
+#define AO_F_CPU_DEF           0x00000001
+#define AO_F_CPU_ALL           0x00000002
+
+#define DISPLAY_CPU_DEF(m)     (((m) & AO_F_CPU_DEF)     == AO_F_CPU_DEF)
+#define DISPLAY_CPU_ALL(m)     (((m) & AO_F_CPU_ALL)     == AO_F_CPU_ALL)
+
+/* Output flags for option -d */
+#define AO_F_DISK_PART         0x00000001
+
+#define COLLECT_PARTITIONS(m)  (((m) & AO_F_DISK_PART)   == AO_F_DISK_PART)
+
+/*
+ ***************************************************************************
+ * Various keywords and constants.
+ ***************************************************************************
+ */
+
+/* Keywords */
+#define K_XALL         "XALL"
+#define K_SUM          "SUM"
+#define K_DEV          "DEV"
+#define K_EDEV         "EDEV"
+#define K_NFS          "NFS"
+#define K_NFSD         "NFSD"
+#define K_SOCK         "SOCK"
+#define K_IP           "IP"
+#define K_EIP          "EIP"
+#define K_ICMP         "ICMP"
+#define K_EICMP                "EICMP"
+#define K_TCP          "TCP"
+#define K_ETCP         "ETCP"
+#define K_UDP          "UDP"
+#define K_DISK         "DISK"
+#define K_INT          "INT"
+#define K_SNMP         "SNMP"
+#define K_SOCK6                "SOCK6"
+#define K_IP6          "IP6"
+#define K_EIP6         "EIP6"
+#define K_ICMP6                "ICMP6"
+#define K_EICMP6       "EICMP6"
+#define K_UDP6         "UDP6"
+#define K_IPV6         "IPV6"
+#define K_POWER                "POWER"
+#define K_XDISK                "XDISK"
+#define K_CPU          "CPU"
+#define K_FAN          "FAN"
+#define K_TEMP         "TEMP"
+#define K_IN           "IN"
+
+/* sadc program */
+#define SADC           "sadc"
+
+/* Time must have the format HH:MM:SS with HH in 24-hour format */
+#define DEF_TMSTART    "08:00:00"
+#define DEF_TMEND      "18:00:00"
+
+/*
+ * Macro used to define activity bitmap size.
+ * All those bitmaps have an additional bit used for global activity
+ * (eg. CPU "all" or total number of interrupts). That's why we do "(m) + 1".
+ */
+#define BITMAP_SIZE(m) ((((m) + 1) / 8) + 1)
+
+/* Pre-allocation constants */
+#define NR_IFACE_PREALLOC      2
+#define NR_SERIAL_PREALLOC     2
+#define NR_DISK_PREALLOC       3
+
+#define UTSNAME_LEN            65
+#define TIMESTAMP_LEN          16
+#define XML_TIMESTAMP_LEN      64
+#define HEADER_LINE_LEN                512
+
+/* Maximum number of args that can be passed to sadc */
+#define MAX_ARGV_NR    32
+
+/* Miscellaneous constants */
+#define USE_SADC       0
+#define USE_SA_FILE    1
+#define NO_TM_START    0
+#define NO_TM_END      0
+#define NO_RESET       0
+#define NON_FATAL      0
+#define FATAL          1
+#define C_SAR          0
+#define C_SADF         1
+#define ALL_ACTIVITIES ~0U
+
+#define SOFT_SIZE      0
+#define HARD_SIZE      1
+
+#define CLOSE_XML_MARKUP       0
+#define OPEN_XML_MARKUP                1
+
+#define COUNT_ACTIVITIES       0
+#define COUNT_OUTPUTS          1
+
+
+/*
+ ***************************************************************************
+ * Generic description of an activity.
+ ***************************************************************************
+ */
+
+/* Activity options */
+#define AO_NULL                        0x00
+/*
+ * Indicate that corresponding activity should be collected by sadc.
+ */
+#define AO_COLLECTED           0x01
+/*
+ * Indicate that corresponding activity should be displayed by sar.
+ */
+#define AO_SELECTED            0x02
+/*
+ * Indicate that, when registered again, activity counters will get back
+ * the values they had when they were unregistered (eg. CPUs, which can
+ * be disabled/enabled on the fly).
+ */
+#define AO_REMANENT            0x04
+/*
+ * Indicate that the interval of time, given to f_print() function
+ * displaying statistics, should be the interval of time in jiffies
+ * multiplied by the number of processors.
+ */
+#define AO_GLOBAL_ITV          0x08
+/*
+ * This flag should be set for every activity closing a markup used
+ * by several activities. Used by sadf f_xml_print() functions to
+ * display XML output.
+ */
+#define AO_CLOSE_MARKUP                0x10
+/*
+ * Indicate that corresponding activity has multiple different
+ * output formats. This is the case for example for memory activity
+ * with options -r and -R.
+ */
+#define AO_MULTIPLE_OUTPUTS    0x20
+
+#define IS_COLLECTED(m)                (((m) & AO_COLLECTED)        == AO_COLLECTED)
+#define IS_SELECTED(m)         (((m) & AO_SELECTED)         == AO_SELECTED)
+#define IS_REMANENT(m)         (((m) & AO_REMANENT)         == AO_REMANENT)
+#define NEEDS_GLOBAL_ITV(m)    (((m) & AO_GLOBAL_ITV)       == AO_GLOBAL_ITV)
+#define CLOSE_MARKUP(m)                (((m) & AO_CLOSE_MARKUP)     == AO_CLOSE_MARKUP)
+#define HAS_MULTIPLE_OUTPUTS(m)        (((m) & AO_MULTIPLE_OUTPUTS) == AO_MULTIPLE_OUTPUTS)
+
+
+/* Type for all functions counting items */
+#define __nr_t         int
+/* Type for all functions reading statistics */
+#define __read_funct_t void
+/* Type for all functions displaying statistics */
+#define __print_funct_t void
+
+#define _buf0  buf[0]
+
+/* Structure used to define a bitmap needed by an activity */
+struct act_bitmap {
+       /*
+        * Bitmap for activities that need one. Remember to allocate it
+        * before use!
+        */
+       unsigned char *b_array;
+       /*
+        * Size of the bitmap in bits. In fact, bitmap is sized to bitmap_size + 1
+        * to take into account CPU "all"
+        */
+       int b_size;
+};
+
+/* Structure used to define an activity */
+struct activity {
+       /*
+        * This variable contains the identification value (A_...) for this activity.
+        */
+       unsigned int id;
+       /*
+        * Activity options (AO_SELECTED, ...)
+        */
+       unsigned int options;
+       /*
+        * The f_count() function is used to count the number of
+        * items (serial lines, network interfaces, etc.).
+        * Such a function should _always_ return a value greater than
+        * or equal to 0.
+        *
+        * A NULL value for this function pointer indicates that the number of items
+        * is a constant (and @nr is set to this value).
+        *
+        * This function is called even if activity has not been selected, to make
+        * sure that all items have been calculated (including #CPU, etc.)
+        */
+       __nr_t (*f_count) (struct activity *);
+       /*
+        * This function reads the relevant file and fill the buffer
+        * with statistics corresponding to given activity.
+        */
+       __read_funct_t (*f_read) (struct activity *);
+       /*
+        * This function displays activity statistics onto the screen.
+        */
+       __print_funct_t (*f_print) (struct activity *, int, int, unsigned long long);
+       /*
+        * This function displays average activity statistics onto the screen.
+        */
+       __print_funct_t (*f_print_avg) (struct activity *, int, int, unsigned long long);
+       /*
+        * This function is used by sadf to display activity in a format that can
+        * easily be ingested by a relational database, or a format that can be
+        * handled by pattern processing commands like "awk".
+        */
+       __print_funct_t (*f_render) (struct activity *, int, char *, int, unsigned long long);
+       /*
+        * This function is used by sadf to display activity statistics in XML.
+        */
+       __print_funct_t (*f_xml_print) (struct activity *, int, int, unsigned long long);
+       /*
+        * Header string displayed by sadf -d/-D.
+        */
+       char *hdr_line;
+       /*
+        * Name of activity.
+        */
+       char *name;
+       /*
+        * Number of items on the system.
+        * A negative value (-1) is the default value and indicates that this number
+        * has still not been calculated by the f_count() function.
+        * A value of 0 means that this number has been calculated, but no items have
+        * been found.
+        */
+       __nr_t nr;
+       /*
+        * Size of an item.
+        * This is the size of the corresponding structure, as read from or written
+        * to a file, or read from or written by the data collector.
+        */
+       int fsize;
+       /*
+        * Size of an item.
+        * This is the size of the corresponding structure as mapped into memory.
+        * @msize can be different from @fsize when data are read from or written to
+        * a data file from a different sysstat version.
+        */
+       int msize;
+       /*
+        * Optional flags for activity. This is eg. used when AO_MULTIPLE_OUTPUTS
+        * option is set.
+        */
+       unsigned int opt_flags;
+       /*
+        * Buffers that will contain the statistics read. Its size is @nr * @size each.
+        * [0]: used by sadc. Used by sar to save first collected stats (used later to
+        * compute average).
+        * [1] and [2]: current/previous statistics values (used by sar).
+        */
+       void *buf[3];
+       /*
+        * Bitmap for activities that need one. Such a bitmap is needed by activity
+        * if @bitmap is not NULL.
+        */
+       struct act_bitmap *bitmap;
+};
+
+
+/*
+ ***************************************************************************
+ * Definitions of header structures.
+ *
+ * Format of system activity data files:
+ *      __
+ *     |
+ *     | file_magic structure
+ *     |
+ *     |--
+ *     |
+ *     | file_header structure
+ *     |
+ *     |--                         --|
+ *     |                             |
+ *     | file_activity structure     | * sa_nr_act
+ *     |                             |
+ *     |--                         --|
+ *     |                             |
+ *     | record_header structure     |
+ *     |                             |
+ *     |--                           | * <count>
+ *     |                             |
+ *     | Statistics structures...(*) |
+ *     |                             |
+ *     |--                         --|
+ *
+ * (*)Note: If it's a special record, we may find a comment instead of
+ * statistics (R_COMMENT record type) or even nothing at all (R_RESTART
+ * record type).
+ ***************************************************************************
+ */
+
+/*
+ * Sysstat magic number. Should never be modified.
+ * Indicate that the file was created by sysstat.
+ */
+#define SYSSTAT_MAGIC  0xd596
+
+/*
+ * Datafile format magic number.
+ * Modified to indicate that the format of the file is
+ * no longer compatible with that of previous sysstat versions.
+ */
+#define FORMAT_MAGIC   0x2170
+
+/* Structure for file magic header data */
+struct file_magic {
+       /*
+        * This field identifies the file as a file created by sysstat.
+        */
+       unsigned short sysstat_magic;
+       /*
+        * The value of this field varies whenever datafile format changes.
+        */
+       unsigned short format_magic;
+       /*
+        * Sysstat version used to create the file.
+        */
+       unsigned char  sysstat_version;
+       unsigned char  sysstat_patchlevel;
+       unsigned char  sysstat_sublevel;
+       unsigned char  sysstat_extraversion;
+};
+
+#define FILE_MAGIC_SIZE        (sizeof(struct file_magic))
+
+
+/* Header structure for system activity data file */
+struct file_header {
+       /*
+        * Timestamp in seconds since the epoch.
+        */
+       unsigned long sa_ust_time       __attribute__ ((aligned (8)));
+       /*
+        * Number of activities saved in the file
+        */
+       unsigned int sa_nr_act          __attribute__ ((aligned (8)));
+       /*
+        * Current day, month and year.
+        * No need to save DST (Daylight Saving Time) flag, since it is not taken
+        * into account by the strftime() function used to print the timestamp.
+        */
+       unsigned char sa_day;
+       unsigned char sa_month;
+       unsigned char sa_year;
+       /*
+        * Size of a long integer. Useful to know the architecture on which
+        * the datafile was created.
+        */
+       char sa_sizeof_long;
+       /*
+        * Operating system name.
+        */
+       char sa_sysname[UTSNAME_LEN];
+       /*
+        * Machine hostname.
+        */
+       char sa_nodename[UTSNAME_LEN];
+       /*
+        * Operating system release number.
+        */
+       char sa_release[UTSNAME_LEN];
+       /*
+        * Machine architecture.
+        */
+       char sa_machine[UTSNAME_LEN];
+};
+
+#define FILE_HEADER_SIZE       (sizeof(struct file_header))
+
+
+/* List of activities saved in file */
+struct file_activity {
+       /*
+        * Identification value of activity.
+        */
+       unsigned int id         __attribute__ ((aligned (4)));
+       /*
+        * Number of items for this activity.
+        */
+       __nr_t nr               __attribute__ ((packed));
+       /*
+        * Size of an item structure.
+        */
+       int size                __attribute__ ((packed));
+};
+
+#define FILE_ACTIVITY_SIZE     (sizeof(struct file_activity))
+
+
+/* Record type */
+/*
+ * R_STATS means that this is a record of statistics.
+ */
+#define R_STATS                1
+/*
+ * R_RESTART means that this is a special record containing
+ * a LINUX RESTART message.
+ */
+#define R_RESTART      2
+/*
+ * R_LAST_STATS warns sar that this is the last record to be written
+ * to file before a file rotation, and that the next data to come will
+ * be a header file.
+ * Such a record is tagged R_STATS anyway before being written to file.
+ */
+#define R_LAST_STATS   3
+/*
+ * R_COMMENT means that this is a special record containing
+ * a comment.
+ */
+#define R_COMMENT      4
+
+/* Maximum length of a comment */
+#define MAX_COMMENT_LEN        64
+
+/* Header structure for every record */
+struct record_header {
+       /*
+        * Machine uptime (multiplied by the # of proc).
+        */
+       unsigned long long uptime       __attribute__ ((aligned (16)));
+       /*
+        * Uptime reduced to one processor. Always set, even on UP machines.
+        */
+       unsigned long long uptime0      __attribute__ ((aligned (16)));
+       /*
+        * Timestamp (number of seconds since the epoch).
+        */
+       unsigned long ust_time          __attribute__ ((aligned (16)));
+       /*
+        * Record type: R_STATS, R_RESTART,...
+        */
+       unsigned char record_type       __attribute__ ((aligned (8)));
+       /*
+        * Timestamp: Hour (0-23), minute (0-59) and second (0-59).
+        * Used to determine TRUE time (immutable, non locale dependent time).
+        */
+       unsigned char hour;
+       unsigned char minute;
+       unsigned char second;
+};
+
+#define RECORD_HEADER_SIZE     (sizeof(struct record_header))
+
+
+/*
+ ***************************************************************************
+ * Macro functions definitions.
+ *
+ * Note: Using 'do ... while' makes the macros safer to use
+ * (remember that macro use are followed by a semicolon).
+ ***************************************************************************
+ */
+
+/* Close file descriptors */
+#define CLOSE_ALL(_fd_)                do {                    \
+                                       close(_fd_[0]); \
+                                       close(_fd_[1]); \
+                               } while (0)
+
+#define CLOSE(_fd_)            if (_fd_ >= 0)          \
+                                       close(_fd_)
+
+
+/*
+ ***************************************************************************
+ * Various structure definitions.
+ ***************************************************************************
+ */
+
+/* Structure for timestamps */
+struct tstamp {
+       int tm_sec;
+       int tm_min;
+       int tm_hour;
+       int use;
+};
+
+
+/*
+ ***************************************************************************
+ * Functions prototypes.
+ ***************************************************************************
+ */
+
+/* Functions used to count number of items */
+extern __nr_t
+       wrap_get_cpu_nr(struct activity *);
+extern __nr_t
+       wrap_get_irq_nr(struct activity *);
+extern __nr_t
+       wrap_get_serial_nr(struct activity *);
+extern __nr_t
+       wrap_get_disk_nr(struct activity *);
+extern __nr_t
+       wrap_get_iface_nr(struct activity *);
+extern __nr_t
+       wrap_get_fan_nr(struct activity *);
+extern __nr_t
+       wrap_get_temp_nr(struct activity *);
+extern __nr_t
+       wrap_get_in_nr(struct activity *);
+
+/* Functions used to read activities statistics */
+extern __read_funct_t
+       wrap_read_stat_cpu(struct activity *);
+extern __read_funct_t
+       wrap_read_stat_pcsw(struct activity *);
+extern __read_funct_t
+       wrap_read_stat_irq(struct activity *);
+extern __read_funct_t
+       wrap_read_swap(struct activity *);
+extern __read_funct_t
+       wrap_read_paging(struct activity *);
+extern __read_funct_t
+       wrap_read_io(struct activity *);
+extern __read_funct_t
+       wrap_read_meminfo(struct activity *);
+extern __read_funct_t
+       wrap_read_kernel_tables(struct activity *);
+extern __read_funct_t
+       wrap_read_loadavg(struct activity *);
+extern __read_funct_t
+       wrap_read_tty_driver_serial(struct activity *);
+extern __read_funct_t
+       wrap_read_disk(struct activity *);
+extern __read_funct_t
+       wrap_read_net_dev(struct activity *);
+extern __read_funct_t
+       wrap_read_net_edev(struct activity *);
+extern __read_funct_t
+       wrap_read_net_nfs(struct activity *);
+extern __read_funct_t
+       wrap_read_net_nfsd(struct activity *);
+extern __read_funct_t
+       wrap_read_net_sock(struct activity *);
+extern __read_funct_t
+       wrap_read_net_ip(struct activity *);
+extern __read_funct_t
+       wrap_read_net_eip(struct activity *);
+extern __read_funct_t
+       wrap_read_net_icmp(struct activity *);
+extern __read_funct_t
+       wrap_read_net_eicmp(struct activity *);
+extern __read_funct_t
+       wrap_read_net_tcp(struct activity *);
+extern __read_funct_t
+       wrap_read_net_etcp(struct activity *);
+extern __read_funct_t
+       wrap_read_net_udp(struct activity *);
+extern __read_funct_t
+       wrap_read_net_sock6(struct activity *);
+extern __read_funct_t
+       wrap_read_net_ip6(struct activity *);
+extern __read_funct_t
+       wrap_read_net_eip6(struct activity *);
+extern __read_funct_t
+       wrap_read_net_icmp6(struct activity *);
+extern __read_funct_t
+       wrap_read_net_eicmp6(struct activity *);
+extern __read_funct_t
+       wrap_read_net_udp6(struct activity *);
+extern __read_funct_t
+       wrap_read_cpuinfo(struct activity *);
+extern __read_funct_t
+       wrap_read_fan(struct activity *);
+extern __read_funct_t
+       wrap_read_temp(struct activity *);
+extern __read_funct_t
+       wrap_read_in(struct activity *);
+
+/* Other functions */
+extern void
+       allocate_bitmaps(struct activity * []);
+extern void
+       allocate_structures(struct activity * []);
+extern int
+       check_disk_reg(struct activity *, int, int, int);
+extern void
+       check_file_actlst(int *, char *, struct activity * [], struct file_magic *,
+                         struct file_header *, struct file_activity **,
+                         unsigned int [], int);
+extern unsigned int
+       check_net_dev_reg(struct activity *, int, int, unsigned int);
+extern unsigned int
+       check_net_edev_reg(struct activity *, int, int, unsigned int);
+extern void
+       copy_structures(struct activity * [], unsigned int [],
+                       struct record_header [], int, int);
+extern int
+       datecmp(struct tm *, struct tstamp *);
+extern void
+       display_sa_file_version(struct file_magic *);
+extern void
+       free_bitmaps(struct activity * []);
+extern void
+       free_structures(struct activity * []);
+extern int
+       get_activity_nr(struct activity * [], unsigned int, int);
+extern int
+       get_activity_position(struct activity * [], unsigned int);
+extern char *
+       get_devname(unsigned int, unsigned int, int);
+extern void
+       get_file_timestamp_struct(unsigned int, struct tm *, struct file_header *);
+extern void
+       get_itv_value(struct record_header *, struct record_header *,
+                     unsigned int, unsigned long long *, unsigned long long *);
+extern void
+       handle_invalid_sa_file(int *, struct file_magic *, char *, int);
+extern int
+       next_slice(unsigned long long, unsigned long long, int, long);
+extern int
+       parse_sar_opt(char * [], int *, struct activity * [], unsigned int *, int);
+extern int
+       parse_sar_I_opt(char * [], int *, struct activity * []);
+extern int
+       parse_sa_P_opt(char * [], int *, unsigned int *, struct activity * []);
+extern int
+       parse_sar_m_opt(char * [], int *, struct activity * []);
+extern int
+       parse_sar_n_opt(char * [], int *, struct activity * []);
+extern int
+       parse_timestamp(char * [], int *, struct tstamp *, const char *);
+extern void
+       print_report_hdr(unsigned int, struct tm *, struct file_header *, int);
+extern void
+       read_file_stat_bunch(struct activity * [], int, int, int, struct file_activity *);
+extern int
+       sa_fread(int, void *, int, int);
+extern void
+       select_all_activities(struct activity * []);
+extern void
+       select_default_activity(struct activity * []);
+extern void
+       set_bitmap(unsigned char [], unsigned char, unsigned int);
+extern void
+       set_default_file(struct tm *, char *);
+extern void
+       set_hdr_rectime(unsigned int, struct tm *, struct file_header *);
+
+#endif  /* _SA_H */
diff --git a/sa1.in b/sa1.in
new file mode 100644 (file)
index 0000000..dbaa322
--- /dev/null
+++ b/sa1.in
@@ -0,0 +1,45 @@
+#!/bin/sh
+# @SA_LIB_DIR@/sa1
+# (C) 1999-2009 Sebastien Godard (sysstat <at> orange.fr)
+#
+#@(#) @PACKAGE_NAME@-@PACKAGE_VERSION@
+#@(#) sa1: Collect and store binary data in system activity data file.
+#
+HISTORY=0
+SYSCONFIG_DIR=@SYSCONFIG_DIR@
+[ -r ${SYSCONFIG_DIR}/sysstat ] && . ${SYSCONFIG_DIR}/sysstat
+if [ ${HISTORY} -gt 28 ]
+then
+       CURRENTDIR=`date +%Y%m`
+       DATE=`date +%d`
+       CURRENTFILE=sa${DATE}
+       DDIR=@SA_DIR@
+       cd ${DDIR} || exit 1
+       [ -d ${CURRENTDIR} ] || mkdir -p ${CURRENTDIR}
+       # If ${CURRENTFILE} exists and is a regular file, then make sure
+               # the file was modified this day (and not e.g. month ago)
+       # and move it to ${CURRENTDIR}
+       [ ! -L ${CURRENTFILE} ] &&
+               [ -f ${CURRENTFILE} ] &&
+               [ "`date +%Y%m%d -r ${CURRENTFILE}`" = "${CURRENTDIR}${DATE}" ] &&
+               mv -f ${CURRENTFILE} ${CURRENTDIR}/${CURRENTFILE}
+       touch ${CURRENTDIR}/${CURRENTFILE}
+       # Remove the "compatibility" link and recreate it to point to
+       # the (new) current file
+       rm -f ${CURRENTFILE}
+       ln -s ${CURRENTDIR}/${CURRENTFILE} ${CURRENTFILE}
+fi
+umask 0022
+ENDIR=@SA_LIB_DIR@
+cd ${ENDIR}
+[ "$1" = "--boot" ] && shift && BOOT=y || BOOT=n
+if [ $# = 0 ] && [ "${BOOT}" = "n" ]
+then
+# Note: Stats are written at the end of previous file *and* at the
+# beginning of the new one (when there is a file rotation) only if
+# outfile has been specified as '-' on the command line...
+       exec ${ENDIR}/sadc -F -L 1 1 -
+else
+       exec ${ENDIR}/sadc -F -L $* -
+fi
+
diff --git a/sa2.in b/sa2.in
new file mode 100644 (file)
index 0000000..c6ff59d
--- /dev/null
+++ b/sa2.in
@@ -0,0 +1,63 @@
+#!/bin/sh
+# @SA_LIB_DIR@/sa2
+# (C) 1999-2009 Sebastien Godard (sysstat <at> orange.fr)
+#
+#@(#) @PACKAGE_NAME@-@PACKAGE_VERSION@
+#@(#) sa2: Write a daily report
+#
+S_TIME_FORMAT=ISO ; export S_TIME_FORMAT
+umask 0022
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+# Add a trailing slash so that 'find' can go through this directory if it's a symlink
+DDIR=@SA_DIR@/
+SYSCONFIG_DIR=@SYSCONFIG_DIR@
+YESTERDAY=@YESTERDAY@
+DATE=`date ${YESTERDAY} +%d`
+CURRENTFILE=sa${DATE}
+CURRENTRPT=sar${DATE}
+HISTORY=@HISTORY@
+COMPRESSAFTER=@COMPRESSAFTER@
+ZIP="@ZIP@"
+[ -r ${SYSCONFIG_DIR}/sysstat ] && . ${SYSCONFIG_DIR}/sysstat
+if [ ${HISTORY} -gt 28 ]
+then
+       CURRENTDIR=`date ${YESTERDAY} +%Y%m`
+       cd ${DDIR} || exit 1
+       [ -d ${CURRENTDIR} ] || mkdir -p ${CURRENTDIR}
+       # Check if ${CURRENTFILE} is the correct file created at ${DATE}
+       # Note: using `-ge' instead of `=' since the file could have
+       # the next day time stamp because of the file rotating feature of sadc
+       [ -f ${CURRENTFILE} ] &&
+               [ "`date +%Y%m%d -r ${CURRENTFILE}`" -ge "${CURRENTDIR}${DATE}" ] || exit 0
+       # If the file is a regular file, then move it to ${CURRENTDIR}
+       [ ! -L ${CURRENTFILE} ] &&
+               mv -f ${CURRENTFILE} ${CURRENTDIR}/${CURRENTFILE} &&
+                       ln -s ${CURRENTDIR}/${CURRENTFILE} ${CURRENTFILE}
+       touch ${CURRENTDIR}/${CURRENTRPT}
+       # Remove the "compatibility" link and recreate it to point to
+       # the (new) current file
+       rm -f ${CURRENTRPT}
+       ln -s ${CURRENTDIR}/${CURRENTRPT} ${CURRENTRPT}
+       CURRENTDIR=${DDIR}/${CURRENTDIR}
+else
+       CURRENTDIR=${DDIR}
+fi
+RPT=${CURRENTDIR}/${CURRENTRPT}
+ENDIR=@bindir@
+DFILE=${CURRENTDIR}/${CURRENTFILE}
+[ -f "$DFILE" ] || exit 0
+cd ${ENDIR}
+[ -L ${RPT} ] && rm -f ${RPT}
+${ENDIR}/sar $* -f ${DFILE} > ${RPT}
+find ${DDIR} \( -name 'sar??' -o -name 'sa??' -o -name 'sar??.gz' -o -name 'sa??.gz' -o -name 'sar??.bz2' -o -name 'sa??.bz2' \) \
+       -mtime +"${HISTORY}" -exec rm -f {} \;
+find ${DDIR} \( -name 'sar??' -o -name 'sa??' \) -type f -mtime +"${COMPRESSAFTER}" \
+       -exec ${ZIP} {} \; > /dev/null 2>&1
+# Remove broken links
+for f in `find ${DDIR} \( -name 'sar??' -o -name 'sa??' \) -type l`; do
+       [ -e $f ] || rm -f $f
+done
+cd ${DDIR}
+rmdir [0-9]????? > /dev/null 2>&1
+
diff --git a/sa_common.c b/sa_common.c
new file mode 100644 (file)
index 0000000..7d1bea6
--- /dev/null
@@ -0,0 +1,1538 @@
+/*
+ * sar and sadf common routines.
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <errno.h>
+#include <unistd.h>    /* For STDOUT_FILENO, among others */
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#include "sa.h"
+#include "common.h"
+#include "ioconf.h"
+#include "rd_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+extern struct act_bitmap cpu_bitmap;
+
+/*
+ ***************************************************************************
+ * Init a bitmap (CPU, IRQ, etc.).
+ *
+ * IN:
+ * @value      Value used to init bitmap.
+ * @sz         Size of the bitmap in bytes.
+ *
+ * OUT:
+ * @bitmap     Bitmap initialized.
+ ***************************************************************************
+ */
+void set_bitmap(unsigned char bitmap[], unsigned char value, unsigned int sz)
+{
+       register int i;
+
+       for (i = 0; i < sz; i++) {
+               bitmap[i] = value;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Allocate structures.
+ *
+ * IN:
+ * @act        Array of activities.
+ ***************************************************************************
+ */
+void allocate_structures(struct activity *act[])
+{
+       int i, j;
+
+       for (i = 0; i < NR_ACT; i++) {
+               if (act[i]->nr > 0) {
+                       for (j = 0; j < 3; j++) {
+                               SREALLOC(act[i]->buf[j], void, act[i]->msize * act[i]->nr);
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free structures.
+ *
+ * IN:
+ * @act        Array of activities.
+ ***************************************************************************
+ */
+void free_structures(struct activity *act[])
+{
+       int i, j;
+
+       for (i = 0; i < NR_ACT; i++) {
+               if (act[i]->nr > 0) {
+                       for (j = 0; j < 3; j++) {
+                               if (act[i]->buf[j]) {
+                                       free(act[i]->buf[j]);
+                                       act[i]->buf[j] = NULL;
+                               }
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Get device real name if possible.
+ * Warning: This routine may return a bad name on 2.4 kernels where
+ * disk activities are read from /proc/stat.
+ *
+ * IN:
+ * @major      Major number of the device.
+ * @minor      Minor number of the device.
+ * @pretty     TRUE if the real name of the device (as it appears in /dev)
+ *             should be returned.
+ *
+ * RETURNS:
+ * The name of the device, which may be the real name (as it appears in /dev)
+ * or a string with the following format devM-n.
+ ***************************************************************************
+ */
+char *get_devname(unsigned int major, unsigned int minor, int pretty)
+{
+       static char buf[32];
+       char *name;
+
+       snprintf(buf, 32, "dev%d-%d", major, minor);
+
+       if (!pretty)
+               return (buf);
+
+       name = ioc_name(major, minor);
+       if ((name == NULL) || !strcmp(name, K_NODEV))
+               return (buf);
+
+       return (name);
+}
+
+/*
+ ***************************************************************************
+ * Check if we are close enough to desired interval.
+ *
+ * IN:
+ * @uptime_ref Uptime used as reference. This is the system uptime for the
+ *             first sample statistics, or the first system uptime after a
+ *             LINUX RESTART.
+ * @uptime     Current system uptime.
+ * @reset      TRUE if @last_uptime should be reset with @uptime_ref.
+ * @interval   Interval of time.
+ *
+ * RETURNS:
+ * 1 if we are actually close enough to desired interval, 0 otherwise.
+ ***************************************************************************
+*/
+int next_slice(unsigned long long uptime_ref, unsigned long long uptime,
+              int reset, long interval)
+{
+       unsigned long file_interval, entry;
+       static unsigned long long last_uptime = 0;
+       int min, max, pt1, pt2;
+       double f;
+
+       /* uptime is expressed in jiffies (basis of 1 processor) */
+       if (!last_uptime || reset) {
+               last_uptime = uptime_ref;
+       }
+
+       /* Interval cannot be greater than 0xffffffff here */
+       f = ((double) ((uptime - last_uptime) & 0xffffffff)) / HZ;
+       file_interval = (unsigned long) f;
+       if ((f * 10) - (file_interval * 10) >= 5) {
+               file_interval++; /* Rounding to correct value */
+       }
+
+       last_uptime = uptime;
+
+       /*
+        * A few notes about the "algorithm" used here to display selected entries
+        * from the system activity file (option -f with -i flag):
+        * Let 'Iu' be the interval value given by the user on the command line,
+        *     'If' the interval between current and previous line in the system
+        * activity file,
+        * and 'En' the nth entry (identified by its time stamp) of the file.
+        * We choose In = [ En - If/2, En + If/2 [ if If is even,
+        *        or In = [ En - If/2, En + If/2 ] if not.
+        * En will be displayed if
+        *       (Pn * Iu) or (P'n * Iu) belongs to In
+        * with  Pn = En / Iu and P'n = En / Iu + 1
+        */
+       f = ((double) ((uptime - uptime_ref) & 0xffffffff)) / HZ;
+       entry = (unsigned long) f;
+       if ((f * 10) - (entry * 10) >= 5) {
+               entry++;
+       }
+
+       min = entry - (file_interval / 2);
+       max = entry + (file_interval / 2) + (file_interval & 0x1);
+       pt1 = (entry / interval) * interval;
+       pt2 = ((entry / interval) + 1) * interval;
+
+       return (((pt1 >= min) && (pt1 < max)) || ((pt2 >= min) && (pt2 < max)));
+}
+
+/*
+ ***************************************************************************
+ * Use time stamp to fill tstamp structure.
+ *
+ * IN:
+ * @timestamp  Timestamp to decode (format: HH:MM:SS).
+ *
+ * OUT:
+ * @tse                Structure containing the decoded timestamp.
+ *
+ * RETURNS:
+ * 0 if the timestamp has been successfully decoded, 1 otherwise.
+ ***************************************************************************
+ */
+int decode_timestamp(char timestamp[], struct tstamp *tse)
+{
+       timestamp[2] = timestamp[5] = '\0';
+       tse->tm_sec  = atoi(&timestamp[6]);
+       tse->tm_min  = atoi(&timestamp[3]);
+       tse->tm_hour = atoi(timestamp);
+
+       if ((tse->tm_sec < 0) || (tse->tm_sec > 59) ||
+           (tse->tm_min < 0) || (tse->tm_min > 59) ||
+           (tse->tm_hour < 0) || (tse->tm_hour > 23))
+               return 1;
+
+       tse->use = TRUE;
+
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Compare two timestamps.
+ *
+ * IN:
+ * @rectime    Date and time for current sample.
+ * @tse                Timestamp used as reference.
+ *
+ * RETURNS:
+ * A positive value if @rectime is greater than @tse,
+ * a negative one otherwise.
+ ***************************************************************************
+ */
+int datecmp(struct tm *rectime, struct tstamp *tse)
+{
+       if (rectime->tm_hour == tse->tm_hour) {
+               if (rectime->tm_min == tse->tm_min)
+                       return (rectime->tm_sec - tse->tm_sec);
+               else
+                       return (rectime->tm_min - tse->tm_min);
+       }
+       else
+               return (rectime->tm_hour - tse->tm_hour);
+}
+
+/*
+ ***************************************************************************
+ * Parse a time stamp entered on the command line (hh:mm:ss) and decode it.
+ *
+ * IN:
+ * @argv               Arguments list.
+ * @opt                        Index in the arguments list.
+ * @def_timestamp      Default timestamp to use.
+ *
+ * OUT:
+ * @tse                        Structure containing the decoded timestamp.
+ *
+ * RETURNS:
+ * 0 if the timestamp has been successfully decoded, 1 otherwise.
+ ***************************************************************************
+ */
+int parse_timestamp(char *argv[], int *opt, struct tstamp *tse,
+                   const char *def_timestamp)
+{
+       char timestamp[9];
+
+       if ((argv[++(*opt)]) && (strlen(argv[*opt]) == 8)) {
+               strcpy(timestamp, argv[(*opt)++]);
+       }
+       else {
+               strcpy(timestamp, def_timestamp);
+       }
+
+       return decode_timestamp(timestamp, tse);
+}
+
+/*
+ ***************************************************************************
+ * Set current daily data file name.
+ *
+ * OUT:
+ * @rectime    Current date and time.
+ * @datafile   Name of daily data file.
+ ***************************************************************************
+ */
+void set_default_file(struct tm *rectime, char *datafile)
+{
+       get_time(rectime);
+       snprintf(datafile, MAX_FILE_LEN,
+                "%s/sa%02d", SA_DIR, rectime->tm_mday);
+       datafile[MAX_FILE_LEN - 1] = '\0';
+}
+
+/*
+ ***************************************************************************
+ * Set interval value.
+ *
+ * IN:
+ * @record_hdr_curr    Record with current sample statistics.
+ * @record_hdr_prev    Record with previous sample statistics.
+ * @nr_proc            Number of CPU, including CPU "all".
+ *
+ * OUT:
+ * @itv                        Interval in jiffies.
+ * @g_itv              Interval in jiffies multiplied by the # of proc.
+ ***************************************************************************
+ */
+void get_itv_value(struct record_header *record_hdr_curr,
+                  struct record_header *record_hdr_prev,
+                  unsigned int nr_proc,
+                  unsigned long long *itv, unsigned long long *g_itv)
+{
+       /* Interval value in jiffies */
+       *g_itv = get_interval(record_hdr_prev->uptime,
+                             record_hdr_curr->uptime);
+
+       if (nr_proc > 2) {
+               *itv = get_interval(record_hdr_prev->uptime0,
+                                   record_hdr_curr->uptime0);
+       }
+       else {
+               *itv = *g_itv;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Fill the rectime structure with the file's creation date, based on file's
+ * time data saved in file header.
+ * The resulting timestamp is expressed in the locale of the file creator or
+ * in the user's own locale, depending on whether option -t has been used
+ * or not.
+ *
+ * IN:
+ * @flags      Flags for common options and system state.
+ * @file_hdr   System activity file standard header.
+ *
+ * OUT:
+ * @rectime    Date and time from file header.
+ ***************************************************************************
+ */
+void get_file_timestamp_struct(unsigned int flags, struct tm *rectime,
+                              struct file_header *file_hdr)
+{
+       struct tm *loc_t;
+
+       if (PRINT_TRUE_TIME(flags)) {
+               /* Get local time. This is just to fill HH:MM:SS fields */
+               get_time(rectime);
+
+               rectime->tm_mday = file_hdr->sa_day;
+               rectime->tm_mon  = file_hdr->sa_month;
+               rectime->tm_year = file_hdr->sa_year;
+               /*
+                * Call mktime() to set DST (Daylight Saving Time) flag.
+                * Has anyone a better way to do it?
+                */
+               rectime->tm_hour = rectime->tm_min = rectime->tm_sec = 0;
+               mktime(rectime);
+       }
+       else {
+               loc_t = localtime((const time_t *) &file_hdr->sa_ust_time);
+               *rectime = *loc_t;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Print report header.
+ *
+ * IN:
+ * @flags      Flags for common options and system state.
+ * @file_hdr   System activity file standard header.
+ * @cpu_nr     Number of CPU (value in [1, NR_CPUS + 1]).
+ *             1 means that there is only one proc and non SMP kernel.
+ *             2 means one proc and SMP kernel.
+ *             Etc.
+ *
+ * OUT:
+ * @rectime    Date and time from file header.
+ ***************************************************************************
+ */
+void print_report_hdr(unsigned int flags, struct tm *rectime,
+                     struct file_header *file_hdr, int cpu_nr)
+{
+
+       /* Get date of file creation */
+       get_file_timestamp_struct(flags, rectime, file_hdr);
+
+       /* Display the header */
+       print_gal_header(rectime, file_hdr->sa_sysname, file_hdr->sa_release,
+                        file_hdr->sa_nodename, file_hdr->sa_machine,
+                        cpu_nr > 1 ? cpu_nr - 1 : 1);
+}
+
+/*
+ ***************************************************************************
+ * Network interfaces may now be registered (and unregistered) dynamically.
+ * This is what we try to guess here.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @ref                Index in array for sample statistics used as reference.
+ * @pos                Index on current network interface.
+ *
+ * RETURNS:
+ * Position of current network interface in array of sample statistics used
+ * as reference.
+ ***************************************************************************
+ */
+unsigned int check_net_dev_reg(struct activity *a, int curr, int ref,
+                              unsigned int pos)
+{
+       struct stats_net_dev *sndc, *sndp;
+       unsigned int index = 0;
+
+       sndc = (struct stats_net_dev *) a->buf[curr] + pos;
+
+       while (index < a->nr) {
+               sndp = (struct stats_net_dev *) a->buf[ref] + index;
+               if (!strcmp(sndc->interface, sndp->interface)) {
+                       /*
+                        * Network interface found.
+                        * If a counter has decreased, then we may assume that the
+                        * corresponding interface was unregistered, then registered again.
+                        */
+                       if ((sndc->rx_packets    < sndp->rx_packets)    ||
+                           (sndc->tx_packets    < sndp->tx_packets)    ||
+                           (sndc->rx_bytes      < sndp->rx_bytes)      ||
+                           (sndc->tx_bytes      < sndp->tx_bytes)      ||
+                           (sndc->rx_compressed < sndp->rx_compressed) ||
+                           (sndc->tx_compressed < sndp->tx_compressed) ||
+                           (sndc->multicast     < sndp->multicast)) {
+
+                               /*
+                                * Special processing for rx_bytes (_packets) and
+                                * tx_bytes (_packets) counters: If the number of
+                                * bytes (packets) has decreased, whereas the number of
+                                * packets (bytes) has increased, then assume that the
+                                * relevant counter has met an overflow condition, and that
+                                * the interface was not unregistered, which is all the
+                                * more plausible that the previous value for the counter
+                                * was > ULONG_MAX/2.
+                                * NB: the average value displayed will be wrong in this case...
+                                *
+                                * If such an overflow is detected, just set the flag. There is no
+                                * need to handle this in a special way: the difference is still
+                                * properly calculated if the result is of the same type (i.e.
+                                * unsigned long) as the two values.
+                                */
+                               int ovfw = FALSE;
+
+                               if ((sndc->rx_bytes   < sndp->rx_bytes)   &&
+                                   (sndc->rx_packets > sndp->rx_packets) &&
+                                   (sndp->rx_bytes   > (~0UL >> 1))) {
+                                       ovfw = TRUE;
+                               }
+                               if ((sndc->tx_bytes   < sndp->tx_bytes)   &&
+                                   (sndc->tx_packets > sndp->tx_packets) &&
+                                   (sndp->tx_bytes   > (~0UL >> 1))) {
+                                       ovfw = TRUE;
+                               }
+                               if ((sndc->rx_packets < sndp->rx_packets) &&
+                                   (sndc->rx_bytes   > sndp->rx_bytes)   &&
+                                   (sndp->rx_packets > (~0UL >> 1))) {
+                                       ovfw = TRUE;
+                               }
+                               if ((sndc->tx_packets < sndp->tx_packets) &&
+                                   (sndc->tx_bytes   > sndp->tx_bytes)   &&
+                                   (sndp->tx_packets > (~0UL >> 1))) {
+                                       ovfw = TRUE;
+                               }
+
+                               if (!ovfw) {
+                                       /*
+                                        * OK: assume here that the device was
+                                        * actually unregistered.
+                                        */
+                                       memset(sndp, 0, STATS_NET_DEV_SIZE);
+                                       strcpy(sndp->interface, sndc->interface);
+                               }
+                       }
+                       return index;
+               }
+               index++;
+       }
+
+       /* Network interface not found: Look for the first free structure */
+       for (index = 0; index < a->nr; index++) {
+               sndp = (struct stats_net_dev *) a->buf[ref] + index;
+               if (!strcmp(sndp->interface, "?")) {
+                       memset(sndp, 0, STATS_NET_DEV_SIZE);
+                       strcpy(sndp->interface, sndc->interface);
+                       break;
+               }
+       }
+       if (index >= a->nr) {
+               /* No free structure: Default is structure of same rank */
+               index = pos;
+       }
+
+       sndp = (struct stats_net_dev *) a->buf[ref] + index;
+       /* Since the name is not the same, reset all the structure */
+       memset(sndp, 0, STATS_NET_DEV_SIZE);
+       strcpy(sndp->interface, sndc->interface);
+
+       return  index;
+}
+
+/*
+ ***************************************************************************
+ * Network interfaces may now be registered (and unregistered) dynamically.
+ * This is what we try to guess here.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @ref                Index in array for sample statistics used as reference.
+ * @pos                Index on current network interface.
+ *
+ * RETURNS:
+ * Position of current network interface in array of sample statistics used
+ * as reference.
+ ***************************************************************************
+ */
+unsigned int check_net_edev_reg(struct activity *a, int curr, int ref,
+                               unsigned int pos)
+{
+       struct stats_net_edev *snedc, *snedp;
+       unsigned int index = 0;
+
+       snedc = (struct stats_net_edev *) a->buf[curr] + pos;
+
+       while (index < a->nr) {
+               snedp = (struct stats_net_edev *) a->buf[ref] + index;
+               if (!strcmp(snedc->interface, snedp->interface)) {
+                       /*
+                        * Network interface found.
+                        * If a counter has decreased, then we may assume that the
+                        * corresponding interface was unregistered, then registered again.
+                        */
+                       if ((snedc->tx_errors         < snedp->tx_errors)         ||
+                           (snedc->collisions        < snedp->collisions)        ||
+                           (snedc->rx_dropped        < snedp->rx_dropped)        ||
+                           (snedc->tx_dropped        < snedp->tx_dropped)        ||
+                           (snedc->tx_carrier_errors < snedp->tx_carrier_errors) ||
+                           (snedc->rx_frame_errors   < snedp->rx_frame_errors)   ||
+                           (snedc->rx_fifo_errors    < snedp->rx_fifo_errors)    ||
+                           (snedc->tx_fifo_errors    < snedp->tx_fifo_errors)) {
+
+                               /*
+                                * OK: assume here that the device was
+                                * actually unregistered.
+                                */
+                               memset(snedp, 0, STATS_NET_EDEV_SIZE);
+                               strcpy(snedp->interface, snedc->interface);
+                       }
+                       return index;
+               }
+               index++;
+       }
+
+       /* Network interface not found: Look for the first free structure */
+       for (index = 0; index < a->nr; index++) {
+               snedp = (struct stats_net_edev *) a->buf[ref] + index;
+               if (!strcmp(snedp->interface, "?")) {
+                       memset(snedp, 0, STATS_NET_EDEV_SIZE);
+                       strcpy(snedp->interface, snedc->interface);
+                       break;
+               }
+       }
+       if (index >= a->nr) {
+               /* No free structure: Default is structure of same rank */
+               index = pos;
+       }
+
+       snedp = (struct stats_net_edev *) a->buf[ref] + index;
+       /* Since the name is not the same, reset all the structure */
+       memset(snedp, 0, STATS_NET_EDEV_SIZE);
+       strcpy(snedp->interface, snedc->interface);
+
+       return  index;
+}
+
+/*
+ ***************************************************************************
+ * Disks may be registered dynamically (true in /proc/stat file).
+ * This is what we try to guess here.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @ref                Index in array for sample statistics used as reference.
+ * @pos                Index on current disk.
+ *
+ * RETURNS:
+ * Position of current disk in array of sample statistics used as reference.
+ ***************************************************************************
+ */
+int check_disk_reg(struct activity *a, int curr, int ref, int pos)
+{
+       struct stats_disk *sdc, *sdp;
+       int index = 0;
+
+       sdc = (struct stats_disk *) a->buf[curr] + pos;
+
+       while (index < a->nr) {
+               sdp = (struct stats_disk *) a->buf[ref] + index;
+               if ((sdc->major == sdp->major) &&
+                   (sdc->minor == sdp->minor)) {
+                       /*
+                        * Disk found.
+                        * If all the counters have decreased then the likelyhood
+                        * is that the disk has been unregistered and a new disk inserted.
+                        * If only one or two have decreased then the likelyhood
+                        * is that the counter has simply wrapped.
+                        */
+                       if ((sdc->nr_ios < sdp->nr_ios) &&
+                           (sdc->rd_sect < sdp->rd_sect) &&
+                           (sdc->wr_sect < sdp->wr_sect)) {
+
+                               memset(sdp, 0, STATS_DISK_SIZE);
+                               sdp->major = sdc->major;
+                               sdp->minor = sdc->minor;
+                       }
+                       return index;
+               }
+               index++;
+       }
+
+       /* Disk not found: Look for the first free structure */
+       for (index = 0; index < a->nr; index++) {
+               sdp = (struct stats_disk *) a->buf[ref] + index;
+               if (!(sdp->major + sdp->minor)) {
+                       memset(sdp, 0, STATS_DISK_SIZE);
+                       sdp->major = sdc->major;
+                       sdp->minor = sdc->minor;
+                       break;
+               }
+       }
+       if (index >= a->nr) {
+               /* No free structure found: Default is structure of same rank */
+               index = pos;
+       }
+
+       sdp = (struct stats_disk *) a->buf[ref] + index;
+       /* Since the device is not the same, reset all the structure */
+       memset(sdp, 0, STATS_DISK_SIZE);
+       sdp->major = sdc->major;
+       sdp->minor = sdc->minor;
+
+       return index;
+}
+
+/*
+ ***************************************************************************
+ * Allocate bitmaps for activities that have one.
+ *
+ * IN:
+ * @act                Array of activities.
+ ***************************************************************************
+ */
+void allocate_bitmaps(struct activity *act[])
+{
+       int i;
+
+       for (i = 0; i < NR_ACT; i++) {
+               /*
+                * If current activity has a bitmap which has not already
+                * been allocated, then allocate it.
+                * Note that a same bitmap may be used by several activities.
+                */
+               if (act[i]->bitmap && !act[i]->bitmap->b_array) {
+                       SREALLOC(act[i]->bitmap->b_array, unsigned char,
+                                BITMAP_SIZE(act[i]->bitmap->b_size));
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free bitmaps for activities that have one.
+ *
+ * IN:
+ * @act                Array of activities.
+ ***************************************************************************
+ */
+void free_bitmaps(struct activity *act[])
+{
+       int i;
+
+       for (i = 0; i < NR_ACT; i++) {
+               if (act[i]->bitmap && act[i]->bitmap->b_array) {
+                       free(act[i]->bitmap->b_array);
+                       /* Set pointer to NULL to prevent it from being freed again */
+                       act[i]->bitmap->b_array = NULL;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Look for activity in array.
+ *
+ * IN:
+ * @act                Array of activities.
+ * @act_flag   Activity flag to look for.
+ *
+ * RETURNS:
+ * Position of activity in array, or -1 if not found (this may happen when
+ * reading data from a system activity file created by another version of
+ * sysstat).
+ ***************************************************************************
+ */
+int get_activity_position(struct activity *act[], unsigned int act_flag)
+{
+       int i;
+
+       for (i = 0; i < NR_ACT; i++) {
+               if (act[i]->id == act_flag)
+                       break;
+       }
+
+       if (i == NR_ACT)
+               return -1;
+
+       return i;
+}
+
+/*
+ ***************************************************************************
+ * Count number of activities with given option.
+ *
+ * IN:
+ * @act                        Array of activities.
+ * @option             Option that activities should have to be counted
+ *                     (eg. AO_COLLECTED...)
+ * @count_outputs      TRUE if each output should be counted for activities with
+ *                     multiple outputs.
+ *
+ * RETURNS:
+ * Number of selected activities
+ ***************************************************************************
+ */
+int get_activity_nr(struct activity *act[], unsigned int option, int count_outputs)
+{
+       int i, n = 0;
+       unsigned int msk;
+
+       for (i = 0; i < NR_ACT; i++) {
+               if ((act[i]->options & option) == option) {
+
+                       if (HAS_MULTIPLE_OUTPUTS(act[i]->options) && count_outputs) {
+                               for (msk = 1; msk < 0x10; msk <<= 1) {
+                                       if (act[i]->opt_flags & msk) {
+                                               n++;
+                                       }
+                               }
+                       }
+                       else {
+                               n++;
+                       }
+               }
+       }
+
+       return n;
+}
+
+/*
+ ***************************************************************************
+ * Select all activities, even if they have no associated items.
+ *
+ * IN:
+ * @act                Array of activities.
+ ***************************************************************************
+ */
+void select_all_activities(struct activity *act[])
+{
+       int i;
+
+       for (i = 0; i < NR_ACT; i++) {
+               act[i]->options |= AO_SELECTED;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Select CPU activity if no other activities have been explicitly selected.
+ * Also select CPU "all" if no other CPU has been selected.
+ *
+ * IN:
+ * @act        Array of activities.
+ *
+ * OUT:
+ * @act        Array of activities with CPU activity selected if needed.
+ ***************************************************************************
+ */
+void select_default_activity(struct activity *act[])
+{
+       int p;
+
+       p = get_activity_position(act, A_CPU);
+
+       /* Default is CPU activity... */
+       if (!get_activity_nr(act, AO_SELECTED, COUNT_ACTIVITIES)) {
+               /*
+                * Still OK even when reading stats from a file
+                * since A_CPU activity is always recorded.
+                */
+               act[p]->options |= AO_SELECTED;
+       }
+
+       /*
+        * If no CPU's have been selected then select CPU "all".
+        * cpu_bitmap bitmap may be used by several activities (A_CPU, A_PWR_CPUFREQ...)
+        */
+       if (!count_bits(cpu_bitmap.b_array, BITMAP_SIZE(cpu_bitmap.b_size))) {
+               cpu_bitmap.b_array[0] |= 0x01;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read data from a system activity data file.
+ *
+ * IN:
+ * @ifd                Input file descriptor.
+ * @buffer     Buffer where data are read.
+ * @size       Number of bytes to read.
+ * @mode       If set to HARD_SIZE, indicate that an EOF should be considered
+ *             as an error.
+ *
+ * RETURNS:
+ * 1 if EOF has been reached, 0 otherwise.
+ ***************************************************************************
+ */
+int sa_fread(int ifd, void *buffer, int size, int mode)
+{
+       int n;
+
+       if ((n = read(ifd, buffer, size)) < 0) {
+               fprintf(stderr, _("Error while reading system activity file: %s\n"),
+                       strerror(errno));
+               close(ifd);
+               exit(2);
+       }
+
+       if (!n && (mode == SOFT_SIZE))
+               return 1;       /* EOF */
+
+       if (n < size) {
+               fprintf(stderr, _("End of system activity file unexpected\n"));
+               close(ifd);
+               exit(2);
+       }
+
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Display sysstat version used to create system activity data file.
+ *
+ * IN:
+ * @file_magic File magic header
+ ***************************************************************************
+ */
+void display_sa_file_version(struct file_magic *file_magic)
+{
+       fprintf(stderr, _("File created using sar/sadc from sysstat version %d.%d.%d"),
+               file_magic->sysstat_version,
+               file_magic->sysstat_patchlevel,
+               file_magic->sysstat_sublevel);
+
+       if (file_magic->sysstat_extraversion) {
+               fprintf(stderr, ".%d", file_magic->sysstat_extraversion);
+       }
+       fprintf(stderr, "\n");
+}
+
+/*
+ ***************************************************************************
+ * An invalid system activity file has been opened for reading.
+ * If this file was created by an old version of sysstat, tell it to the
+ * user...
+ *
+ * IN:
+ * @fd         Descriptor of the file that has been opened.
+ * @file_magic file_magic structure filled with file magic header data.
+ *             May contain invalid data.
+ * @file       Name of the file being read.
+ * @n          Number of bytes read while reading file magic header.
+ *             This function may also be called after failing to read file
+ *             standard header, or if CPU activity has not been found in
+ *             file. In this case, n is set to 0.
+ ***************************************************************************
+ */
+void handle_invalid_sa_file(int *fd, struct file_magic *file_magic, char *file,
+                           int n)
+{
+       fprintf(stderr, _("Invalid system activity file: %s\n"), file);
+
+       if ((n == FILE_MAGIC_SIZE) && (file_magic->sysstat_magic == SYSSTAT_MAGIC)) {
+               /* This is a sysstat file, but this file has an old format */
+               display_sa_file_version(file_magic);
+
+               fprintf(stderr,
+                       _("Current sysstat version can no longer read the format of this file (%#x)\n"),
+                       file_magic->format_magic);
+       }
+
+       close (*fd);
+       exit(3);
+}
+
+/*
+ ***************************************************************************
+ * Move structures data.
+ *
+ * IN:
+ * @act                Array of activities.
+ * @id_seq     Activity sequence in file.
+ * @record_hdr Current record header.
+ * @dest       Index in array where stats have to be copied to.
+ * @src                Index in array where stats to copy are.
+ ***************************************************************************
+ */
+void copy_structures(struct activity *act[], unsigned int id_seq[],
+                    struct record_header record_hdr[], int dest, int src)
+{
+       int i, p;
+
+       memcpy(&record_hdr[dest], &record_hdr[src], RECORD_HEADER_SIZE);
+
+       for (i = 0; i < NR_ACT; i++) {
+
+               if (!id_seq[i])
+                       continue;
+
+               if (((p = get_activity_position(act, id_seq[i])) < 0) ||
+                   (act[p]->nr < 1)) {
+                       PANIC(1);
+               }
+
+               memcpy(act[p]->buf[dest], act[p]->buf[src], act[p]->msize * act[p]->nr);
+
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read varying part of the statistics from a daily data file.
+ *
+ * IN:
+ * @act                Array of activities.
+ * @curr       Index in array for current sample statistics.
+ * @ifd                Input file descriptor.
+ * @act_nr     Number of activities in file.
+ * @file_actlst        Activity list in file.
+ ***************************************************************************
+ */
+void read_file_stat_bunch(struct activity *act[], int curr, int ifd, int act_nr,
+                         struct file_activity *file_actlst)
+{
+       int i, j, p;
+       struct file_activity *fal = file_actlst;
+
+       for (i = 0; i < act_nr; i++, fal++) {
+
+               if ((p = get_activity_position(act, fal->id)) < 0) {
+                       /*
+                        * Ignore current activity in file, which is unknown to
+                        * current sysstat version.
+                        */
+                       if (lseek(ifd, fal->size * fal->nr, SEEK_CUR) < (fal->size * fal->nr)) {
+                               close(ifd);
+                               perror("lseek");
+                               exit(2);
+                       }
+               }
+               else if ((act[p]->nr > 1) && (act[p]->msize > act[p]->fsize)) {
+                       for (j = 0; j < act[p]->nr; j++) {
+                               sa_fread(ifd, (char *) act[p]->buf[curr] + j * act[p]->msize,
+                                        act[p]->fsize, HARD_SIZE);
+                       }
+               }
+               else if (act[p]->nr > 0) {
+                       sa_fread(ifd, act[p]->buf[curr], act[p]->fsize * act[p]->nr, HARD_SIZE);
+               }
+               else {
+                       PANIC(act[p]->nr);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Open a data file, and perform various checks before reading.
+ *
+ * IN:
+ * @dfile      Name of system activity data file
+ * @act                Array of activities.
+ * @ignore     Set to 1 if a true sysstat activity file but with a bad
+ *             format should not yield an error message. Useful with
+ *             sadf -H.
+ *
+ * OUT:
+ * @ifd                System activity data file descriptor
+ * @file_magic file_magic structure containing data read from file magic
+ *             header
+ * @file_hdr   file_hdr structure containing data read from file standard
+ *             header
+ * @file_actlst        Acvtivity list in file.
+ * @id_seq     Activity sequence.
+ ***************************************************************************
+ */
+void check_file_actlst(int *ifd, char *dfile, struct activity *act[],
+                      struct file_magic *file_magic, struct file_header *file_hdr,
+                      struct file_activity **file_actlst, unsigned int id_seq[],
+                      int ignore)
+{
+       int i, j, n, p;
+       unsigned int a_cpu = FALSE;
+       struct file_activity *fal;
+
+       /* Open sa data file */
+       if ((*ifd = open(dfile, O_RDONLY)) < 0) {
+               fprintf(stderr, _("Cannot open %s: %s\n"), dfile, strerror(errno));
+               exit(2);
+       }
+
+       /* Read file magic data */
+       n = read(*ifd, file_magic, FILE_MAGIC_SIZE);
+
+       if ((n != FILE_MAGIC_SIZE) ||
+           (file_magic->sysstat_magic != SYSSTAT_MAGIC) ||
+           (file_magic->format_magic != FORMAT_MAGIC)) {
+
+               if (ignore &&
+                   (n == FILE_MAGIC_SIZE) &&
+                   (file_magic->sysstat_magic == SYSSTAT_MAGIC))
+                       /* Don't display error message. This is for sadf -H */
+                       return;
+               else {
+                       /* Display error message and exit */
+                       handle_invalid_sa_file(ifd, file_magic, dfile, n);
+               }
+       }
+
+       /* Read sa data file standard header and allocate activity list */
+       sa_fread(*ifd, file_hdr, FILE_HEADER_SIZE, HARD_SIZE);
+
+       SREALLOC(*file_actlst, struct file_activity, FILE_ACTIVITY_SIZE * file_hdr->sa_nr_act);
+       fal = *file_actlst;
+
+       /* Read activity list */
+       j = 0;
+       for (i = 0; i < file_hdr->sa_nr_act; i++, fal++) {
+
+               sa_fread(*ifd, fal, FILE_ACTIVITY_SIZE, HARD_SIZE);
+
+               if (fal->nr < 1) {
+                       /*
+                        * Every activity, known or unknown,
+                        * should have at least one item.
+                        */
+                       handle_invalid_sa_file(ifd, file_magic, dfile, 0);
+               }
+
+               if (fal->id == A_CPU) {
+                       a_cpu = TRUE;
+               }
+
+               if ((p = get_activity_position(act, fal->id)) >= 0) {
+                       if (fal->size > act[p]->msize) {
+                               act[p]->msize = fal->size;
+                       }
+                       act[p]->fsize = fal->size;
+                       act[p]->nr    = fal->nr;
+                       id_seq[j++]   = fal->id;
+               }
+       }
+
+       if (!a_cpu) {
+               /* CPU activity should always be in file */
+               handle_invalid_sa_file(ifd, file_magic, dfile, 0);
+       }
+
+       while (j < NR_ACT) {
+               id_seq[j++] = 0;
+       }
+
+       /* Check that at least one selected activity is available in file */
+       for (i = 0; i < NR_ACT; i++) {
+
+               if (!IS_SELECTED(act[i]->options))
+                       continue;
+
+               /* Here is a selected activity: Does it exist in file? */
+               fal = *file_actlst;
+               for (j = 0; j < file_hdr->sa_nr_act; j++, fal++) {
+                       if (act[i]->id == fal->id)
+                               break;
+               }
+               if (j == file_hdr->sa_nr_act) {
+                       /* No: Unselect it */
+                       act[i]->options &= ~AO_SELECTED;
+               }
+       }
+       if (!get_activity_nr(act, AO_SELECTED, COUNT_ACTIVITIES)) {
+               fprintf(stderr, _("Requested activities not available in file %s\n"),
+                       dfile);
+               close(*ifd);
+               exit(1);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Parse sar activities options (also used by sadf).
+ *
+ * IN:
+ * @argv       Arguments list.
+ * @opt                Index in list of arguments.
+ * @caller     Indicate whether it's sar or sadf that called this function.
+ *
+ * OUT:
+ * @act                Array of selected activities.
+ * @flags      Common flags and system state.
+ *
+ * RETURNS:
+ * 0 on success, 1 otherwise.
+ ***************************************************************************
+ */
+int parse_sar_opt(char *argv[], int *opt, struct activity *act[],
+                 unsigned int *flags, int caller)
+{
+       int i, p;
+
+       for (i = 1; *(argv[*opt] + i); i++) {
+
+               switch (*(argv[*opt] + i)) {
+
+               case 'A':
+                       select_all_activities(act);
+
+                       /* Force '-P ALL -I XALL' */
+                       *flags |= S_F_PER_PROC;
+
+                       p = get_activity_position(act, A_MEMORY);
+                       act[p]->opt_flags |= AO_F_MEM_AMT + AO_F_MEM_DIA + AO_F_MEM_SWAP;
+
+                       p = get_activity_position(act, A_IRQ);
+                       set_bitmap(act[p]->bitmap->b_array, ~0,
+                                  BITMAP_SIZE(act[p]->bitmap->b_size));
+
+                       p = get_activity_position(act, A_CPU);
+                       set_bitmap(act[p]->bitmap->b_array, ~0,
+                                  BITMAP_SIZE(act[p]->bitmap->b_size));
+                       act[p]->opt_flags = AO_F_CPU_ALL;
+                       break;
+
+               case 'B':
+                       SELECT_ACTIVITY(A_PAGE);
+                       break;
+
+               case 'b':
+                       SELECT_ACTIVITY(A_IO);
+                       break;
+
+               case 'C':
+                       *flags |= S_F_COMMENT;
+                       break;
+
+               case 'd':
+                       SELECT_ACTIVITY(A_DISK);
+                       break;
+
+               case 'p':
+                       *flags |= S_F_DEV_PRETTY;
+                       break;
+
+               case 'q':
+                       SELECT_ACTIVITY(A_QUEUE);
+                       break;
+
+               case 'r':
+                       p = get_activity_position(act, A_MEMORY);
+                       act[p]->options   |= AO_SELECTED;
+                       act[p]->opt_flags |= AO_F_MEM_AMT;
+                       break;
+
+               case 'R':
+                       p = get_activity_position(act, A_MEMORY);
+                       act[p]->options   |= AO_SELECTED;
+                       act[p]->opt_flags |= AO_F_MEM_DIA;
+                       break;
+
+               case 'S':
+                       p = get_activity_position(act, A_MEMORY);
+                       act[p]->options   |= AO_SELECTED;
+                       act[p]->opt_flags |= AO_F_MEM_SWAP;
+                       break;
+
+               case 't':
+                       if (caller == C_SAR) {
+                               *flags |= S_F_TRUE_TIME;
+                       }
+                       else
+                               return 1;
+                       break;
+
+               case 'u':
+                       p = get_activity_position(act, A_CPU);
+                       act[p]->options |= AO_SELECTED;
+                       if (!*(argv[*opt] + i + 1) && argv[*opt + 1] && !strcmp(argv[*opt + 1], K_ALL)) {
+                               (*opt)++;
+                               act[p]->opt_flags = AO_F_CPU_ALL;
+                               return 0;
+                       }
+                       else {
+                               act[p]->opt_flags = AO_F_CPU_DEF;
+                       }
+                       break;
+
+               case 'v':
+                       SELECT_ACTIVITY(A_KTABLES);
+                       break;
+
+               case 'w':
+                       SELECT_ACTIVITY(A_PCSW);
+                       break;
+
+               case 'W':
+                       SELECT_ACTIVITY(A_SWAP);
+                       break;
+
+               case 'y':
+                       SELECT_ACTIVITY(A_SERIAL);
+                       break;
+
+               case 'V':
+                       print_version();
+                       break;
+
+               default:
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Parse sar "-m" option.
+ *
+ * IN:
+ * @argv       Arguments list.
+ * @opt                Index in list of arguments.
+ *
+ * OUT:
+ * @act                Array of selected activities.
+ *
+ * RETURNS:
+ * 0 on success, 1 otherwise.
+ ***************************************************************************
+ */
+int parse_sar_m_opt(char *argv[], int *opt, struct activity *act[])
+{
+       char *t;
+
+       for (t = strtok(argv[*opt], ","); t; t = strtok(NULL, ",")) {
+               if (!strcmp(t, K_CPU)) {
+                       SELECT_ACTIVITY(A_PWR_CPUFREQ);
+               }
+               else if (!strcmp(t, K_FAN)) {
+                       SELECT_ACTIVITY(A_PWR_FAN);
+               }
+               else if (!strcmp(t, K_IN)) {
+                       SELECT_ACTIVITY(A_PWR_IN);
+               }
+               else if (!strcmp(t, K_TEMP)) {
+                       SELECT_ACTIVITY(A_PWR_TEMP);
+               }
+               else if (!strcmp(t, K_ALL)) {
+                       SELECT_ACTIVITY(A_PWR_CPUFREQ);
+                       SELECT_ACTIVITY(A_PWR_FAN);
+                       SELECT_ACTIVITY(A_PWR_IN);
+                       SELECT_ACTIVITY(A_PWR_TEMP);
+               }
+               else
+                       return 1;
+       }
+
+       (*opt)++;
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Parse sar "-n" option.
+ *
+ * IN:
+ * @argv       Arguments list.
+ * @opt                Index in list of arguments.
+ *
+ * OUT:
+ * @act                Array of selected activities.
+ *
+ * RETURNS:
+ * 0 on success, 1 otherwise.
+ ***************************************************************************
+ */
+int parse_sar_n_opt(char *argv[], int *opt, struct activity *act[])
+{
+       char *t;
+
+       for (t = strtok(argv[*opt], ","); t; t = strtok(NULL, ",")) {
+               if (!strcmp(t, K_DEV)) {
+                       SELECT_ACTIVITY(A_NET_DEV);
+               }
+               else if (!strcmp(t, K_EDEV)) {
+                       SELECT_ACTIVITY(A_NET_EDEV);
+               }
+               else if (!strcmp(t, K_SOCK)) {
+                       SELECT_ACTIVITY(A_NET_SOCK);
+               }
+               else if (!strcmp(t, K_NFS)) {
+                       SELECT_ACTIVITY(A_NET_NFS);
+               }
+               else if (!strcmp(t, K_NFSD)) {
+                       SELECT_ACTIVITY(A_NET_NFSD);
+               }
+               else if (!strcmp(t, K_IP)) {
+                       SELECT_ACTIVITY(A_NET_IP);
+               }
+               else if (!strcmp(t, K_EIP)) {
+                       SELECT_ACTIVITY(A_NET_EIP);
+               }
+               else if (!strcmp(t, K_ICMP)) {
+                       SELECT_ACTIVITY(A_NET_ICMP);
+               }
+               else if (!strcmp(t, K_EICMP)) {
+                       SELECT_ACTIVITY(A_NET_EICMP);
+               }
+               else if (!strcmp(t, K_TCP)) {
+                       SELECT_ACTIVITY(A_NET_TCP);
+               }
+               else if (!strcmp(t, K_ETCP)) {
+                       SELECT_ACTIVITY(A_NET_ETCP);
+               }
+               else if (!strcmp(t, K_UDP)) {
+                       SELECT_ACTIVITY(A_NET_UDP);
+               }
+               else if (!strcmp(t, K_SOCK6)) {
+                       SELECT_ACTIVITY(A_NET_SOCK6);
+               }
+               else if (!strcmp(t, K_IP6)) {
+                       SELECT_ACTIVITY(A_NET_IP6);
+               }
+               else if (!strcmp(t, K_EIP6)) {
+                       SELECT_ACTIVITY(A_NET_EIP6);
+               }
+               else if (!strcmp(t, K_ICMP6)) {
+                       SELECT_ACTIVITY(A_NET_ICMP6);
+               }
+               else if (!strcmp(t, K_EICMP6)) {
+                       SELECT_ACTIVITY(A_NET_EICMP6);
+               }
+               else if (!strcmp(t, K_UDP6)) {
+                       SELECT_ACTIVITY(A_NET_UDP6);
+               }
+               else if (!strcmp(t, K_ALL)) {
+                       SELECT_ACTIVITY(A_NET_DEV);
+                       SELECT_ACTIVITY(A_NET_EDEV);
+                       SELECT_ACTIVITY(A_NET_SOCK);
+                       SELECT_ACTIVITY(A_NET_NFS);
+                       SELECT_ACTIVITY(A_NET_NFSD);
+                       SELECT_ACTIVITY(A_NET_IP);
+                       SELECT_ACTIVITY(A_NET_EIP);
+                       SELECT_ACTIVITY(A_NET_ICMP);
+                       SELECT_ACTIVITY(A_NET_EICMP);
+                       SELECT_ACTIVITY(A_NET_TCP);
+                       SELECT_ACTIVITY(A_NET_ETCP);
+                       SELECT_ACTIVITY(A_NET_UDP);
+                       SELECT_ACTIVITY(A_NET_SOCK6);
+                       SELECT_ACTIVITY(A_NET_IP6);
+                       SELECT_ACTIVITY(A_NET_EIP6);
+                       SELECT_ACTIVITY(A_NET_ICMP6);
+                       SELECT_ACTIVITY(A_NET_EICMP6);
+                       SELECT_ACTIVITY(A_NET_UDP6);
+               }
+               else
+                       return 1;
+       }
+
+       (*opt)++;
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Parse sar "-I" option.
+ *
+ * IN:
+ * @argv       Arguments list.
+ * @opt                Index in list of arguments.
+ * @act                Array of activities.
+ *
+ * OUT:
+ * @act                Array of activities, with interrupts activity selected.
+ *
+ * RETURNS:
+ * 0 on success, 1 otherwise.
+ ***************************************************************************
+ */
+int parse_sar_I_opt(char *argv[], int *opt, struct activity *act[])
+{
+       int i, p;
+       unsigned char c;
+       char *t;
+
+       /* Select interrupt activity */
+       p = get_activity_position(act, A_IRQ);
+       act[p]->options |= AO_SELECTED;
+
+       for (t = strtok(argv[*opt], ","); t; t = strtok(NULL, ",")) {
+               if (!strcmp(t, K_SUM)) {
+                       /* Select total number of interrupts */
+                       act[p]->bitmap->b_array[0] |= 0x01;
+               }
+               else if (!strcmp(t, K_ALL)) {
+                       /* Set bit for the first 16 individual interrupts */
+                       act[p]->bitmap->b_array[0] |= 0xfe;
+                       act[p]->bitmap->b_array[1] |= 0xff;
+                       act[p]->bitmap->b_array[2] |= 0x01;
+               }
+               else if (!strcmp(t, K_XALL)) {
+                       /* Set every bit except for total number of interrupts */
+                       c = act[p]->bitmap->b_array[0];
+                       set_bitmap(act[p]->bitmap->b_array, ~0,
+                                  BITMAP_SIZE(act[p]->bitmap->b_size));
+                       act[p]->bitmap->b_array[0] = 0xfe | c;
+               }
+               else {
+                       /* Get irq number */
+                       if (strspn(t, DIGITS) != strlen(t))
+                               return 1;
+                       i = atoi(t);
+                       if ((i < 0) || (i >= act[p]->bitmap->b_size))
+                               return 1;
+                       act[p]->bitmap->b_array[(i + 1) >> 3] |= 1 << ((i + 1) & 0x07);
+               }
+       }
+
+       (*opt)++;
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Parse sar and sadf "-P" option.
+ *
+ * IN:
+ * @argv       Arguments list.
+ * @opt                Index in list of arguments.
+ * @act                Array of activities.
+ *
+ * OUT:
+ * @flags      Common flags and system state.
+ * @act                Array of activities, with CPUs selected.
+ *
+ * RETURNS:
+ * 0 on success, 1 otherwise.
+ ***************************************************************************
+ */
+int parse_sa_P_opt(char *argv[], int *opt, unsigned int *flags, struct activity *act[])
+{
+       int i, p;
+       char *t;
+
+       p = get_activity_position(act, A_CPU);
+
+       if (argv[++(*opt)]) {
+               *flags |= S_F_PER_PROC;
+
+               for (t = strtok(argv[*opt], ","); t; t = strtok(NULL, ",")) {
+                       if (!strcmp(t, K_ALL)) {
+                               /*
+                                * Set bit for every processor.
+                                * We still don't know if we are going to read stats
+                                * from a file or not...
+                                */
+                               set_bitmap(act[p]->bitmap->b_array, ~0,
+                                          BITMAP_SIZE(act[p]->bitmap->b_size));
+                       }
+                       else {
+                               /* Get cpu number */
+                               if (strspn(t, DIGITS) != strlen(t))
+                                       return 1;
+                               i = atoi(t);
+                               if ((i < 0) || (i >= act[p]->bitmap->b_size))
+                                       return 1;
+                               act[p]->bitmap->b_array[(i + 1) >> 3] |= 1 << ((i + 1) & 0x07);
+                       }
+               }
+               (*opt)++;
+       }
+       else
+               return 1;
+
+       return 0;
+}
+
diff --git a/sa_wrap.c b/sa_wrap.c
new file mode 100644 (file)
index 0000000..2c0daaf
--- /dev/null
+++ b/sa_wrap.c
@@ -0,0 +1,912 @@
+/*
+ * sysstat - sa_wrap.c: Functions used in activity.c
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include "sa.h"
+#include "rd_stats.h"
+
+extern unsigned int flags;
+extern struct record_header record_hdr;
+
+/*
+ ***************************************************************************
+ * Count number of interrupts that are in /proc/stat file.
+ * Truncate the number of different individual interrupts to NR_IRQS.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of interrupts, including total number of interrupts.
+ * Value in [0, NR_IRQS + 1].
+ ***************************************************************************
+ */
+__nr_t wrap_get_irq_nr(struct activity *a)
+{
+       __nr_t n;
+
+       if ((n = get_irq_nr()) > (a->bitmap->b_size + 1)) {
+               n = a->bitmap->b_size + 1;
+       }
+       
+       return n;
+}
+
+/*
+ ***************************************************************************
+ * Find number of serial lines that support tx/rx accounting
+ * in /proc/tty/driver/serial file.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of serial lines supporting tx/rx accouting + a pre-allocation
+ * constant.
+ ***************************************************************************
+ */
+__nr_t wrap_get_serial_nr(struct activity *a)
+{
+       __nr_t n = 0;
+       
+       if ((n = get_serial_nr()) > 0)
+               return n + NR_SERIAL_PREALLOC;
+       
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Find number of interfaces (network devices) that are in /proc/net/dev
+ * file.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of network interfaces + a pre-allocation constant.
+ ***************************************************************************
+ */
+__nr_t wrap_get_iface_nr(struct activity *a)
+{
+       __nr_t n = 0;
+       
+       if ((n = get_iface_nr()) > 0)
+               return n + NR_IFACE_PREALLOC;
+       
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Compute number of CPU structures to allocate.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of structures (value in [1, NR_CPUS + 1]).
+ * 1 means that there is only one proc and non SMP kernel.
+ * 2 means one proc and SMP kernel.
+ * Etc.
+ ***************************************************************************
+ */
+__nr_t wrap_get_cpu_nr(struct activity *a)
+{
+       return (get_cpu_nr(a->bitmap->b_size) + 1);
+}
+
+/*
+ ***************************************************************************
+ * Get number of devices in /proc/diskstats.
+ * Always done, since disk stats must be read at least for sar -b
+ * if not for sar -d.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of devices + a pre-allocation constant.
+ ***************************************************************************
+ */
+__nr_t wrap_get_disk_nr(struct activity *a)
+{
+       __nr_t n = 0;
+       unsigned int f = COLLECT_PARTITIONS(a->opt_flags);
+       
+       if ((n = get_disk_nr(f)) > 0)
+               return n + NR_DISK_PREALLOC;
+       
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Read CPU statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_stat_cpu(struct activity *a)
+{
+       struct stats_cpu *st_cpu
+               = (struct stats_cpu *) a->_buf0;
+       
+       /* Read CPU statistics */
+       read_stat_cpu(st_cpu, a->nr, &record_hdr.uptime, &record_hdr.uptime0);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read process (task) creation and context switch statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_stat_pcsw(struct activity *a)
+{
+       struct stats_pcsw *st_pcsw
+               = (struct stats_pcsw *) a->_buf0;
+
+       /* Read process and context switch stats */
+       read_stat_pcsw(st_pcsw);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read interrupt statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_stat_irq(struct activity *a)
+{
+       struct stats_irq *st_irq
+               = (struct stats_irq *) a->_buf0;
+
+       /* Read interrupts stats */
+       read_stat_irq(st_irq, a->nr);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read queue and load statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_loadavg(struct activity *a)
+{
+       struct stats_queue *st_queue
+               = (struct stats_queue *) a->_buf0;
+
+       /* Read queue and load stats */
+       read_loadavg(st_queue);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read memory statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_meminfo(struct activity *a)
+{
+       struct stats_memory *st_memory
+               = (struct stats_memory *) a->_buf0;
+
+       /* Read memory stats */
+       read_meminfo(st_memory);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read swapping statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_swap(struct activity *a)
+{
+       struct stats_swap *st_swap
+               = (struct stats_swap *) a->_buf0;
+
+       /* Read stats from /proc/vmstat */
+       read_vmstat_swap(st_swap);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read paging statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_paging(struct activity *a)
+{
+       struct stats_paging *st_paging
+               = (struct stats_paging *) a->_buf0;
+
+       /* Read stats from /proc/vmstat */
+       read_vmstat_paging(st_paging);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read I/O and transfer rates statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_io(struct activity *a)
+{
+       struct stats_io *st_io
+               = (struct stats_io *) a->_buf0;
+
+       /* Read stats from /proc/diskstats */
+       read_diskstats_io(st_io);
+
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read block devices statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_disk(struct activity *a)
+{
+       struct stats_disk *st_disk
+               = (struct stats_disk *) a->_buf0;
+
+       /* Read stats from /proc/diskstats */
+       read_diskstats_disk(st_disk, a->nr, COLLECT_PARTITIONS(a->opt_flags));
+
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read serial lines statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_tty_driver_serial(struct activity *a)
+{
+       struct stats_serial *st_serial
+               = (struct stats_serial *) a->_buf0;
+
+       /* Read serial lines stats */
+       read_tty_driver_serial(st_serial, a->nr);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read kernel tables statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_kernel_tables(struct activity *a)
+{
+       struct stats_ktables *st_ktables
+               = (struct stats_ktables *) a->_buf0;
+
+       /* Read kernel tables stats */
+       read_kernel_tables(st_ktables);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read network interfaces statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_dev(struct activity *a)
+{
+       struct stats_net_dev *st_net_dev
+               = (struct stats_net_dev *) a->_buf0;
+
+       /* Read network interfaces stats */
+       read_net_dev(st_net_dev, a->nr);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read network interfaces errors statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_edev(struct activity *a)
+{
+       struct stats_net_edev *st_net_edev
+               = (struct stats_net_edev *) a->_buf0;
+
+       /* Read network interfaces errors stats */
+       read_net_edev(st_net_edev, a->nr);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read NFS client statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_nfs(struct activity *a)
+{
+       struct stats_net_nfs *st_net_nfs
+               = (struct stats_net_nfs *) a->_buf0;
+
+       /* Read NFS client stats */
+       read_net_nfs(st_net_nfs);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read NFS server statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_nfsd(struct activity *a)
+{
+       struct stats_net_nfsd *st_net_nfsd
+               = (struct stats_net_nfsd *) a->_buf0;
+
+       /* Read NFS server stats */
+       read_net_nfsd(st_net_nfsd);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read network sockets statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_sock(struct activity *a)
+{
+       struct stats_net_sock *st_net_sock
+               = (struct stats_net_sock *) a->_buf0;
+
+       /* Read network sockets stats */
+       read_net_sock(st_net_sock);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read IP statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_ip(struct activity *a)
+{
+       struct stats_net_ip *st_net_ip
+               = (struct stats_net_ip *) a->_buf0;
+
+       /* Read IP stats */
+       read_net_ip(st_net_ip);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read IP error statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_eip(struct activity *a)
+{
+       struct stats_net_eip *st_net_eip
+               = (struct stats_net_eip *) a->_buf0;
+
+       /* Read IP error stats */
+       read_net_eip(st_net_eip);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read ICMP statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_icmp(struct activity *a)
+{
+       struct stats_net_icmp *st_net_icmp
+               = (struct stats_net_icmp *) a->_buf0;
+
+       /* Read ICMP stats */
+       read_net_icmp(st_net_icmp);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read ICMP error statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_eicmp(struct activity *a)
+{
+       struct stats_net_eicmp *st_net_eicmp
+               = (struct stats_net_eicmp *) a->_buf0;
+
+       /* Read ICMP error stats */
+       read_net_eicmp(st_net_eicmp);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read TCP statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_tcp(struct activity *a)
+{
+       struct stats_net_tcp *st_net_tcp
+               = (struct stats_net_tcp *) a->_buf0;
+
+       /* Read TCP stats */
+       read_net_tcp(st_net_tcp);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read TCP error statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_etcp(struct activity *a)
+{
+       struct stats_net_etcp *st_net_etcp
+               = (struct stats_net_etcp *) a->_buf0;
+
+       /* Read TCP error stats */
+       read_net_etcp(st_net_etcp);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read UDP statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_udp(struct activity *a)
+{
+       struct stats_net_udp *st_net_udp
+               = (struct stats_net_udp *) a->_buf0;
+
+       /* Read UDP stats */
+       read_net_udp(st_net_udp);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read IPv6 network sockets statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_sock6(struct activity *a)
+{
+       struct stats_net_sock6 *st_net_sock6
+               = (struct stats_net_sock6 *) a->_buf0;
+
+       /* Read IPv6 network sockets stats */
+       read_net_sock6(st_net_sock6);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read IPv6 statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_ip6(struct activity *a)
+{
+       struct stats_net_ip6 *st_net_ip6
+               = (struct stats_net_ip6 *) a->_buf0;
+
+       /* Read IPv6 stats */
+       read_net_ip6(st_net_ip6);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read IPv6 error statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_eip6(struct activity *a)
+{
+       struct stats_net_eip6 *st_net_eip6
+               = (struct stats_net_eip6 *) a->_buf0;
+
+       /* Read IPv6 error stats */
+       read_net_eip6(st_net_eip6);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read ICMPv6 statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_icmp6(struct activity *a)
+{
+       struct stats_net_icmp6 *st_net_icmp6
+               = (struct stats_net_icmp6 *) a->_buf0;
+
+       /* Read ICMPv6 stats */
+       read_net_icmp6(st_net_icmp6);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read ICMPv6 error statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_eicmp6(struct activity *a)
+{
+       struct stats_net_eicmp6 *st_net_eicmp6
+               = (struct stats_net_eicmp6 *) a->_buf0;
+
+       /* Read ICMPv6 error stats */
+       read_net_eicmp6(st_net_eicmp6);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read UDPv6 statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_net_udp6(struct activity *a)
+{
+       struct stats_net_udp6 *st_net_udp6
+               = (struct stats_net_udp6 *) a->_buf0;
+
+       /* Read UDPv6 stats */
+       read_net_udp6(st_net_udp6);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Read CPU frequency statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_cpuinfo(struct activity *a)
+{
+       struct stats_pwr_cpufreq *st_pwr_cpufreq
+               = (struct stats_pwr_cpufreq *) a->_buf0;
+
+       /* Read CPU frequency stats */
+       read_cpuinfo(st_pwr_cpufreq, a->nr);
+       
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Get number of fan structures to allocate.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of structures.
+ ***************************************************************************
+ */
+__nr_t wrap_get_fan_nr(struct activity *a)
+{
+       return (get_fan_nr());
+}
+
+/*
+ ***************************************************************************
+ * Read fan statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_fan(struct activity *a)
+{
+       struct stats_pwr_fan *st_pwr_fan
+               = (struct stats_pwr_fan *) a->_buf0;
+
+       /* Read fan stats */
+       read_fan(st_pwr_fan, a->nr);
+
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Get number of temp structures to allocate.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of structures.
+ ***************************************************************************
+ */
+__nr_t wrap_get_temp_nr(struct activity *a)
+{
+       return (get_temp_nr());
+}
+
+/*
+ ***************************************************************************
+ * Read temperature statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_temp(struct activity *a)
+{
+       struct stats_pwr_temp *st_pwr_temp
+               = (struct stats_pwr_temp *) a->_buf0;
+
+       /* Read temperature stats */
+       read_temp(st_pwr_temp, a->nr);
+
+       return;
+}
+
+/*
+ ***************************************************************************
+ * Get number of voltage input structures to allocate.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * RETURNS:
+ * Number of structures.
+ ***************************************************************************
+ */
+__nr_t wrap_get_in_nr(struct activity *a)
+{
+       return (get_in_nr());
+}
+
+/*
+ ***************************************************************************
+ * Read voltage input statistics.
+ *
+ * IN:
+ * @a  Activity structure.
+ *
+ * OUT:
+ * @a  Activity structure with statistics.
+ ***************************************************************************
+ */
+__read_funct_t wrap_read_in(struct activity *a)
+{
+       struct stats_pwr_in *st_pwr_in
+               = (struct stats_pwr_in *) a->_buf0;
+
+       /* Read voltage input stats */
+       read_in(st_pwr_in, a->nr);
+
+       return;
+}
diff --git a/sadc.c b/sadc.c
new file mode 100644 (file)
index 0000000..f16f0ac
--- /dev/null
+++ b/sadc.c
@@ -0,0 +1,1115 @@
+/*
+ * sadc: system activity data collector
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <errno.h>
+#include <signal.h>
+#include <dirent.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/utsname.h>
+
+#include "version.h"
+#include "sa.h"
+#include "rd_stats.h"
+#include "common.h"
+#include "ioconf.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#ifdef HAVE_SENSORS
+#include "sensors/sensors.h"
+#include "sensors/error.h"
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": " __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+long interval = 0;
+unsigned int flags = 0;
+
+int dis;
+char timestamp[2][TIMESTAMP_LEN];
+
+struct file_header file_hdr;
+struct record_header record_hdr;
+char comment[MAX_COMMENT_LEN];
+unsigned int id_seq[NR_ACT];
+
+extern struct activity *act[];
+
+/*
+ ***************************************************************************
+ * Print usage and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+       fprintf(stderr, _("Usage: %s [ options ] [ <interval> [ <count> ] ] [ <outfile> ]\n"),
+               progname);
+
+       fprintf(stderr, _("Options are:\n"
+                         "[ -C <comment> ] [ -F ] [ -L ] [ -V ]\n"
+                         "[ -S { INT | DISK | IPV6 | POWER | SNMP | XDISK | ALL | XALL } ]\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * Parse option -S, indicating which activities are to be collected.
+ *
+ * IN:
+ * @argv       Arguments list.
+ * @opt                Index in list of arguments.
+ ***************************************************************************
+ */
+void parse_sadc_S_option(char *argv[], int opt)
+{
+       char *p;
+       int i;
+
+       for (p = strtok(argv[opt], ","); p; p = strtok(NULL, ",")) {
+               if (!strcmp(p, K_INT)) {
+                       /* Select interrupt activity */
+                       COLLECT_ACTIVITY(A_IRQ);
+               }
+               else if (!strcmp(p, K_DISK)) {
+                       /* Select disk activity */
+                       COLLECT_ACTIVITY(A_DISK);
+               }
+               else if (!strcmp(p, K_XDISK)) {
+                       /* Select disk and partition activity */
+                       i = get_activity_position(act, A_DISK);
+                       act[i]->options   |= AO_COLLECTED;
+                       act[i]->opt_flags |= AO_F_DISK_PART;
+               }
+               else if (!strcmp(p, K_SNMP)) {
+                       /* Select SNMP activities */
+                       COLLECT_ACTIVITY(A_NET_IP);
+                       COLLECT_ACTIVITY(A_NET_EIP);
+                       COLLECT_ACTIVITY(A_NET_ICMP);
+                       COLLECT_ACTIVITY(A_NET_EICMP);
+                       COLLECT_ACTIVITY(A_NET_TCP);
+                       COLLECT_ACTIVITY(A_NET_ETCP);
+                       COLLECT_ACTIVITY(A_NET_UDP);
+               }
+               else if (!strcmp(p, K_IPV6)) {
+                       /* Select IPv6 activities */
+                       COLLECT_ACTIVITY(A_NET_IP6);
+                       COLLECT_ACTIVITY(A_NET_EIP6);
+                       COLLECT_ACTIVITY(A_NET_ICMP6);
+                       COLLECT_ACTIVITY(A_NET_EICMP6);
+                       COLLECT_ACTIVITY(A_NET_UDP6);
+                       COLLECT_ACTIVITY(A_NET_SOCK6);
+               }
+               else if (!strcmp(p, K_POWER)) {
+                       /* Select activities related to power management */
+                       COLLECT_ACTIVITY(A_PWR_CPUFREQ);
+                       COLLECT_ACTIVITY(A_PWR_FAN);
+                       COLLECT_ACTIVITY(A_PWR_TEMP);
+               }
+               else if (!strcmp(p, K_ALL) || !strcmp(p, K_XALL)) {
+                       /* Select all activities */
+                       for (i = 0; i < NR_ACT; i++) {
+                               act[i]->options |= AO_COLLECTED;
+                       }
+                       if (!strcmp(p, K_XALL)) {
+                               /* Tell sadc to also collect partition statistics */
+                               i = get_activity_position(act, A_DISK);
+                               act[i]->opt_flags |= AO_F_DISK_PART;
+                       }
+               }
+               else if (strspn(argv[opt], DIGITS) == strlen(argv[opt])) {
+                       /*
+                        * Although undocumented, option -S followed by a numerical value
+                        * enables the user to select each activity that should be
+                        * collected. "-S 0" unselects all activities but CPU.
+                        */
+                       int act_id;
+
+                       act_id = atoi(argv[opt]);
+                       if ((act_id < 0) || (act_id > NR_ACT)) {
+                               usage(argv[0]);
+                       }
+                       if (!act_id) {
+                               /* Unselect all activities but CPU */
+                               for (i = 0; i < NR_ACT; i++) {
+                                       act[i]->options &= ~AO_COLLECTED;
+                               }
+                               COLLECT_ACTIVITY(A_CPU);
+                       }
+                       else {
+                               /* Select chosen activity */
+                               COLLECT_ACTIVITY(act_id);
+                       }
+               }
+               else {
+                       usage(argv[0]);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * SIGALRM signal handler.
+ *
+ * IN:
+ * @sig        Signal number. Set to 0 for the first time, then to SIGALRM.
+ ***************************************************************************
+ */
+void alarm_handler(int sig)
+{
+       signal(SIGALRM, alarm_handler);
+       alarm(interval);
+}
+
+/*
+ ***************************************************************************
+ * Display an error message.
+ ***************************************************************************
+ */
+void p_write_error(void)
+{
+       fprintf(stderr, _("Cannot write data to system activity file: %s\n"),
+               strerror(errno));
+       exit(2);
+}
+
+/*
+ ***************************************************************************
+ * Init structures. All of them are init'ed first when they are allocated
+ * (done by SREALLOC() macro in sa_sys_init() function).
+ * Then, they are init'ed again each time before reading the various system
+ * stats to make sure that no stats from a previous reading will remain (eg.
+ * if some network interfaces or block devices have been unregistered).
+ ***************************************************************************
+ */
+void reset_stats(void)
+{
+       int i;
+
+       for (i = 0; i < NR_ACT; i++) {
+               if ((act[i]->nr > 0) && act[i]->_buf0) {
+                       memset(act[i]->_buf0, 0, act[i]->msize * act[i]->nr);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Allocate and init structures, according to system state.
+ ***************************************************************************
+ */
+void sa_sys_init(void)
+{
+       int i;
+
+       for (i = 0; i < NR_ACT; i++) {
+
+               if (act[i]->f_count) {
+                       /* Number of items is not a constant and should be calculated */
+                       act[i]->nr = (*act[i]->f_count)(act[i]);
+               }
+
+               if (act[i]->nr > 0) {
+                       /* Allocate structures for current activity */
+                       SREALLOC(act[i]->_buf0, void, act[i]->msize * act[i]->nr);
+               }
+               else {
+                       /* No items found: Invalidate current activity */
+                       act[i]->options &= ~AO_COLLECTED;
+               }
+
+               /* Set default activity list */
+               id_seq[i] = act[i]->id;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Free structures.
+ ***************************************************************************
+ */
+void sa_sys_free(void)
+{
+       int i;
+
+       for (i = 0; i < NR_ACT; i++) {
+
+               if (act[i]->nr > 0) {
+                       if (act[i]->_buf0) {
+                               free(act[i]->_buf0);
+                               act[i]->_buf0 = NULL;
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Write data to file. If the write() call was interrupted by a signal, try
+ * again so that the whole buffer can be written.
+ *
+ * IN:
+ * @fd         Output file descriptor.
+ * @buf                Data buffer.
+ * @nr_bytes   Number of bytes to write.
+ *
+ * RETURNS:
+ * Number of bytes written to file, or -1 on error.
+ ***************************************************************************
+ */
+int write_all(int fd, const void *buf, int nr_bytes)
+{
+       int block, offset = 0;
+       char *buffer = (char *) buf;
+
+       while (nr_bytes > 0) {
+               block = write(fd, &buffer[offset], nr_bytes);
+
+               if (block < 0) {
+                       if (errno == EINTR)
+                               continue;
+                       return block;
+               }
+               if (block == 0)
+                       return offset;
+
+               offset += block;
+               nr_bytes -= block;
+       }
+
+       return offset;
+}
+
+/*
+ ***************************************************************************
+ * If -L option used, request a non-blocking, exclusive lock on the file.
+ * If lock would block, then another process (possibly sadc) has already
+ * opened that file => exit.
+ *
+ * IN:
+ * @fd         Output file descriptor.
+ * @fatal      Indicate if failing to lock file should be fatal or not.
+ *             If it's not fatal then we'll wait for next iteration and
+ *             try again.
+ *
+ * RETURNS:
+ * 0 on success, or 1 if file couldn't be locked.
+ ***************************************************************************
+ */
+int ask_for_flock(int fd, int fatal)
+{
+       /* Option -L may be used only if an outfile was specified on the command line */
+       if (LOCK_FILE(flags)) {
+               /*
+                * Yes: Try to lock file. To make code portable, check for both EWOULDBLOCK
+                * and EAGAIN return codes, and treat them the same (glibc documentation).
+                * Indeed, some Linux ports (e.g. hppa-linux) do not equate EWOULDBLOCK and
+                * EAGAIN like every other Linux port.
+                */
+               if (flock(fd, LOCK_EX | LOCK_NB) < 0) {
+                       if ((((errno == EWOULDBLOCK) || (errno == EAGAIN)) && (fatal == FATAL)) ||
+                           ((errno != EWOULDBLOCK) && (errno != EAGAIN))) {
+                               perror("flock");
+                               exit(1);
+                       }
+                       /* Was unable to lock file: Lock would have blocked... */
+                       return 1;
+               }
+               else {
+                       /* File successfully locked */
+                       flags |= S_F_FILE_LOCKED;
+               }
+       }
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Fill system activity file magic header.
+ *
+ * IN:
+ * @file_magic System activity file magic header.
+ ***************************************************************************
+ */
+void fill_magic_header(struct file_magic *file_magic)
+{
+       char *v;
+       char version[16];
+
+       memset(file_magic, 0, FILE_MAGIC_SIZE);
+
+       file_magic->sysstat_magic = SYSSTAT_MAGIC;
+       file_magic->format_magic  = FORMAT_MAGIC;
+       file_magic->sysstat_extraversion = 0;
+
+       strcpy(version, VERSION);
+
+       /* Get version number */
+       if ((v = strtok(version, ".")) == NULL)
+               return;
+       file_magic->sysstat_version = atoi(v) & 0xff;
+
+       /* Get patchlevel number */
+       if ((v = strtok(NULL, ".")) == NULL)
+               return;
+       file_magic->sysstat_patchlevel = atoi(v) & 0xff;
+
+       /* Get sublevel number */
+       if ((v = strtok(NULL, ".")) == NULL)
+               return;
+       file_magic->sysstat_sublevel = atoi(v) & 0xff;
+
+       /* Get extraversion number. Don't necessarily exist */
+       if ((v = strtok(NULL, ".")) == NULL)
+               return;
+       file_magic->sysstat_extraversion = atoi(v) & 0xff;
+}
+
+/*
+ ***************************************************************************
+ * Fill system activity file header, then write it (or print it if stdout).
+ *
+ * IN:
+ * @fd                 Output file descriptor. May be stdout.
+ ***************************************************************************
+ */
+void setup_file_hdr(int fd)
+{
+       int n, i, p;
+       struct tm rectime;
+       struct utsname header;
+       struct file_magic file_magic;
+       struct file_activity file_act;
+
+       /* Fill then write file magic header */
+       fill_magic_header(&file_magic);
+
+       if ((n = write_all(fd, &file_magic, FILE_MAGIC_SIZE)) != FILE_MAGIC_SIZE)
+               goto write_error;
+
+       /* First reset the structure */
+       memset(&file_hdr, 0, FILE_HEADER_SIZE);
+
+       /* Then get current date */
+       file_hdr.sa_ust_time = get_time(&rectime);
+
+       /* OK, now fill the header */
+       file_hdr.sa_nr_act      = get_activity_nr(act, AO_COLLECTED, COUNT_ACTIVITIES);
+       file_hdr.sa_day         = rectime.tm_mday;
+       file_hdr.sa_month       = rectime.tm_mon;
+       file_hdr.sa_year        = rectime.tm_year;
+       file_hdr.sa_sizeof_long = sizeof(long);
+
+       /* Get system name, release number, hostname and machine architecture */
+       uname(&header);
+       strncpy(file_hdr.sa_sysname, header.sysname, UTSNAME_LEN);
+       file_hdr.sa_sysname[UTSNAME_LEN - 1]  = '\0';
+       strncpy(file_hdr.sa_nodename, header.nodename, UTSNAME_LEN);
+       file_hdr.sa_nodename[UTSNAME_LEN - 1] = '\0';
+       strncpy(file_hdr.sa_release, header.release, UTSNAME_LEN);
+       file_hdr.sa_release[UTSNAME_LEN - 1]  = '\0';
+       strncpy(file_hdr.sa_machine, header.machine, UTSNAME_LEN);
+       file_hdr.sa_machine[UTSNAME_LEN - 1]  = '\0';
+
+       /* Write file header */
+       if ((n = write_all(fd, &file_hdr, FILE_HEADER_SIZE)) != FILE_HEADER_SIZE)
+               goto write_error;
+
+       /* Write activity list */
+       for (i = 0; i < NR_ACT; i++) {
+
+               /*
+                * Activity sequence given by id_seq array.
+                * Sequence must be the same for stdout as for output file.
+                */
+               if (!id_seq[i])
+                       continue;
+               if ((p = get_activity_position(act, id_seq[i])) < 0)
+                       continue;
+
+               if (IS_COLLECTED(act[p]->options)) {
+                       file_act.id   = act[p]->id;
+                       file_act.nr   = act[p]->nr;
+                       file_act.size = act[p]->fsize;
+
+                       if ((n = write_all(fd, &file_act, FILE_ACTIVITY_SIZE))
+                           != FILE_ACTIVITY_SIZE)
+                               goto write_error;
+               }
+       }
+
+       return;
+
+write_error:
+
+       fprintf(stderr, _("Cannot write system activity file header: %s\n"),
+               strerror(errno));
+       exit(2);
+}
+
+/*
+ ***************************************************************************
+ * sadc called with interval and count parameters not set:
+ * Write a dummy record notifying a system restart, or insert a comment in
+ * binary data file if option -C has been used.
+ * Writing a dummy record should typically be done at boot time,
+ * before the cron daemon is started to avoid conflict with sa1/sa2 scripts.
+ *
+ * IN:
+ * @ofd                        Output file descriptor.
+ * @rtype              Record type to write (dummy or comment).
+ ***************************************************************************
+ */
+void write_special_record(int ofd, int rtype)
+{
+       int n;
+       struct tm rectime;
+
+       /* Check if file is locked */
+       if (!FILE_LOCKED(flags)) {
+               ask_for_flock(ofd, FATAL);
+       }
+
+       /* Reset the structure (not compulsory, but a bit cleaner) */
+       memset(&record_hdr, 0, RECORD_HEADER_SIZE);
+
+       /* Set record type */
+       record_hdr.record_type = rtype;
+
+       /* Save time */
+       record_hdr.ust_time = get_time(&rectime);
+
+       record_hdr.hour   = rectime.tm_hour;
+       record_hdr.minute = rectime.tm_min;
+       record_hdr.second = rectime.tm_sec;
+
+       /* Write record now */
+       if ((n = write_all(ofd, &record_hdr, RECORD_HEADER_SIZE)) != RECORD_HEADER_SIZE) {
+               p_write_error();
+       }
+
+       if (rtype == R_COMMENT) {
+               /* Also write the comment */
+               if ((n = write_all(ofd, comment, MAX_COMMENT_LEN)) != MAX_COMMENT_LEN) {
+                       p_write_error();
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Write stats (or print them if stdout).
+ *
+ * IN:
+ * @ofd                        Output file descriptor. May be stdout.
+ ***************************************************************************
+ */
+void write_stats(int ofd)
+{
+       int i, n, p;
+
+       /* Try to lock file */
+       if (!FILE_LOCKED(flags)) {
+               if (ask_for_flock(ofd, NON_FATAL))
+                       /*
+                        * Unable to lock file:
+                        * Wait for next iteration to try again to save data.
+                        */
+                       return;
+       }
+
+       /* Write record header */
+       if ((n = write_all(ofd, &record_hdr, RECORD_HEADER_SIZE)) != RECORD_HEADER_SIZE) {
+               p_write_error();
+       }
+
+       /* Then write all statistics */
+       for (i = 0; i < NR_ACT; i++) {
+
+               if (!id_seq[i])
+                       continue;
+               if ((p = get_activity_position(act, id_seq[i])) < 0)
+                       continue;
+
+               if (IS_COLLECTED(act[p]->options)) {
+                       if ((n = write_all(ofd, act[p]->_buf0, act[p]->fsize * act[p]->nr)) !=
+                           (act[p]->fsize * act[p]->nr)) {
+                               p_write_error();
+                       }
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Create a system activity daily data file.
+ *
+ * IN:
+ * @ofile              Name of output file.
+ *
+ * OUT:
+ * @ofd                        Output file descriptor.
+ ***************************************************************************
+ */
+void create_sa_file(int *ofd, char *ofile)
+{
+       if ((*ofd = open(ofile, O_CREAT | O_WRONLY,
+                        S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) < 0) {
+               fprintf(stderr, _("Cannot open %s: %s\n"), ofile, strerror(errno));
+               exit(2);
+       }
+
+       /* Try to lock file */
+       ask_for_flock(*ofd, FATAL);
+
+       /* Truncate file */
+       if (ftruncate(*ofd, 0) < 0) {
+               fprintf(stderr, _("Cannot open %s: %s\n"), ofile, strerror(errno));
+               exit(2);
+       }
+
+       /* Write file header */
+       setup_file_hdr(*ofd);
+}
+
+/*
+ ***************************************************************************
+ * Get descriptor for stdout.
+ *
+ * IN:
+ * @stdfd              A value >= 0 indicates that stats data should also
+ *                     be written to stdout.
+ *
+ * OUT:
+ * @stdfd              Stdout file descriptor.
+ ***************************************************************************
+ */
+void open_stdout(int *stdfd)
+{
+       if (*stdfd >= 0) {
+               if ((*stdfd = dup(STDOUT_FILENO)) < 0) {
+                       perror("dup");
+                       exit(4);
+               }
+               /* Write file header on STDOUT */
+               setup_file_hdr(*stdfd);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Get descriptor for output file and write its header.
+ * We may enter this function several times (when we rotate a file).
+ *
+ * IN:
+ * @ofile              Name of output file.
+ *
+ * OUT:
+ * @ofd                        Output file descriptor.
+ ***************************************************************************
+ */
+void open_ofile(int *ofd, char ofile[])
+{
+       struct file_magic file_magic;
+       struct file_activity file_act;
+       ssize_t sz;
+       int i, p;
+
+       if (ofile[0]) {
+               /* Does file exist? */
+               if (access(ofile, F_OK) < 0) {
+                       /* NO: Create it */
+                       create_sa_file(ofd, ofile);
+               }
+               else {
+                       /* YES: Append data to it if possible */
+                       if ((*ofd = open(ofile, O_APPEND | O_RDWR)) < 0) {
+                               fprintf(stderr, _("Cannot open %s: %s\n"), ofile, strerror(errno));
+                               exit(2);
+                       }
+
+                       /* Read file magic header */
+                       sz = read(*ofd, &file_magic, FILE_MAGIC_SIZE);
+                       if (!sz) {
+                               close(*ofd);
+                               /* This is an empty file: Create it again */
+                               create_sa_file(ofd, ofile);
+                               return;
+                       }
+                       if ((sz != FILE_MAGIC_SIZE) ||
+                           (file_magic.sysstat_magic != SYSSTAT_MAGIC) ||
+                           (file_magic.format_magic != FORMAT_MAGIC)) {
+                               if (FORCE_FILE(flags)) {
+                                       close(*ofd);
+                                       /* -F option used: Truncate file */
+                                       create_sa_file(ofd, ofile);
+                                       return;
+                               }
+                               /* Display error message and exit */
+                               handle_invalid_sa_file(ofd, &file_magic, ofile, sz);
+                       }
+
+                       /* Read file standard header */
+                       if (read(*ofd, &file_hdr, FILE_HEADER_SIZE) != FILE_HEADER_SIZE) {
+                               /* Display error message and exit */
+                               handle_invalid_sa_file(ofd, &file_magic, ofile, 0);
+                       }
+
+                       /*
+                        * OK: It's a true system activity file.
+                        * List of activities from the file prevails over that of the user.
+                        * So unselect all of them. And reset activity sequence.
+                        */
+                       for (i = 0; i < NR_ACT; i++) {
+                               act[i]->options &= ~AO_COLLECTED;
+                               id_seq[i] = 0;
+                       }
+
+                       if (!file_hdr.sa_nr_act || (file_hdr.sa_nr_act > NR_ACT))
+                               /*
+                                * No activities at all or at least one unknown activity:
+                                * Cannot append data to such a file.
+                                */
+                               goto append_error;
+
+                       for (i = 0; i < file_hdr.sa_nr_act; i++) {
+
+                               /* Read current activity in list */
+                               if (read(*ofd, &file_act, FILE_ACTIVITY_SIZE) != FILE_ACTIVITY_SIZE) {
+                                       handle_invalid_sa_file(ofd, &file_magic, ofile, 0);
+                               }
+
+                               p = get_activity_position(act, file_act.id);
+
+                               if ((p < 0) || (act[p]->fsize != file_act.size))
+                                       /* Unknown activity in list or item size has changed */
+                                       goto append_error;
+
+                               if (act[p]->nr != file_act.nr) {
+                                       if (IS_REMANENT(act[p]->options) || !file_act.nr)
+                                               /*
+                                                * Remanent structures cannot have a different number of items.
+                                                * Also number of items should never be null.
+                                                */
+                                               goto append_error;
+                                       else {
+                                               /*
+                                                * Force number of items (serial lines, network interfaces...)
+                                                * to that of the file, and reallocate structures.
+                                                */
+                                               act[p]->nr = file_act.nr;
+                                               SREALLOC(act[p]->_buf0, void, act[p]->msize * act[p]->nr);
+                                       }
+                               }
+                               /* Save activity sequence */
+                               id_seq[i] = file_act.id;
+                               act[p]->options |= AO_COLLECTED;
+                       }
+               }
+       }
+
+       return;
+
+append_error:
+
+       close(*ofd);
+       if (FORCE_FILE(flags)) {
+               /* Truncate file */
+               create_sa_file(ofd, ofile);
+       }
+       else {
+               fprintf(stderr, _("Cannot append data to that file (%s)\n"), ofile);
+               exit(1);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read statistics from various system files.
+ ***************************************************************************
+ */
+void read_stats(void)
+{
+       int i;
+       __nr_t cpu_nr = act[get_activity_position(act, A_CPU)]->nr;
+
+       /*
+        * Init uptime0. So if /proc/uptime cannot fill it,
+        * this will be done by /proc/stat.
+        * If cpu_nr = 2, force /proc/stat to fill it.
+        * If cpu_nr = 1, uptime0 and uptime are equal.
+        * NB: uptime0 is always filled.
+        * Remember that cpu_nr = 1 means one CPU and no SMP kernel
+        * (one structure for CPU "all") and cpu_nr = 2 means one CPU
+        * and an SMP kernel (two structures for CPUs "all" and "0").
+        */
+       record_hdr.uptime0 = 0;
+       if (cpu_nr > 2) {
+               read_uptime(&(record_hdr.uptime0));
+       }
+
+       for (i = 0; i < NR_ACT; i++) {
+               if (IS_COLLECTED(act[i]->options)) {
+                       /* Read statistics for current activity */
+                       (*act[i]->f_read)(act[i]);
+               }
+       }
+
+       if (cpu_nr == 1) {
+               /*
+                * uptime has been filled by read_uptime()
+                * or when reading CPU stats from /proc/stat.
+                */
+               record_hdr.uptime0 = record_hdr.uptime;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Main loop: Read stats from the relevant sources and display them.
+ *
+ * IN:
+ * @count              Number of lines of stats to display.
+ * @rectime            Current date and time.
+ * @stdfd              Stdout file descriptor.
+ * @ofd                        Output file descriptor.
+ * @ofile              Name of output file.
+ ***************************************************************************
+ */
+void rw_sa_stat_loop(long count, struct tm *rectime, int stdfd, int ofd,
+                    char ofile[])
+{
+       int do_sa_rotat = 0;
+       unsigned int save_flags;
+       char new_ofile[MAX_FILE_LEN];
+
+       new_ofile[0] = '\0';
+
+       /* Main loop */
+       do {
+
+               /*
+                * Init all structures.
+                * Exception for individual CPUs structures which must not be
+                * init'ed to keep values for CPU before they were disabled.
+                */
+               reset_stats();
+
+               /* Save time */
+               record_hdr.ust_time = get_time(rectime);
+               record_hdr.hour     = rectime->tm_hour;
+               record_hdr.minute   = rectime->tm_min;
+               record_hdr.second   = rectime->tm_sec;
+
+               /* Set record type */
+               if (do_sa_rotat) {
+                       record_hdr.record_type = R_LAST_STATS;
+               }
+               else {
+                       record_hdr.record_type = R_STATS;
+               }
+
+               /* Read then write stats */
+               read_stats();
+
+               if (stdfd >= 0) {
+                       save_flags = flags;
+                       flags &= ~S_F_LOCK_FILE;
+                       write_stats(stdfd);
+                       flags = save_flags;
+               }
+
+               /* If the record type was R_LAST_STATS, tag it R_STATS before writing it */
+               record_hdr.record_type = R_STATS;
+               if (ofile[0]) {
+                       write_stats(ofd);
+               }
+
+               if (do_sa_rotat) {
+                       /*
+                        * Stats are written at the end of previous file *and* at the
+                        * beginning of the new one (outfile must have been specified
+                        * as '-' on the command line).
+                        */
+                       do_sa_rotat = FALSE;
+
+                       if (fdatasync(ofd) < 0) {
+                               /* Flush previous file */
+                               perror("fdatasync");
+                               exit(4);
+                       }
+                       close(ofd);
+                       strcpy(ofile, new_ofile);
+
+                       /* Recalculate number of system items and reallocate structures */
+                       sa_sys_init();
+
+                       /*
+                        * Open and init new file.
+                        * This is also used to set activity sequence to that of the file
+                        * if the file already exists.
+                        */
+                       open_ofile(&ofd, ofile);
+
+                       /*
+                        * Rewrite header and activity sequence to stdout since
+                        * number of items may have changed.
+                        */
+                       if (stdfd >= 0) {
+                               setup_file_hdr(stdfd);
+                       }
+
+                       /* Write stats to file again */
+                       write_stats(ofd);
+               }
+
+               /* Flush data */
+               fflush(stdout);
+
+               if (count > 0) {
+                       count--;
+               }
+
+               if (count) {
+                       pause();
+               }
+
+               /* Rotate activity file if necessary */
+               if (WANT_SA_ROTAT(flags)) {
+                       /* The user specified '-' as the filename to use */
+                       set_default_file(rectime, new_ofile);
+
+                       if (strcmp(ofile, new_ofile)) {
+                               do_sa_rotat = TRUE;
+                       }
+               }
+       }
+       while (count);
+
+       /* Close file descriptors if they have actually been used */
+       CLOSE(stdfd);
+       CLOSE(ofd);
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the program.
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int opt = 0, optz = 0;
+       char ofile[MAX_FILE_LEN];
+       struct tm rectime;
+       int stdfd = 0, ofd = -1;
+       long count = 0;
+
+       /* Get HZ */
+       get_HZ();
+       
+       /* Compute page shift in kB */
+       get_kb_shift();
+
+       ofile[0] = comment[0] = '\0';
+
+#ifdef HAVE_SENSORS
+       /* Initialize sensors, let it use the default cfg file */
+       int err = sensors_init(NULL);
+       if (err) {
+               fprintf(stderr, "sensors_init: %s\n", sensors_strerror(err));
+       }
+#endif /* HAVE_SENSORS */
+       
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       while (++opt < argc) {
+
+               if (!strcmp(argv[opt], "-S")) {
+                       if (argv[++opt]) {
+                               parse_sadc_S_option(argv, opt);
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-F")) {
+                       flags |= S_F_FORCE_FILE;
+               }
+
+               else if (!strcmp(argv[opt], "-L")) {
+                       flags |= S_F_LOCK_FILE;
+               }
+
+               else if (!strcmp(argv[opt], "-V")) {
+                       print_version();
+               }
+
+               else if (!strcmp(argv[opt], "-z")) {
+                       /* Set by sar command */
+                       optz = 1;
+               }
+
+               else if (!strcmp(argv[opt], "-C")) {
+                       if (argv[++opt]) {
+                               strncpy(comment, argv[opt], MAX_COMMENT_LEN);
+                               comment[MAX_COMMENT_LEN - 1] = '\0';
+                               if (!strlen(comment)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (strspn(argv[opt], DIGITS) != strlen(argv[opt])) {
+                       if (!ofile[0]) {
+                               stdfd = -1;     /* Don't write to STDOUT */
+                               if (!strcmp(argv[opt], "-")) {
+                                       /* File name set to '-' */
+                                       set_default_file(&rectime, ofile);
+                                       flags |= S_F_SA_ROTAT;
+                               }
+                               else if (!strncmp(argv[opt], "-", 1)) {
+                                       /* Bad option */
+                                       usage(argv[0]);
+                               }
+                               else {
+                                       /* Write data to file */
+                                       strncpy(ofile, argv[opt], MAX_FILE_LEN);
+                                       ofile[MAX_FILE_LEN - 1] = '\0';
+                               }
+                       }
+                       else {
+                               /* Outfile already specified */
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!interval) {
+                       /* Get interval */
+                       interval = atol(argv[opt]);
+                       if (interval < 1) {
+                               usage(argv[0]);
+                       }
+                       count = -1;
+               }
+
+               else if (count <= 0) {
+                       /* Get count value */
+                       count = atol(argv[opt]);
+                       if (count < 1) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else {
+                       usage(argv[0]);
+               }
+       }
+
+       /*
+        * If option -z used, write to STDOUT even if a filename
+        * has been entered on the command line.
+        */
+       if (optz) {
+               stdfd = 0;
+       }
+
+       if (!ofile[0]) {
+               /* -L option ignored when writing to STDOUT */
+               flags &= ~S_F_LOCK_FILE;
+       }
+
+       /* Init structures according to machine architecture */
+       sa_sys_init();
+
+       /*
+        * Open output file then STDOUT. Write header for each of them.
+        * NB: Output file must be opened first, because we may change
+        * the activities collected AND the activity sequence to that
+        * of the file, and the activities collected and activity sequence
+        * written on STDOUT must be consistent to those of the file.
+        */
+       open_ofile(&ofd, ofile);
+       open_stdout(&stdfd);
+
+       if (!interval) {
+               if (ofd >= 0) {
+                       /*
+                        * Interval (and count) not set:
+                        * Write a dummy record, or insert a comment, then exit.
+                        * NB: Never write such a dummy record on stdout since
+                        * sar never expects it.
+                        */
+                       if (comment[0]) {
+                               write_special_record(ofd, R_COMMENT);
+                       }
+                       else {
+                               write_special_record(ofd, R_RESTART);
+                       }
+
+                       /* Close file descriptor */
+                       CLOSE(ofd);
+               }
+
+               /* Free structures */
+               sa_sys_free();
+               exit(0);
+       }
+
+       /* Set a handler for SIGALRM */
+       alarm_handler(0);
+
+       /* Main loop */
+       rw_sa_stat_loop(count, &rectime, stdfd, ofd, ofile);
+
+#ifdef HAVE_SENSORS
+       /* Cleanup sensors */
+       sensors_cleanup();
+#endif /* HAVE_SENSORS */
+
+       /* Free structures */
+       sa_sys_free();
+
+       return 0;
+}
diff --git a/sadf.c b/sadf.c
new file mode 100644 (file)
index 0000000..7219ef1
--- /dev/null
+++ b/sadf.c
@@ -0,0 +1,1391 @@
+/*
+ * sadf: system activity data formatter
+ * (C) 1999-2009 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <time.h>
+#include <errno.h>
+
+#include "version.h"
+#include "sadf.h"
+#include "sa.h"
+#include "common.h"
+#include "ioconf.h"
+#include "prf_stats.h"
+
+#ifdef USE_NLS
+# include <locale.h>
+# include <libintl.h>
+# define _(string) gettext(string)
+#else
+# define _(string) (string)
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": " __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+long interval = -1, count = 0;
+
+unsigned int flags = 0;
+unsigned int format = 0;       /* Output format */
+
+/* File header */
+struct file_header file_hdr;
+
+static char *seps[] =  {"\t", ";"};
+
+/*
+ * Activity sequence.
+ * This array must always be entirely filled (even with trailing zeros).
+ */
+unsigned int id_seq[NR_ACT];
+
+/* Current record header */
+struct record_header record_hdr[3];
+
+struct tm rectime, loctime;
+/* Contain the date specified by -s and -e options */
+struct tstamp tm_start, tm_end;
+char *args[MAX_ARGV_NR];
+
+extern struct activity *act[];
+
+/*
+ ***************************************************************************
+ * Print usage and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command.
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+       fprintf(stderr,
+               _("Usage: %s [ options ] [ <interval> [ <count> ] ] [ <datafile> ]\n"),
+               progname);
+
+       fprintf(stderr, _("Options are:\n"
+                         "[ -d | -D | -H | -p | -x ] [ -C ] [ -h ] [ -t ] [ -V ]\n"
+                         "[ -P { <cpu> [,...] | ALL } ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"
+                         "[ -- <sar_options> ]\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * Init structures.
+ ***************************************************************************
+ */
+void init_structures(void)
+{
+       int i;
+       
+       for (i = 0; i < 3; i++) {
+               memset(&record_hdr[i], 0, RECORD_HEADER_SIZE);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Fill the rectime structure with current record's date and time, based on
+ * current record's "number of seconds since the epoch" saved in file.
+ * The resulting timestamp is expressed in UTC or in local time, depending
+ * on whether option -t has been used or not.
+ * NB: Option -t is ignored when option -p is used, since option -p
+ * displays its timestamp as a long integer. This is type 'time_t',
+ * which is the number of seconds since 1970 _always_ expressed in UTC.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+*/
+void sadf_get_record_timestamp_struct(int curr)
+{
+       struct tm *ltm;
+
+       ltm = localtime((const time_t *) &record_hdr[curr].ust_time);
+       loctime = *ltm;
+
+       if (!PRINT_TRUE_TIME(flags) ||
+           ((format != S_O_DB_OPTION) && (format != S_O_XML_OPTION))) {
+               /* Option -t is valid only with options -d and -x */
+               ltm = gmtime((const time_t *) &record_hdr[curr].ust_time);
+       }
+
+       rectime = *ltm;
+}
+
+/*
+ ***************************************************************************
+ * Set current record's timestamp string. This timestamp is expressed in
+ * UTC or in local time, depending on whether option -t has been used or
+ * not.
+ * NB: If options -D or -p have been used, the timestamp in expressed in
+ * seconds since 1970.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @len                Maximum length of timestamp string.
+ *
+ * OUT:
+ * @cur_time   Timestamp string.
+ ***************************************************************************
+*/
+void set_record_timestamp_string(int curr, char *cur_time, int len)
+{
+       /* Fill timestamp structure */
+       sadf_get_record_timestamp_struct(curr);
+
+       /* Set cur_time date value */
+       if (format == S_O_DB_OPTION) {
+               if (PRINT_TRUE_TIME(flags)) {
+                       strftime(cur_time, len, "%Y-%m-%d %H:%M:%S", &rectime);
+               }
+               else {
+                       strftime(cur_time, len, "%Y-%m-%d %H:%M:%S UTC", &rectime);
+               }
+       }
+       else if ((format == S_O_PPC_OPTION) || (format == S_O_DBD_OPTION)) {
+               sprintf(cur_time, "%ld", record_hdr[curr].ust_time);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display the field list (when displaying stats in DB format)
+ *
+ * IN:
+ * @act_d      Activity to display, or ~0 for all.
+ ***************************************************************************
+ */
+void list_fields(unsigned int act_id)
+{
+       int i;
+       unsigned int msk;
+       char *hl;
+       char hline[HEADER_LINE_LEN];
+       
+       printf("# hostname;interval;timestamp");
+       
+       for (i = 0; i < NR_ACT; i++) {
+               
+               if ((act_id != ALL_ACTIVITIES) && (act[i]->id != act_id))
+                       continue;
+               
+               if (IS_SELECTED(act[i]->options) && (act[i]->nr > 0)) {
+                       if (!HAS_MULTIPLE_OUTPUTS(act[i]->options)) {
+                               printf(";%s", act[i]->hdr_line);
+                               if ((act[i]->nr > 1) && DISPLAY_HORIZONTALLY(flags)) {
+                                       printf("[...]");
+                               }
+                       }
+                       else {
+                               msk = 1;
+                               strcpy(hline, act[i]->hdr_line);
+                               for (hl = strtok(hline, "|"); hl; hl = strtok(NULL, "|"), msk <<= 1) {
+                                       if ((hl != NULL) && (act[i]->opt_flags & msk)) {
+                                               printf(";%s", hl);
+                                               if ((act[i]->nr > 1) && DISPLAY_HORIZONTALLY(flags)) {
+                                                       printf("[...]");
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       
+       printf("\n");
+}
+
+/*
+ ***************************************************************************
+ * write_mech_stats() -
+ * Replace the old write_stats_for_ppc() and write_stats_for_db(),
+ * making it easier for them to remain in sync and print the same data.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @dt         Interval of time in seconds.
+ * @itv                Interval of time in jiffies.
+ * @g_itv      Interval of time in jiffies multiplied by the number of
+ *             processors.
+ * @cur_time   Current timestamp.
+ * @act_id     Activity to display, or ~0 for all.
+ ***************************************************************************
+ */
+void write_mech_stats(int curr, unsigned long dt, unsigned long long itv,
+                     unsigned long long g_itv, char *cur_time, unsigned int act_id)
+{
+       int i;
+       char pre[80];   /* Text at beginning of each line */
+       int isdb = ((format == S_O_DB_OPTION) || (format == S_O_DBD_OPTION));
+       
+       /* This substring appears on every output line, preformat it here */
+       snprintf(pre, 80, "%s%s%ld%s%s",
+                file_hdr.sa_nodename, seps[isdb], dt, seps[isdb], cur_time);
+       pre[79] = '\0';
+
+       if (DISPLAY_HORIZONTALLY(flags)) {
+               printf("%s", pre);
+       }
+
+       for (i = 0; i < NR_ACT; i++) {
+               
+               if ((act_id != ALL_ACTIVITIES) && (act[i]->id != act_id))
+                       continue;
+               
+               if (IS_SELECTED(act[i]->options) && (act[i]->nr > 0)) {
+                       
+                       if (NEEDS_GLOBAL_ITV(act[i]->options)) {
+                               (*act[i]->f_render)(act[i], isdb, pre, curr, g_itv);
+                       }
+                       else {
+                               (*act[i]->f_render)(act[i], isdb, pre, curr, itv);
+                       }
+               }
+       }
+
+       if (DISPLAY_HORIZONTALLY(flags)) {
+               printf("\n");
+       }
+}
+
+/*
+ ***************************************************************************
+ * Write system statistics.
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @reset              Set to TRUE if last_uptime variable should be
+ *                     reinitialized (used in next_slice() function).
+ * @use_tm_start       Set to TRUE if option -s has been used.
+ * @use_tm_end         Set to TRUE if option -e has been used.
+ * @act_id             Activities to display.
+ *
+ * OUT:
+ * @cnt                        Set to 0 to indicate that no other lines of stats
+ *                     should be displayed.
+ *
+ * RETURNS:
+ * 1 if a line of stats has been displayed, and 0 otherwise.
+ ***************************************************************************
+ */
+int write_parsable_stats(int curr, int reset, long *cnt, int use_tm_start,
+                        int use_tm_end, unsigned int act_id)
+{
+       unsigned long long dt, itv, g_itv;
+       char cur_time[26];
+       static int cross_day = FALSE;
+       static __nr_t cpu_nr = -1;
+       
+       if (cpu_nr < 0) {
+               cpu_nr = act[get_activity_position(act, A_CPU)]->nr;
+       }
+
+       /*
+        * Check time (1).
+        * For this first check, we use the time interval entered on
+        * the command line. This is equivalent to sar's option -i which
+        * selects records at seconds as close as possible to the number
+        * specified by the interval parameter.
+        */
+       if (!next_slice(record_hdr[2].uptime0, record_hdr[curr].uptime0,
+                       reset, interval))
+               /* Not close enough to desired interval */
+               return 0;
+
+       /* Set current timestamp */
+       set_record_timestamp_string(curr, cur_time, 26);
+
+       /* Check if we are beginning a new day */
+       if (use_tm_start && record_hdr[!curr].ust_time &&
+           (record_hdr[curr].ust_time > record_hdr[!curr].ust_time) &&
+           (record_hdr[curr].hour < record_hdr[!curr].hour)) {
+               cross_day = TRUE;
+       }
+
+       if (cross_day) {
+               /*
+                * This is necessary if we want to properly handle something like:
+                * sar -s time_start -e time_end with
+                * time_start(day D) > time_end(day D+1)
+                */
+               loctime.tm_hour += 24;
+       }
+
+       /* Check time (2) */
+       if (use_tm_start && (datecmp(&loctime, &tm_start) < 0))
+               /* it's too soon... */
+               return 0;
+
+       /* Get interval values */
+       get_itv_value(&record_hdr[curr], &record_hdr[!curr],
+                     cpu_nr, &itv, &g_itv);
+
+       /* Check time (3) */
+       if (use_tm_end && (datecmp(&loctime, &tm_end) > 0)) {
+               /* It's too late... */
+               *cnt = 0;
+               return 0;
+       }
+
+       dt = itv / HZ;
+       /* Correct rounding error for dt */
+       if ((itv % HZ) >= (HZ / 2)) {
+               dt++;
+       }
+
+       write_mech_stats(curr, dt, itv, g_itv, cur_time, act_id);
+
+       return 1;
+}
+
+/*
+ ***************************************************************************
+ * Display XML activity records
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @use_tm_start       Set to TRUE if option -s has been used.
+ * @use_tm_end         Set to TRUE if option -e has been used.
+ * @reset              Set to TRUE if last_uptime should be reinitialized
+ *                     (used in next_slice() function).
+ * @tab                        Number of tabulations to print.
+ * @cpu_nr             Number of processors.
+ *
+ * OUT:
+ * @cnt                        Set to 0 to indicate that no other lines of stats
+ *                     should be displayed.
+ *
+ * RETURNS:
+ * 1 if stats have been successfully displayed.
+ ***************************************************************************
+ */
+int write_xml_stats(int curr, int use_tm_start, int use_tm_end, int reset,
+                   long *cnt, int tab, __nr_t cpu_nr)
+{
+       int i;
+       unsigned long long dt, itv, g_itv;
+       char cur_time[XML_TIMESTAMP_LEN];
+       static int cross_day = FALSE;
+
+       /* Fill timestamp structure (rectime) for current record */
+       sadf_get_record_timestamp_struct(curr);
+
+       /*
+        * Check time (1).
+        * For this first check, we use the time interval entered on
+        * the command line. This is equivalent to sar's option -i which
+        * selects records at seconds as close as possible to the number
+        * specified by the interval parameter.
+        */
+       if (!next_slice(record_hdr[2].uptime0, record_hdr[curr].uptime0,
+                       reset, interval))
+               /* Not close enough to desired interval */
+               return 0;
+
+       /* Check if we are beginning a new day */
+       if (use_tm_start && record_hdr[!curr].ust_time &&
+           (record_hdr[curr].ust_time > record_hdr[!curr].ust_time) &&
+           (record_hdr[curr].hour < record_hdr[!curr].hour)) {
+               cross_day = TRUE;
+       }
+
+       if (cross_day) {
+               /*
+                * This is necessary if we want to properly handle something like:
+                * sar -s time_start -e time_end with
+                * time_start(day D) > time_end(day D+1)
+                */
+               loctime.tm_hour += 24;
+       }
+
+       /* Check time (2) */
+       if (use_tm_start && (datecmp(&loctime, &tm_start) < 0))
+               /* it's too soon... */
+               return 0;
+
+       /* Get interval values */
+       get_itv_value(&record_hdr[curr], &record_hdr[!curr],
+                     cpu_nr, &itv, &g_itv);
+
+       /* Check time (3) */
+       if (use_tm_end && (datecmp(&loctime, &tm_end) > 0)) {
+               /* It's too late... */
+               *cnt = 0;
+               return 0;
+       }
+
+       dt = itv / HZ;
+       /* Correct rounding error for dt */
+       if ((itv % HZ) >= (HZ / 2)) {
+               dt++;
+       }
+
+       strftime(cur_time, XML_TIMESTAMP_LEN,
+                "date=\"%Y-%m-%d\" time=\"%H:%M:%S\"", &rectime);
+
+        xprintf(tab, "<timestamp %s interval=\"%llu\">", cur_time, dt);
+       tab++;
+
+       /* Display XML statistics */
+       for (i = 0; i < NR_ACT; i++) {
+               
+               if (CLOSE_MARKUP(act[i]->options) ||
+                   (IS_SELECTED(act[i]->options) && (act[i]->nr > 0))) {
+                       
+                       if (NEEDS_GLOBAL_ITV(act[i]->options)) {
+                               (*act[i]->f_xml_print)(act[i], curr, tab, g_itv);
+                       }
+                       else {
+                               (*act[i]->f_xml_print)(act[i], curr, tab, itv);
+                       }
+               }
+       }
+
+       xprintf(--tab, "</timestamp>");
+
+       return 1;
+}
+
+/*
+ ***************************************************************************
+ * Display XML restart records
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @use_tm_start       Set to TRUE if option -s has been used.
+ * @use_tm_end         Set to TRUE if option -e has been used.
+ * @tab                        Number of tabulations to print.
+ ***************************************************************************
+ */
+void write_xml_restarts(int curr, int use_tm_start, int use_tm_end, int tab)
+{
+       char cur_time[64];
+
+       /* Fill timestamp structure for current record */
+       sadf_get_record_timestamp_struct(curr);
+       
+       /* The record must be in the interval specified by -s/-e options */
+       if ((use_tm_start && (datecmp(&loctime, &tm_start) < 0)) ||
+           (use_tm_end && (datecmp(&loctime, &tm_end) > 0)))
+               return;
+
+       strftime(cur_time, 64, "date=\"%Y-%m-%d\" time=\"%H:%M:%S\"", &rectime);
+       xprintf(tab, "<boot %s/>", cur_time);
+}
+
+/*
+ ***************************************************************************
+ * Display XML COMMENT records
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @use_tm_start       Set to TRUE if option -s has been used.
+ * @use_tm_end         Set to TRUE if option -e has been used.
+ * @tab                        Number of tabulations to print.
+ * @ifd                        Input file descriptor.
+ ***************************************************************************
+ */
+void write_xml_comments(int curr, int use_tm_start, int use_tm_end, int tab, int ifd)
+{
+       char cur_time[64];
+       char file_comment[MAX_COMMENT_LEN];
+
+       sa_fread(ifd, file_comment, MAX_COMMENT_LEN, HARD_SIZE);
+       file_comment[MAX_COMMENT_LEN - 1] = '\0';
+
+       /* Fill timestamp structure for current record */
+       sadf_get_record_timestamp_struct(curr);
+
+       /* The record must be in the interval specified by -s/-e options */
+       if ((use_tm_start && (datecmp(&loctime, &tm_start) < 0)) ||
+           (use_tm_end && (datecmp(&loctime, &tm_end) > 0)))
+               return;
+
+       strftime(cur_time, 64, "date=\"%Y-%m-%d\" time=\"%H:%M:%S\"", &rectime);
+       xprintf(tab, "<comment %s com=\"%s\"/>", cur_time, file_comment);
+}
+
+/*
+ ***************************************************************************
+ * Print contents of a special (RESTART or COMMENT) record
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @use_tm_start       Set to TRUE if option -s has been used.
+ * @use_tm_end         Set to TRUE if option -e has been used.
+ * @rtype              Record type (RESTART or COMMENT).
+ * @ifd                        Input file descriptor.
+ ***************************************************************************
+ */
+void sadf_print_special(int curr, int use_tm_start, int use_tm_end, int rtype, int ifd)
+{
+       char cur_time[26];
+       int dp = 1;
+
+       set_record_timestamp_string(curr, cur_time, 26);
+
+       /* The record must be in the interval specified by -s/-e options */
+       if ((use_tm_start && (datecmp(&loctime, &tm_start) < 0)) ||
+           (use_tm_end && (datecmp(&loctime, &tm_end) > 0))) {
+               dp = 0;
+       }
+
+       if (rtype == R_RESTART) {
+               if (!dp)
+                       return;
+               if (format == S_O_PPC_OPTION) {
+                       printf("%s\t-1\t%ld\tLINUX-RESTART\n",
+                              file_hdr.sa_nodename, record_hdr[curr].ust_time);
+               }
+               else if ((format == S_O_DB_OPTION) || (format == S_O_DBD_OPTION)) {
+                       printf("%s;-1;%s;LINUX-RESTART\n",
+                              file_hdr.sa_nodename, cur_time);
+               }
+       }
+       else if (rtype == R_COMMENT) {
+               char file_comment[MAX_COMMENT_LEN];
+
+               sa_fread(ifd, file_comment, MAX_COMMENT_LEN, HARD_SIZE);
+               file_comment[MAX_COMMENT_LEN - 1] = '\0';
+
+               if (!dp || !DISPLAY_COMMENT(flags))
+                       return;
+               
+               if (format == S_O_PPC_OPTION) {
+                       printf("%s\t-1\t%ld\tCOM %s\n",
+                              file_hdr.sa_nodename, record_hdr[curr].ust_time,
+                              file_comment);
+               }
+               else if ((format == S_O_DB_OPTION) || (format == S_O_DBD_OPTION)) {
+                       printf("%s;-1;%s;COM %s\n",
+                              file_hdr.sa_nodename, cur_time, file_comment);
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Display data file header.
+ *
+ * IN:
+ * @dfile      Name of system activity data file
+ * @file_magic System activity file magic header
+ * @file_hdr   System activity file standard header
+ ***************************************************************************
+ */
+void display_file_header(char *dfile, struct file_magic *file_magic,
+                        struct file_header *file_hdr)
+{
+       int i, p;
+       static __nr_t cpu_nr = -1;
+       
+       if (cpu_nr < 0) {
+               cpu_nr = act[get_activity_position(act, A_CPU)]->nr;
+       }
+       
+       printf(_("System activity data file: %s (%#x)\n"),
+               dfile, file_magic->format_magic);
+
+       display_sa_file_version(file_magic);
+
+       if (file_magic->format_magic != FORMAT_MAGIC) {
+               exit(0);
+       }
+
+       printf(_("Host: "));
+       print_gal_header(localtime((const time_t *) &(file_hdr->sa_ust_time)),
+                        file_hdr->sa_sysname, file_hdr->sa_release,
+                        file_hdr->sa_nodename, file_hdr->sa_machine,
+                        cpu_nr > 1 ? cpu_nr - 1 : 1);
+
+       printf(_("Size of a long int: %d\n"), file_hdr->sa_sizeof_long);
+       
+       printf(_("List of activities:\n"));
+       for (i = 0; i < NR_ACT; i++) {
+               if (!id_seq[i])
+                       continue;
+               if ((p = get_activity_position(act, id_seq[i])) < 0) {
+                       PANIC(id_seq[i]);
+               }
+               printf("%02d: %s\t(x%d)\n", act[p]->id, act[p]->name, act[p]->nr);
+       }
+
+       exit(0);
+}
+
+/*
+ ***************************************************************************
+ * Display XML header and host data
+ *
+ * IN:
+ * @tab                Number of tabulations to print.
+ * @cpu_nr     Number of processors.
+ *
+ * OUT:
+ * @tab                Number of tabulations to print.
+ ***************************************************************************
+ */
+void display_xml_header(int *tab, __nr_t cpu_nr)
+{
+       char cur_time[XML_TIMESTAMP_LEN];
+       
+       printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+       printf("<!DOCTYPE Configure PUBLIC \"DTD v%s sysstat //EN\"\n", XML_DTD_VERSION);
+       printf("\"http://pagesperso-orange.fr/sebastien.godard/sysstat.dtd\">\n");
+
+       xprintf(*tab, "<sysstat>");
+       xprintf(++(*tab), "<sysdata-version>%s</sysdata-version>", XML_DTD_VERSION);
+
+       xprintf(*tab, "<host nodename=\"%s\">", file_hdr.sa_nodename);
+       xprintf(++(*tab), "<sysname>%s</sysname>", file_hdr.sa_sysname);
+       xprintf(*tab, "<release>%s</release>", file_hdr.sa_release);
+               
+       xprintf(*tab, "<machine>%s</machine>", file_hdr.sa_machine);
+       xprintf(*tab, "<number-of-cpus>%d</number-of-cpus>", cpu_nr > 1 ? cpu_nr - 1 : 1);
+
+       /* Fill file timestmap structure (rectime) */
+       get_file_timestamp_struct(flags, &rectime, &file_hdr);
+       strftime(cur_time, XML_TIMESTAMP_LEN, "%Y-%m-%d", &rectime);
+       xprintf(*tab, "<file-date>%s</file-date>", cur_time);
+}
+
+/*
+ ***************************************************************************
+ * Read stats for current activity from file and write them.
+ *
+ * IN:
+ * @ifd                File descriptor of input file.
+ * @fpos       Position in file where reading must start.
+ * @curr       Index in array for current sample statistics.
+ * @file_actlst        List of (known or unknown) activities in file.
+ *
+ * OUT:
+ * @curr       Index in array for next sample statistics.
+ * @cnt                Number of lines of stats remaining to write.
+ * @eosaf      Set to TRUE if EOF (end of file) has been reached.
+ * @act_id     Activity to display, or ~0 for all.
+ * @reset      Set to TRUE if last_uptime variable should be
+ *             reinitialized (used in next_slice() function).
+ ***************************************************************************
+ */
+void rw_curr_act_stats(int ifd, off_t fpos, int *curr, long *cnt, int *eosaf,
+                      unsigned int act_id, int *reset, struct file_activity *file_actlst)
+{
+       unsigned char rtype;
+       int next;
+
+       if (lseek(ifd, fpos, SEEK_SET) < fpos) {
+               perror("lseek");
+               exit(2);
+       }
+       
+       if ((format == S_O_DB_OPTION) || (format == S_O_DBD_OPTION)) {
+               /* Print field list */
+               list_fields(act_id);
+       }
+
+       /*
+        * Restore the first stats collected.
+        * Used to compute the rate displayed on the first line.
+        */
+       copy_structures(act, id_seq, record_hdr, !*curr, 2);
+
+       *cnt  = count;
+
+       do {
+               /* Display <count> lines of stats */
+               *eosaf = sa_fread(ifd, &record_hdr[*curr], RECORD_HEADER_SIZE,
+                                 SOFT_SIZE);
+               rtype = record_hdr[*curr].record_type;
+
+               if (!*eosaf && (rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                       /* Read the extra fields since it's not a RESTART record */
+                       read_file_stat_bunch(act, *curr, ifd, file_hdr.sa_nr_act,
+                                            file_actlst);
+               }
+
+               if (!*eosaf && (rtype != R_RESTART)) {
+
+                       if (rtype == R_COMMENT) {
+                               sadf_print_special(*curr, tm_start.use, tm_end.use,
+                                             R_COMMENT, ifd);
+                               continue;
+                       }
+
+                       next = write_parsable_stats(*curr, *reset, cnt,
+                                                   tm_start.use, tm_end.use, act_id);
+
+                       if (next) {
+                               /*
+                                * next is set to 1 when we were close enough to desired interval.
+                                * In this case, the call to write_parsable_stats() has actually
+                                * displayed a line of stats.
+                                */
+                               *curr ^=1;
+                               if (*cnt > 0) {
+                                       (*cnt)--;
+                               }
+                       }
+                       *reset = FALSE;
+               }
+       }
+       while (*cnt && !*eosaf && (rtype != R_RESTART));
+
+       *reset = TRUE;
+}
+
+/*
+ ***************************************************************************
+ * Display activities for -x option.
+ *
+ * IN:
+ * @ifd                File descriptor of input file.
+ * @file_actlst        List of (known or unknown) activities in file.
+ ***************************************************************************
+ */
+void xml_display_loop(int ifd, struct file_activity *file_actlst)
+{
+       int curr, tab = 0, rtype;
+       int eosaf = TRUE, next, reset = FALSE;
+       long cnt = 1;
+       off_t fpos;
+       static __nr_t cpu_nr = -1;
+       
+       if (cpu_nr < 0) {
+               cpu_nr = act[get_activity_position(act, A_CPU)]->nr;
+       }
+
+       /* Save current file position */
+       if ((fpos = lseek(ifd, 0, SEEK_CUR)) < 0) {
+               perror("lseek");
+               exit(2);
+       }
+
+       /* Print XML header */
+       display_xml_header(&tab, cpu_nr);
+
+       /* Process activities */
+       xprintf(tab++, "<statistics>");
+       do {
+               /*
+                * If this record is a special (RESTART or COMMENT) one,
+                * skip it and try to read the next record in file.
+                */
+               do {
+                       eosaf = sa_fread(ifd, &record_hdr[0], RECORD_HEADER_SIZE, SOFT_SIZE);
+                       rtype = record_hdr[0].record_type;
+
+                       if (!eosaf && (rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                               /*
+                                * OK: Previous record was not a special one.
+                                * So read now the extra fields.
+                                */
+                               read_file_stat_bunch(act, 0, ifd, file_hdr.sa_nr_act,
+                                                    file_actlst);
+                               sadf_get_record_timestamp_struct(0);
+                       }
+
+                       if (!eosaf && (rtype == R_COMMENT)) {
+                               /*
+                                * Ignore COMMENT record.
+                                * (Unlike RESTART records, COMMENT records have an additional
+                                * comment field).
+                                */
+                               if (lseek(ifd, MAX_COMMENT_LEN, SEEK_CUR) < MAX_COMMENT_LEN) {
+                                       perror("lseek");
+                               }
+                       }
+               }
+               while (!eosaf && ((rtype == R_RESTART) || (rtype == R_COMMENT) ||
+                       (tm_start.use && (datecmp(&loctime, &tm_start) < 0)) ||
+                       (tm_end.use && (datecmp(&loctime, &tm_end) >=0))));
+
+               /* Save the first stats collected. Used for example in next_slice() function */
+               copy_structures(act, id_seq, record_hdr, 2, 0);
+
+               curr = 1;
+               cnt = count;
+               reset = TRUE;
+
+               if (!eosaf) {
+                       do {
+                               eosaf = sa_fread(ifd, &record_hdr[curr], RECORD_HEADER_SIZE,
+                                                SOFT_SIZE);
+                               rtype = record_hdr[curr].record_type;
+
+                               if (!eosaf && (rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                                       /* Read the extra fields since it's not a special record */
+                                       read_file_stat_bunch(act, curr, ifd, file_hdr.sa_nr_act,
+                                                            file_actlst);
+
+                                       /* next is set to 1 when we were close enough to desired interval */
+                                       next = write_xml_stats(curr, tm_start.use, tm_end.use, reset,
+                                                       &cnt, tab, cpu_nr);
+
+                                       if (next) {
+                                               curr ^= 1;
+                                               if (cnt > 0) {
+                                                       cnt--;
+                                               }
+                                       }
+                                       reset = FALSE;
+                               }
+
+                               if (!eosaf && (rtype == R_COMMENT)) {
+                                       /* Ignore COMMENT record */
+                                       if (lseek(ifd, MAX_COMMENT_LEN, SEEK_CUR) < MAX_COMMENT_LEN) {
+                                               perror("lseek");
+                                       }
+                               }
+                       }
+                       while (cnt && !eosaf && (rtype != R_RESTART));
+
+                       if (!cnt) {
+                               /* Go to next Linux restart, if possible */
+                               do {
+                                       eosaf = sa_fread(ifd, &record_hdr[curr], RECORD_HEADER_SIZE,
+                                                        SOFT_SIZE);
+                                       rtype = record_hdr[curr].record_type;
+                                       if (!eosaf && (rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                                               read_file_stat_bunch(act, curr, ifd, file_hdr.sa_nr_act,
+                                                                    file_actlst);
+                                       }
+                                       else if (!eosaf && (rtype == R_COMMENT)) {
+                                               /* Ignore COMMENT record */
+                                               if (lseek(ifd, MAX_COMMENT_LEN, SEEK_CUR) < MAX_COMMENT_LEN) {
+                                                       perror("lseek");
+                                               }
+                                       }
+                               }
+                               while (!eosaf && (rtype != R_RESTART));
+                       }
+                       reset = TRUE;
+               }
+       }
+       while (!eosaf);
+       xprintf(--tab, "</statistics>");
+
+       /* Rewind file */
+       if (lseek(ifd, fpos, SEEK_SET) < fpos) {
+               perror("lseek");
+               exit(2);
+       }
+
+       /* Process now RESTART entries to display restart messages */
+       xprintf(tab++, "<restarts>");
+       do {
+               if ((eosaf = sa_fread(ifd, &record_hdr[0], RECORD_HEADER_SIZE,
+                                     SOFT_SIZE)) == 0) {
+
+                       rtype = record_hdr[0].record_type;
+                       if ((rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                               read_file_stat_bunch(act, 0, ifd, file_hdr.sa_nr_act,
+                                                    file_actlst);
+                       }
+                       if (rtype == R_RESTART) {
+                               write_xml_restarts(0, tm_start.use, tm_end.use, tab);
+                       }
+                       else if (rtype == R_COMMENT) {
+                               /* Ignore COMMENT record */
+                               if (lseek(ifd, MAX_COMMENT_LEN, SEEK_CUR) < MAX_COMMENT_LEN) {
+                                       perror("lseek");
+                               }
+                       }
+               }
+       }
+       while (!eosaf);
+       xprintf(--tab, "</restarts>");
+
+       /* Rewind file */
+       if (lseek(ifd, fpos, SEEK_SET) < fpos) {
+               perror("lseek");
+               exit(2);
+       }
+
+       /* Last, process COMMENT entries to display comments */
+       if (DISPLAY_COMMENT(flags)) {
+               xprintf(tab++, "<comments>");
+               do {
+                       if ((eosaf = sa_fread(ifd, &record_hdr[0], RECORD_HEADER_SIZE,
+                                             SOFT_SIZE)) == 0) {
+
+                               rtype = record_hdr[0].record_type;
+                               if ((rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                                       read_file_stat_bunch(act, 0, ifd, file_hdr.sa_nr_act,
+                                                            file_actlst);
+                               }
+                               if (rtype == R_COMMENT) {
+                                       write_xml_comments(0, tm_start.use, tm_end.use,
+                                                          tab, ifd);
+                               }
+                       }
+               }
+               while (!eosaf);
+               xprintf(--tab, "</comments>");
+       }
+       
+       xprintf(--tab, "</host>");
+       xprintf(--tab, "</sysstat>");
+}
+
+/*
+ ***************************************************************************
+ * Display activities for -p and -d options.
+ *
+ * IN:
+ * @ifd                File descriptor of input file.
+ * @file_actlst        List of (known or unknown) activities in file.
+ ***************************************************************************
+ */
+void main_display_loop(int ifd, struct file_activity *file_actlst)
+{
+       int i, p;
+       int curr = 1, rtype;
+       int eosaf = TRUE, reset = FALSE;
+       long cnt = 1;
+       off_t fpos;
+       
+       /* Read system statistics from file */
+       do {
+               /*
+                * If this record is a special (RESTART or COMMENT) one, print it and
+                * (try to) get another one.
+                */
+               do {
+                       if (sa_fread(ifd, &record_hdr[0], RECORD_HEADER_SIZE, SOFT_SIZE))
+                               /* End of sa data file */
+                               return;
+
+                       rtype = record_hdr[0].record_type;
+                       if ((rtype == R_RESTART) || (rtype == R_COMMENT)) {
+                               sadf_print_special(0, tm_start.use, tm_end.use, rtype, ifd);
+                       }
+                       else {
+                               /*
+                                * OK: Previous record was not a special one.
+                                * So read now the extra fields.
+                                */
+                               read_file_stat_bunch(act, 0, ifd, file_hdr.sa_nr_act,
+                                                    file_actlst);
+                               sadf_get_record_timestamp_struct(0);
+                       }
+               }
+               while ((rtype == R_RESTART) || (rtype == R_COMMENT) ||
+                      (tm_start.use && (datecmp(&loctime, &tm_start) < 0)) ||
+                      (tm_end.use && (datecmp(&loctime, &tm_end) >=0)));
+
+               /* Save the first stats collected. Will be used to compute the average */
+               copy_structures(act, id_seq, record_hdr, 2, 0);
+
+               /* Set flag to reset last_uptime variable. Should be done after a LINUX RESTART record */
+               reset = TRUE;
+
+               /* Save current file position */
+               if ((fpos = lseek(ifd, 0, SEEK_CUR)) < 0) {
+                       perror("lseek");
+                       exit(2);
+               }
+
+               /* Read and write stats located between two possible Linux restarts */
+
+               if (DISPLAY_HORIZONTALLY(flags)) {
+                       /*
+                        * If stats are displayed horizontally, then all activities
+                        * are printed on the same line.
+                        */
+                       rw_curr_act_stats(ifd, fpos, &curr, &cnt, &eosaf,
+                                         ALL_ACTIVITIES, &reset, file_actlst);
+               }
+               else {
+                       /* For each requested activity... */
+                       for (i = 0; i < NR_ACT; i++) {
+                               
+                               if (!id_seq[i])
+                                       continue;
+                               
+                               if ((p = get_activity_position(act, id_seq[i])) < 0) {
+                                       /* Should never happen */
+                                       PANIC(1);
+                               }
+                               if (!IS_SELECTED(act[p]->options))
+                                       continue;
+
+                               if (!HAS_MULTIPLE_OUTPUTS(act[p]->options)) {
+                                       rw_curr_act_stats(ifd, fpos, &curr, &cnt, &eosaf,
+                                                         act[p]->id, &reset, file_actlst);
+                               }
+                               else {
+                                       unsigned int optf, msk;
+                                       
+                                       optf = act[p]->opt_flags;
+                                       
+                                       for (msk = 1; msk < 0x10; msk <<= 1) {
+                                               if (act[p]->opt_flags & msk) {
+                                                       act[p]->opt_flags &= msk;
+                                                       
+                                                       rw_curr_act_stats(ifd, fpos, &curr, &cnt, &eosaf,
+                                                                         act[p]->id, &reset, file_actlst);
+                                                       act[p]->opt_flags = optf;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               if (!cnt) {
+                       /* Go to next Linux restart, if possible */
+                       do {
+                               eosaf = sa_fread(ifd, &record_hdr[curr], RECORD_HEADER_SIZE,
+                                                SOFT_SIZE);
+                               rtype = record_hdr[curr].record_type;
+                               if (!eosaf && (rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                                       read_file_stat_bunch(act, curr, ifd, file_hdr.sa_nr_act,
+                                                            file_actlst);
+                               }
+                               else if (!eosaf && (rtype == R_COMMENT)) {
+                                       /* This was a COMMENT record: print it */
+                                       sadf_print_special(curr, tm_start.use, tm_end.use, R_COMMENT, ifd);
+                               }
+                       }
+                       while (!eosaf && (rtype != R_RESTART));
+               }
+
+               /* The last record we read was a RESTART one: Print it */
+               if (!eosaf && (record_hdr[curr].record_type == R_RESTART)) {
+                       sadf_print_special(curr, tm_start.use, tm_end.use, R_RESTART, ifd);
+               }
+       }
+       while (!eosaf);
+}
+
+/*
+ ***************************************************************************
+ * Read statistics from a system activity data file.
+ *
+ * IN:
+ * @dfile      System activity data file name.
+ ***************************************************************************
+ */
+void read_stats_from_file(char dfile[])
+{
+       struct file_magic file_magic;
+       struct file_activity *file_actlst = NULL;
+       int ifd, ignore;
+
+       /* Prepare file for reading */
+       ignore = (format == S_O_HDR_OPTION);
+       check_file_actlst(&ifd, dfile, act, &file_magic, &file_hdr,
+                         &file_actlst, id_seq, ignore);
+       
+       if (format == S_O_HDR_OPTION) {
+               /* Display data file header then exit */
+               display_file_header(dfile, &file_magic, &file_hdr);
+       }
+
+       /* Perform required allocations */
+       allocate_structures(act);
+
+       if (format == S_O_XML_OPTION) {
+               xml_display_loop(ifd, file_actlst);
+       }
+       else {
+               main_display_loop(ifd, file_actlst);
+       }
+
+       close(ifd);
+       
+       if (file_actlst) {
+               free(file_actlst);
+       }
+       free_structures(act);
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the sadf program
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int opt = 1, sar_options = 0;
+       int i;
+       char dfile[MAX_FILE_LEN];
+
+       /* Get HZ */
+       get_HZ();
+
+       /* Compute page shift in kB */
+       get_kb_shift();
+
+       dfile[0] = '\0';
+
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       tm_start.use = tm_end.use = FALSE;
+       
+       /* Allocate and init activity bitmaps */
+       allocate_bitmaps(act);
+
+       /* Init some structures */
+       init_structures();
+
+       /* Process options */
+       while (opt < argc) {
+
+               if (!strcmp(argv[opt], "-I")) {
+                       if (argv[++opt] && sar_options) {
+                               if (parse_sar_I_opt(argv, &opt, act)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-P")) {
+                       if (parse_sa_P_opt(argv, &opt, &flags, act)) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-s")) {
+                       /* Get time start */
+                       if (parse_timestamp(argv, &opt, &tm_start, DEF_TMSTART)) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-e")) {
+                       /* Get time end */
+                       if (parse_timestamp(argv, &opt, &tm_end, DEF_TMEND)) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "--")) {
+                       sar_options = 1;
+                       opt++;
+               }
+
+               else if (!strcmp(argv[opt], "-m")) {
+                       if (argv[++opt] && sar_options) {
+                               /* Parse sar's option -m */
+                               if (parse_sar_m_opt(argv, &opt, act)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-n")) {
+                       if (argv[++opt] && sar_options) {
+                               /* Parse sar's option -n */
+                               if (parse_sar_n_opt(argv, &opt, act)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strncmp(argv[opt], "-", 1)) {
+                       /* Other options not previously tested */
+                       if (sar_options) {
+                               if (parse_sar_opt(argv, &opt, act, &flags, C_SADF)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+
+                               for (i = 1; *(argv[opt] + i); i++) {
+
+                                       switch (*(argv[opt] + i)) {
+
+                                       case 'C':
+                                               flags |= S_F_COMMENT;
+                                               break;
+                                                       
+                                       case 'd':
+                                               if (format && (format != S_O_DB_OPTION)) {
+                                                       usage(argv[0]);
+                                               }
+                                               format = S_O_DB_OPTION;
+                                               break;
+
+                                       case 'D':
+                                               if (format && (format != S_O_DBD_OPTION)) {
+                                                       usage(argv[0]);
+                                               }
+                                               format = S_O_DBD_OPTION;
+                                               break;
+
+                                       case 'h':
+                                               flags |= S_F_HORIZONTALLY;
+                                               break;
+
+                                       case 'H':
+                                               if (format && (format != S_O_HDR_OPTION)) {
+                                                       usage(argv[0]);
+                                               }
+                                               format = S_O_HDR_OPTION;
+                                               break;
+
+                                       case 'p':
+                                               if (format && (format != S_O_PPC_OPTION)) {
+                                                       usage(argv[0]);
+                                               }
+                                               format = S_O_PPC_OPTION;
+                                               break;
+
+                                       case 't':
+                                               flags |= S_F_TRUE_TIME;
+                                               break;
+
+                                       case 'x':
+                                               if (format && (format != S_O_XML_OPTION)) {
+                                                       usage(argv[0]);
+                                               }
+                                               format = S_O_XML_OPTION;
+                                               break;
+
+                                       case 'V':
+                                               print_version();
+                                               break;
+
+                                       default:
+                                               usage(argv[0]);
+                                       }
+                               }
+                       }
+                       opt++;
+               }
+
+               /* Get data file name */
+               else if (strspn(argv[opt], DIGITS) != strlen(argv[opt])) {
+                       if (!dfile[0]) {
+                               if (!strcmp(argv[opt], "-")) {
+                                       /* File name set to '-' */
+                                       set_default_file(&rectime, dfile);
+                                       opt++;
+                               }
+                               else if (!strncmp(argv[opt], "-", 1)) {
+                                       /* Bad option */
+                                       usage(argv[0]);
+                               }
+                               else {
+                                       /* Write data to file */
+                                       strncpy(dfile, argv[opt++], MAX_FILE_LEN);
+                                       dfile[MAX_FILE_LEN - 1] = '\0';
+                               }
+                       }
+                       else {
+                               /* File already specified */
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (interval < 0) {
+                       /* Get interval */
+                       if (strspn(argv[opt], DIGITS) != strlen(argv[opt])) {
+                               usage(argv[0]);
+                       }
+                       interval = atol(argv[opt++]);
+                       if (interval <= 0) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else {
+                       /* Get count value */
+                       if (strspn(argv[opt], DIGITS) != strlen(argv[opt])) {
+                               usage(argv[0]);
+                       }
+                       if (count) {
+                               /* Count parameter already set */
+                               usage(argv[0]);
+                       }
+                       count = atol(argv[opt++]);
+                       if (count < 0) {
+                               usage(argv[0]);
+                       }
+                       else if (!count) {
+                               count = -1;     /* To generate a report continuously */
+                       }
+               }
+       }
+
+       /* sadf reads current daily data file by default */
+       if (!dfile[0]) {
+               set_default_file(&rectime, dfile);
+       }
+
+       if (tm_start.use && tm_end.use && (tm_end.tm_hour < tm_start.tm_hour)) {
+               tm_end.tm_hour += 24;
+       }
+
+       /*
+        * Display all the contents of the daily data file if the count parameter
+        * was not set on the command line.
+        */
+       if (!count) {
+               count = -1;
+       }
+
+       /* Default is CPU activity and PPC display */
+       select_default_activity(act);
+       
+       if (!format) {
+               if (DISPLAY_HORIZONTALLY(flags)) {
+                       format = S_O_DB_OPTION;
+               }
+               else {
+                       format = S_O_PPC_OPTION;
+               }
+       }
+       if (DISPLAY_HORIZONTALLY(flags) && (format != S_O_DB_OPTION)) {
+               /* Remove option -h if not used with option -d */
+               flags &= ~S_F_HORIZONTALLY;
+       }
+
+       if (interval < 0) {
+               interval = 1;
+       }
+
+       /* Read stats from file */
+       read_stats_from_file(dfile);
+
+       /* Free bitmaps */
+       free_bitmaps(act);
+
+       return 0;
+}
diff --git a/sadf.h b/sadf.h
new file mode 100644 (file)
index 0000000..3b6cc0b
--- /dev/null
+++ b/sadf.h
@@ -0,0 +1,19 @@
+/*
+ * sadf: System activity data formatter
+ * (C) 1999-2010 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _SADF_H
+#define _SADF_H
+
+/* Output formats (O_= Output)  */
+#define S_O_HDR_OPTION         1
+#define S_O_PPC_OPTION         2
+#define S_O_DB_OPTION          3
+#define S_O_XML_OPTION         4
+#define S_O_DBD_OPTION         5
+
+/* DTD version for XML output */
+#define XML_DTD_VERSION        "2.8"
+
+#endif  /* _SADF_H */
diff --git a/sar.c b/sar.c
new file mode 100644 (file)
index 0000000..a48bb7f
--- /dev/null
+++ b/sar.c
@@ -0,0 +1,1355 @@
+/*
+ * sar: report system activity
+ * (C) 1999-2010 by Sebastien GODARD (sysstat <at> orange.fr)
+ *
+ ***************************************************************************
+ * 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 of the License, or (at  your *
+ * option) any later version.                                              *
+ *                                                                         *
+ * This program is distributed in the hope that it  will  be  useful,  but *
+ * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
+ * for more details.                                                       *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                   *
+ ***************************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include <errno.h>
+
+#include "version.h"
+#include "sa.h"
+#include "common.h"
+#include "ioconf.h"
+#include "pr_stats.h"
+
+#ifdef USE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(string) gettext(string)
+#else
+#define _(string) (string)
+#endif
+
+#define SCCSID "@(#)sysstat-" VERSION ": " __FILE__ " compiled " __DATE__ " " __TIME__
+char *sccsid(void) { return (SCCSID); }
+
+/* Interval and count parameters */
+long interval = -1, count = 0;
+
+/* TRUE if a header line must be printed */
+int dis = TRUE;
+
+unsigned int flags = 0;
+char timestamp[2][TIMESTAMP_LEN];
+
+unsigned long avg_count = 0;
+
+/* File header */
+struct file_header file_hdr;
+
+/* Current record header */
+struct record_header record_hdr[3];
+
+/*
+ * Activity sequence.
+ * This array must always be entirely filled (even with trailing zeros).
+ */
+unsigned int id_seq[NR_ACT];
+
+struct tm rectime;
+
+/* Contain the date specified by -s and -e options */
+struct tstamp tm_start, tm_end;
+
+char *args[MAX_ARGV_NR];
+
+extern struct activity *act[];
+
+/*
+ ***************************************************************************
+ * Print usage title message.
+ *
+ * IN:
+ * @progname   Name of sysstat command
+ ***************************************************************************
+ */
+void print_usage_title(char *progname)
+{
+       fprintf(stderr, _("Usage: %s [ options ] [ <interval> [ <count> ] ]\n"),
+               progname);
+}
+
+/*
+ ***************************************************************************
+ * Print usage and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command
+ ***************************************************************************
+ */
+void usage(char *progname)
+{
+
+       print_usage_title(progname);
+       fprintf(stderr, _("Options are:\n"
+                         "[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -p ] [ -q ] [ -r ]\n"
+                         "[ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]\n"
+                         "[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]\n"
+                         "[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]\n"
+                         "[ -o [ <filename> ] | -f [ <filename> ] ]\n"
+                         "[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * Display a short help message and exit.
+ *
+ * IN:
+ * @progname   Name of sysstat command
+ ***************************************************************************
+ */
+void display_help(char *progname)
+{
+
+       print_usage_title(progname);
+       fprintf(stderr, _("Main options and reports:\n"));
+       fprintf(stderr, _("\t-b\tI/O and transfer rate statistics\n"));
+       fprintf(stderr, _("\t-B\tPaging statistics\n"));
+       fprintf(stderr, _("\t-d\tBlock device statistics\n"));
+       fprintf(stderr, _("\t-I { <int> | SUM | ALL | XALL }\n"
+                         "\t\tInterrupts statistics\n"));
+       fprintf(stderr, _("\t-m { <keyword> [,...] | ALL }\n"
+                         "\t\tPower management statistics\n"
+                         "\t\tKeywords are:\n"
+                         "\t\tCPU\tCPU clock frequency\n"
+                         "\t\tFAN\tFans speed\n"
+                         "\t\tIN\tVoltage inputs\n"
+                         "\t\tTEMP\tDevices temperature\n"));
+       fprintf(stderr, _("\t-n { <keyword> [,...] | ALL }\n"
+                         "\t\tNetwork statistics\n"
+                         "\t\tKeywords are:\n"
+                         "\t\tDEV\tNetwork interfaces\n"
+                         "\t\tEDEV\tNetwork interfaces (errors)\n"
+                         "\t\tNFS\tNFS client\n"
+                         "\t\tNFSD\tNFS server\n"
+                         "\t\tSOCK\tSockets\t(v4)\n"
+                         "\t\tIP\tIP traffic\t(v4)\n"
+                         "\t\tEIP\tIP traffic\t(v4) (errors)\n"
+                         "\t\tICMP\tICMP traffic\t(v4)\n"
+                         "\t\tEICMP\tICMP traffic\t(v4) (errors)\n"
+                         "\t\tTCP\tTCP traffic\t(v4)\n"
+                         "\t\tETCP\tTCP traffic\t(v4) (errors)\n"
+                         "\t\tUDP\tUDP traffic\t(v4)\n"
+                         "\t\tSOCK6\tSockets\t(v6)\n"
+                         "\t\tIP6\tIP traffic\t(v6)\n"
+                         "\t\tEIP6\tIP traffic\t(v6) (errors)\n"
+                         "\t\tICMP6\tICMP traffic\t(v6)\n"
+                         "\t\tEICMP6\tICMP traffic\t(v6) (errors)\n"
+                         "\t\tUDP6\tUDP traffic\t(v6)\n"));
+       fprintf(stderr, _("\t-q\tQueue length and load average statistics\n"));
+       fprintf(stderr, _("\t-r\tMemory utilization statistics\n"));
+       fprintf(stderr, _("\t-R\tMemory statistics\n"));
+       fprintf(stderr, _("\t-S\tSwap space utilization statistics\n"));
+       fprintf(stderr, _("\t-u [ ALL ]\n"
+                         "\t\tCPU utilization statistics\n"));
+       fprintf(stderr, _("\t-v\tKernel table statistics\n"));
+       fprintf(stderr, _("\t-w\tTask creation and system switching statistics\n"));
+       fprintf(stderr, _("\t-W\tSwapping statistics\n"));
+       fprintf(stderr, _("\t-y\tTTY device statistics\n"));
+       exit(1);
+}
+
+/*
+ ***************************************************************************
+ * Init some structures.
+ ***************************************************************************
+ */
+void init_structures(void)
+{
+       int i;
+       
+       for (i = 0; i < 3; i++)
+               memset(&record_hdr[i], 0, RECORD_HEADER_SIZE);
+}
+
+/*
+ ***************************************************************************
+ * Allocate memory for sadc args.
+ *
+ * IN:
+ * @i          Argument number.
+ * @ltemp      Argument value.
+ ***************************************************************************
+ */
+void salloc(int i, char *ltemp)
+{
+       if ((args[i] = (char *) malloc(strlen(ltemp) + 1)) == NULL) {
+               perror("malloc");
+               exit(4);
+       }
+       strcpy(args[i], ltemp);
+}
+
+/*
+ ***************************************************************************
+ * Display an error message. Happens when the data collector doesn't send
+ * enough data.
+ ***************************************************************************
+ */
+void print_read_error(void)
+{
+       fprintf(stderr, _("End of data collecting unexpected\n"));
+       exit(3);
+}
+
+/*
+ ***************************************************************************
+ * Check that every selected activity actually belongs to the sequence list.
+ * If not, then the activity should be unselected since it will not be sent
+ * by sadc. An activity can be unsent if its number of items is null.
+ *
+ * IN:
+ * @act_nr     Size of sequence list.
+ ***************************************************************************
+ */
+void reverse_check_act(unsigned int act_nr)
+{
+       int i, j;
+       
+       for (i = 0; i < NR_ACT; i++) {
+               
+               if (IS_SELECTED(act[i]->options)) {
+                       
+                       for (j = 0; j < act_nr; j++) {
+                               if (id_seq[j] == act[i]->id)
+                                       break;
+                       }
+                       if (j == act_nr)
+                               act[i]->options &= ~AO_SELECTED;
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Fill the rectime structure with current record's time, based on current
+ * record's time data saved in file.
+ * The resulting timestamp is expressed in the locale of the file creator
+ * or in the user's own locale depending on whether option -t has been used
+ * or not.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+*/
+void sar_get_record_timestamp_struct(int curr)
+{
+       struct tm *ltm;
+
+       /* Check if option -t was specified on the command line */
+       if (PRINT_TRUE_TIME(flags)) {
+               /* -t */
+               rectime.tm_hour = record_hdr[curr].hour;
+               rectime.tm_min  = record_hdr[curr].minute;
+               rectime.tm_sec  = record_hdr[curr].second;
+       }
+       else {
+               ltm = localtime((const time_t *) &record_hdr[curr].ust_time);
+               rectime = *ltm;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Determine if a stat header line has to be displayed.
+ *
+ * RETURNS:
+ * TRUE if a header line has to be displayed.
+ ***************************************************************************
+*/
+int check_line_hdr(void)
+{
+       int i, rc = FALSE;
+
+       /* Get number of options entered on the command line */
+       if (get_activity_nr(act, AO_SELECTED, COUNT_OUTPUTS) > 1)
+               return TRUE;
+       
+       for (i = 0; i < NR_ACT; i++) {
+               if (IS_SELECTED(act[i]->options)) {
+                       /* Special processing for activities using a bitmap */
+                       if (act[i]->bitmap) {
+                               if (count_bits(act[i]->bitmap->b_array,
+                                              BITMAP_SIZE(act[i]->bitmap->b_size)) > 1) {
+                                       rc = TRUE;
+                               }
+                       }
+                       else if (act[i]->nr > 1) {
+                               rc = TRUE;
+                       }
+                       /* Stop now since we have only one selected activity */
+                       break;
+               }
+       }
+
+       return rc;
+}
+
+/*
+ ***************************************************************************
+ * Set current record's timestamp string.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ * @len                Maximum length of timestamp string.
+ *
+ * OUT:
+ * @cur_time   Timestamp string.
+ ***************************************************************************
+*/
+void set_record_timestamp_string(int curr, char *cur_time, int len)
+{
+       /* Fill timestamp structure */
+       sar_get_record_timestamp_struct(curr);
+
+       /* Set cur_time date value */
+       strftime(cur_time, len, "%X", &rectime);
+}
+
+/*
+ ***************************************************************************
+ * Print statistics average.
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @read_from_file     Set to TRUE if stats are read from a system activity
+ *                     data file.
+ * @act_id             Activity that can be displayed, or ~0 for all.
+ *                     Remember that when reading stats from a file, only
+ *                     one activity can be displayed at a time.
+ ***************************************************************************
+ */
+void write_stats_avg(int curr, int read_from_file, unsigned int act_id)
+{
+       int i;
+       unsigned long long itv, g_itv;
+       static __nr_t cpu_nr = -1;
+       
+       if (cpu_nr < 0)
+               cpu_nr = act[get_activity_position(act, A_CPU)]->nr;
+
+       /* Interval value in jiffies */
+       g_itv = get_interval(record_hdr[2].uptime, record_hdr[curr].uptime);
+
+       if (cpu_nr > 1)
+               itv = get_interval(record_hdr[2].uptime0, record_hdr[curr].uptime0);
+       else
+               itv = g_itv;
+
+       strcpy(timestamp[curr], _("Average:"));
+       strcpy(timestamp[!curr], timestamp[curr]);
+       
+       /* Test stdout */
+       TEST_STDOUT(STDOUT_FILENO);
+       
+       for (i = 0; i < NR_ACT; i++) {
+               
+               if ((act_id != ALL_ACTIVITIES) && (act[i]->id != act_id))
+                       continue;
+               
+               if (IS_SELECTED(act[i]->options) && (act[i]->nr > 0)) {
+                       /* Display current average activity statistics */
+                       if (NEEDS_GLOBAL_ITV(act[i]->options))
+                               (*act[i]->f_print_avg)(act[i], 2, curr, g_itv);
+                       else
+                               (*act[i]->f_print_avg)(act[i], 2, curr, itv);
+               }
+       }
+
+       if (read_from_file) {
+               /*
+                * Reset number of lines printed only if we read stats
+                * from a system activity file.
+                */
+               avg_count = 0;
+       }
+}
+
+/*
+ ***************************************************************************
+ * Print system statistics.
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @read_from_file     Set to TRUE if stats are read from a system activity
+ *                     data file.
+ * @use_tm_start       Set to TRUE if option -s has been used.
+ * @use_tm_end         Set to TRUE if option -e has been used.
+ * @reset              Set to TRUE if last_uptime variable should be
+ *                     reinitialized (used in next_slice() function).
+ * @act_id             Activity that can be displayed or ~0 for all.
+ *                     Remember that when reading stats from a file, only
+ *                     one activity can be displayed at a time.
+ *
+ * OUT:
+ * @cnt                        Number of remaining lines to display.
+ *
+ * RETURNS:
+ * 1 if stats have been successfully displayed.
+ ***************************************************************************
+ */
+int write_stats(int curr, int read_from_file, long *cnt, int use_tm_start,
+               int use_tm_end, int reset, unsigned int act_id)
+{
+       int i;
+       unsigned long long itv, g_itv;
+       static int cross_day = 0;
+       static __nr_t cpu_nr = -1;
+
+       if (cpu_nr < 0)
+               cpu_nr = act[get_activity_position(act, A_CPU)]->nr;
+
+       /* Check time (1) */
+       if (read_from_file) {
+               if (!next_slice(record_hdr[2].uptime0, record_hdr[curr].uptime0,
+                               reset, interval))
+                       /* Not close enough to desired interval */
+                       return 0;
+       }
+
+       /* Set previous timestamp */
+       set_record_timestamp_string(!curr, timestamp[!curr], 16);
+       /* Set current timestamp */
+       set_record_timestamp_string(curr,  timestamp[curr],  16);
+
+       /* Check if we are beginning a new day */
+       if (use_tm_start && record_hdr[!curr].ust_time &&
+           (record_hdr[curr].ust_time > record_hdr[!curr].ust_time) &&
+           (record_hdr[curr].hour < record_hdr[!curr].hour)) {
+               cross_day = 1;
+       }
+
+       if (cross_day) {
+               /*
+                * This is necessary if we want to properly handle something like:
+                * sar -s time_start -e time_end with
+                * time_start(day D) > time_end(day D+1)
+                */
+               rectime.tm_hour +=24;
+       }
+
+       /* Check time (2) */
+       if (use_tm_start && (datecmp(&rectime, &tm_start) < 0))
+               /* it's too soon... */
+               return 0;
+
+       /* Get interval values */
+       get_itv_value(&record_hdr[curr], &record_hdr[!curr],
+                     cpu_nr, &itv, &g_itv);
+
+       /* Check time (3) */
+       if (use_tm_end && (datecmp(&rectime, &tm_end) > 0)) {
+               /* It's too late... */
+               *cnt = 0;
+               return 0;
+       }
+
+       avg_count++;
+       
+       /* Test stdout */
+       TEST_STDOUT(STDOUT_FILENO);
+
+       for (i = 0; i < NR_ACT; i++) {
+
+               if ((act_id != ALL_ACTIVITIES) && (act[i]->id != act_id))
+                       continue;
+
+               if (IS_SELECTED(act[i]->options) && (act[i]->nr > 0)) {
+                       /* Display current activity statistics */
+                       if (NEEDS_GLOBAL_ITV(act[i]->options))
+                               (*act[i]->f_print)(act[i], !curr, curr, g_itv);
+                       else
+                               (*act[i]->f_print)(act[i], !curr, curr, itv);
+               }
+       }
+
+       return 1;
+}
+
+/*
+ ***************************************************************************
+ * Display stats since system startup.
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void write_stats_startup(int curr)
+{
+       int i;
+
+       /* Set to 0 previous structures corresponding to boot time */
+       memset(&record_hdr[!curr], 0, RECORD_HEADER_SIZE);
+       record_hdr[!curr].record_type = R_STATS;
+       record_hdr[!curr].hour        = record_hdr[curr].hour;
+       record_hdr[!curr].minute      = record_hdr[curr].minute;
+       record_hdr[!curr].second      = record_hdr[curr].second;
+       record_hdr[!curr].ust_time    = record_hdr[curr].ust_time;
+
+       for (i = 0; i < NR_ACT; i++) {
+               if (IS_SELECTED(act[i]->options) && (act[i]->nr > 0))
+                       memset(act[i]->buf[!curr], 0, act[i]->msize * act[i]->nr);
+       }
+       
+       flags |= S_F_SINCE_BOOT;
+       dis = TRUE;
+       
+       write_stats(curr, USE_SADC, &count, NO_TM_START, NO_TM_END, NO_RESET, ALL_ACTIVITIES);
+       
+       exit(0);
+}
+
+/*
+ ***************************************************************************
+ * Read data sent by the data collector.
+ *
+ * IN:
+ * @size       Number of bytes of data to read.
+ *
+ * OUT:
+ * @buffer     Buffer where data will be saved.
+ *
+ * RETURNS:
+ * 1 if end of file has been reached, 0 otherwise.
+ ***************************************************************************
+ */
+int sa_read(void *buffer, int size)
+{
+       int n;
+
+       while (size) {
+
+               if ((n = read(STDIN_FILENO, buffer, size)) < 0) {
+                       perror("read");
+                       exit(2);
+               }
+
+               if (!n)
+                       return 1;       /* EOF */
+
+               size -= n;
+               buffer = (char *) buffer + n;
+       }
+
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Print a Linux restart message (contents of a RESTART record) or a
+ * comment (contents of a COMMENT record).
+ *
+ * IN:
+ * @curr               Index in array for current sample statistics.
+ * @use_tm_start       Set to TRUE if option -s has been used.
+ * @use_tm_end         Set to TRUE if option -e has been used.
+ * @rtype              Record type to display.
+ * @ifd                        Input file descriptor.
+ *
+ * RETURNS:
+ * 1 if the record has been successfully displayed.
+ ***************************************************************************
+ */
+int sar_print_special(int curr, int use_tm_start, int use_tm_end, int rtype, int ifd)
+{
+       char cur_time[26];
+       int dp = 1;
+
+       set_record_timestamp_string(curr, cur_time, 26);
+
+       /* The record must be in the interval specified by -s/-e options */
+       if ((use_tm_start && (datecmp(&rectime, &tm_start) < 0)) ||
+           (use_tm_end && (datecmp(&rectime, &tm_end) > 0))) {
+               dp = 0;
+       }
+
+       if (rtype == R_RESTART) {
+               if (dp) {
+                       printf("\n%-11s       LINUX RESTART\n", cur_time);
+                       return 1;
+               }
+       }
+       else if (rtype == R_COMMENT) {
+               char file_comment[MAX_COMMENT_LEN];
+
+               /* Don't forget to read comment record even if it won't be displayed... */
+               sa_fread(ifd, file_comment, MAX_COMMENT_LEN, HARD_SIZE);
+               file_comment[MAX_COMMENT_LEN - 1] = '\0';
+
+               if (dp && DISPLAY_COMMENT(flags)) {
+                       printf("%-11s  COM %s\n", cur_time, file_comment);
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+/*
+ ***************************************************************************
+ * Read the various statistics sent by the data collector (sadc).
+ *
+ * IN:
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+void read_sadc_stat_bunch(int curr)
+{
+       int i, p;
+       
+       /* Read record header (type is always R_STATS since it is read from sadc) */
+       if (sa_read(&record_hdr[curr], RECORD_HEADER_SIZE)) {
+               print_read_error();
+       }
+       
+       for (i = 0; i < NR_ACT; i++) {
+               
+               if (!id_seq[i])
+                       continue;
+               if ((p = get_activity_position(act, id_seq[i])) < 0) {
+                       PANIC(1);
+               }
+               
+               if (sa_read(act[p]->buf[curr], act[p]->fsize * act[p]->nr)) {
+                       print_read_error();
+               }
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read stats for current activity from file and display them.
+ *
+ * IN:
+ * @ifd                Input file descriptor.
+ * @fpos       Position in file where reading must start.
+ * @curr       Index in array for current sample statistics.
+ * @rows       Number of rows of screen.
+ * @act_id     Activity to display.
+ * @file_actlst        List of activities in file.
+ *
+ * OUT:
+ * @curr       Index in array for next sample statistics.
+ * @cnt                Number of remaining lines of stats to write.
+ * @eosaf      Set to TRUE if EOF (end of file) has been reached.
+ * @reset      Set to TRUE if last_uptime variable should be
+ *             reinitialized (used in next_slice() function).
+ ***************************************************************************
+ */
+void handle_curr_act_stats(int ifd, off_t fpos, int *curr, long *cnt, int *eosaf,
+                          int rows, unsigned int act_id, int *reset,
+                          struct file_activity *file_actlst)
+{
+       int p;
+       unsigned long lines = 0;
+       unsigned char rtype;
+       int davg = 0, next, inc = -2;
+
+       if (lseek(ifd, fpos, SEEK_SET) < fpos) {
+               perror("lseek");
+               exit(2);
+       }
+
+       /*
+        * Restore the first stats collected.
+        * Used to compute the rate displayed on the first line.
+        */
+       copy_structures(act, id_seq, record_hdr, !*curr, 2);
+
+       *cnt  = count;
+
+       /* Assess number of lines printed */
+       if ((p = get_activity_position(act, act_id)) >= 0) {
+               if (act[p]->bitmap) {
+                       inc = count_bits(act[p]->bitmap->b_array,
+                                        BITMAP_SIZE(act[p]->bitmap->b_size));
+               }
+               else {
+                       inc = act[p]->nr;
+               }
+       }
+       if (inc < 0) {
+               /* Should never happen */
+               PANIC(inc);
+       }
+
+       do {
+               /* Display count lines of stats */
+               *eosaf = sa_fread(ifd, &record_hdr[*curr],
+                                 RECORD_HEADER_SIZE, SOFT_SIZE);
+               rtype = record_hdr[*curr].record_type;
+
+               if (!*eosaf && (rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                       /* Read the extra fields since it's not a special record */
+                       read_file_stat_bunch(act, *curr, ifd, file_hdr.sa_nr_act, file_actlst);
+               }
+
+               if ((lines >= rows) || !lines) {
+                       lines = 0;
+                       dis = 1;
+               }
+               else
+                       dis = 0;
+
+               if (!*eosaf && (rtype != R_RESTART)) {
+
+                       if (rtype == R_COMMENT) {
+                               /* Display comment */
+                               next = sar_print_special(*curr, tm_start.use, tm_end.use,
+                                                    R_COMMENT, ifd);
+                               if (next) {
+                                       /* A line of comment was actually displayed */
+                                       lines++;
+                               }
+                               continue;
+                       }
+
+                       /* next is set to 1 when we were close enough to desired interval */
+                       next = write_stats(*curr, USE_SA_FILE, cnt, tm_start.use, tm_end.use,
+                                          *reset, act_id);
+                       if (next && (*cnt > 0)) {
+                               (*cnt)--;
+                       }
+                       if (next) {
+                               davg++;
+                               *curr ^=1;
+                               lines += inc;
+                       }
+                       *reset = FALSE;
+               }
+       }
+       while (*cnt && !*eosaf && (rtype != R_RESTART));
+
+       if (davg) {
+               write_stats_avg(!*curr, USE_SA_FILE, act_id);
+       }
+
+       *reset = TRUE;
+}
+
+/*
+ ***************************************************************************
+ * Read header data sent by sadc.
+ ***************************************************************************
+ */
+void read_header_data(void)
+{
+       struct file_magic file_magic;
+       struct file_activity file_act;
+       int rc, i, p;
+       char version[16];
+
+       /* Read magic header */
+       rc = sa_read(&file_magic, FILE_MAGIC_SIZE);
+
+       sprintf(version, "%d.%d.%d.%d",
+               file_magic.sysstat_version,
+               file_magic.sysstat_patchlevel,
+               file_magic.sysstat_sublevel,
+               file_magic.sysstat_extraversion);
+       if (!file_magic.sysstat_extraversion) {
+               version[strlen(version) - 2] = '\0';
+       }
+
+       if (rc || (file_magic.sysstat_magic != SYSSTAT_MAGIC) ||
+           (file_magic.format_magic != FORMAT_MAGIC) ||
+           strcmp(version, VERSION)) {
+
+               /* sar and sadc commands are not consistent */
+               fprintf(stderr, _("Invalid data format\n"));
+
+               if (!rc && (file_magic.sysstat_magic == SYSSTAT_MAGIC)) {
+                       fprintf(stderr,
+                               _("Using a wrong data collector from a different sysstat version\n"));
+               }
+               exit(3);
+       }
+
+       /* Read header data */
+       if (sa_read(&file_hdr, FILE_HEADER_SIZE)) {
+               print_read_error();
+       }
+       
+       /* Read activity list */
+       for (i = 0; i < file_hdr.sa_nr_act; i++) {
+               
+               if (sa_read(&file_act, FILE_ACTIVITY_SIZE)) {
+                       print_read_error();
+               }
+
+               p = get_activity_position(act, file_act.id);
+
+               if ((p < 0) || (act[p]->fsize != file_act.size) || !file_act.nr) {
+                       fprintf(stderr, _("Inconsistent input data\n"));
+                       exit(3);
+               }
+
+               id_seq[i]   = file_act.id;      /* We necessarily have "i < NR_ACT" */
+               act[p]->nr  = file_act.nr;
+       }
+
+       while (i < NR_ACT) {
+               id_seq[i++] = 0;
+       }
+       
+       /* Check that all selected activties are actually sent by sadc */
+       reverse_check_act(file_hdr.sa_nr_act);
+}
+
+/*
+ ***************************************************************************
+ * Read statistics from a system activity data file.
+ *
+ * IN:
+ * @from_file  Input file name.
+ ***************************************************************************
+ */
+void read_stats_from_file(char from_file[])
+{
+       struct file_magic file_magic;
+       struct file_activity *file_actlst = NULL;
+       int curr = 1, i, p;
+       int ifd, rtype;
+       int rows, eosaf = TRUE, reset = FALSE;
+       long cnt = 1;
+       off_t fpos;
+
+       /* Get window size */
+       rows = get_win_height();
+
+       /* Read file headers and activity list */
+       check_file_actlst(&ifd, from_file, act, &file_magic, &file_hdr,
+                         &file_actlst, id_seq, FALSE);
+
+       /* Perform required allocations */
+       allocate_structures(act);
+
+       /* Print report header */
+       print_report_hdr(flags, &rectime, &file_hdr,
+                        act[get_activity_position(act, A_CPU)]->nr);
+
+       /* Read system statistics from file */
+       do {
+               /*
+                * If this record is a special (RESTART or COMMENT) one, print it and
+                * (try to) get another one.
+                */
+               do {
+                       if (sa_fread(ifd, &record_hdr[0], RECORD_HEADER_SIZE, SOFT_SIZE))
+                               /* End of sa data file */
+                               return;
+
+                       rtype = record_hdr[0].record_type;
+                       if ((rtype == R_RESTART) || (rtype == R_COMMENT)) {
+                               sar_print_special(0, tm_start.use, tm_end.use, rtype, ifd);
+                       }
+                       else {
+                               /*
+                                * OK: Previous record was not a special one.
+                                * So read now the extra fields.
+                                */
+                               read_file_stat_bunch(act, 0, ifd, file_hdr.sa_nr_act,
+                                                    file_actlst);
+                               sar_get_record_timestamp_struct(0);
+                       }
+               }
+               while ((rtype == R_RESTART) || (rtype == R_COMMENT) ||
+                      (tm_start.use && (datecmp(&rectime, &tm_start) < 0)) ||
+                      (tm_end.use && (datecmp(&rectime, &tm_end) >=0)));
+
+               /* Save the first stats collected. Will be used to compute the average */
+               copy_structures(act, id_seq, record_hdr, 2, 0);
+
+               reset = TRUE;   /* Set flag to reset last_uptime variable */
+
+               /* Save current file position */
+               if ((fpos = lseek(ifd, 0, SEEK_CUR)) < 0) {
+                       perror("lseek");
+                       exit(2);
+               }
+
+               /* Read and write stats located between two possible Linux restarts */
+               for (i = 0; i < NR_ACT; i++) {
+
+                       if (!id_seq[i])
+                               continue;
+                       
+                       if ((p = get_activity_position(act, id_seq[i])) < 0) {
+                               /* Should never happen */
+                               PANIC(1);
+                       }
+                       if (!IS_SELECTED(act[p]->options))
+                               continue;
+                       
+                       if (!HAS_MULTIPLE_OUTPUTS(act[p]->options)) {
+                               handle_curr_act_stats(ifd, fpos, &curr, &cnt, &eosaf, rows,
+                                                     act[p]->id, &reset, file_actlst);
+                       }
+                       else {
+                               unsigned int optf, msk;
+                               
+                               optf = act[p]->opt_flags;
+                               
+                               for (msk = 1; msk < 0x10; msk <<= 1) {
+                                       if (act[p]->opt_flags & msk) {
+                                               act[p]->opt_flags &= msk;
+                                               
+                                               handle_curr_act_stats(ifd, fpos, &curr, &cnt,
+                                                                     &eosaf, rows, act[p]->id,
+                                                                     &reset, file_actlst);
+                                               act[p]->opt_flags = optf;
+                                       }
+                               }
+                       }
+               }
+
+               if (!cnt) {
+                       /* Go to next Linux restart, if possible */
+                       do {
+                               eosaf = sa_fread(ifd, &record_hdr[curr], RECORD_HEADER_SIZE,
+                                                SOFT_SIZE);
+                               rtype = record_hdr[curr].record_type;
+                               if (!eosaf && (rtype != R_RESTART) && (rtype != R_COMMENT)) {
+                                       read_file_stat_bunch(act, curr, ifd, file_hdr.sa_nr_act,
+                                                            file_actlst);
+                               }
+                               else if (!eosaf && (rtype == R_COMMENT)) {
+                                       /* This was a COMMENT record: print it */
+                                       sar_print_special(curr, tm_start.use, tm_end.use, R_COMMENT, ifd);
+                               }
+                       }
+                       while (!eosaf && (rtype != R_RESTART));
+               }
+
+               /* The last record we read was a RESTART one: Print it */
+               if (!eosaf && (record_hdr[curr].record_type == R_RESTART)) {
+                       sar_print_special(curr, tm_start.use, tm_end.use, R_RESTART, ifd);
+               }
+       }
+       while (!eosaf);
+
+       close(ifd);
+       
+       if (file_actlst) {
+               free(file_actlst);
+       }
+}
+
+/*
+ ***************************************************************************
+ * Read statistics sent by sadc, the data collector.
+ ***************************************************************************
+ */
+void read_stats(void)
+{
+       int curr = 1;
+       unsigned long lines;
+       unsigned int rows = 23;
+       int dis_hdr = 0;
+
+       /* Don't buffer data if redirected to a pipe... */
+       setbuf(stdout, NULL);
+
+       /* Read stats header */
+       read_header_data();
+
+       if (!get_activity_nr(act, AO_SELECTED, COUNT_ACTIVITIES)) {
+               fprintf(stderr, _("Requested activities not available\n"));
+               exit(1);
+       }
+
+       /* Determine if a stat line header has to be displayed */
+       dis_hdr = check_line_hdr();
+
+       lines = rows = get_win_height();
+
+       /* Perform required allocations */
+       allocate_structures(act);
+
+       /* Print report header */
+       print_report_hdr(flags, &rectime, &file_hdr,
+                        act[get_activity_position(act, A_CPU)]->nr);
+
+       /* Read system statistics sent by the data collector */
+       read_sadc_stat_bunch(0);
+
+       if (!interval) {
+               /* Display stats since boot time and exit */
+               write_stats_startup(0);
+       }
+
+       /* Save the first stats collected. Will be used to compute the average */
+       copy_structures(act, id_seq, record_hdr, 2, 0);
+
+       /* Main loop */
+       do {
+
+               /* Get stats */
+               read_sadc_stat_bunch(curr);
+
+               /* Print results */
+               if (!dis_hdr) {
+                       dis = lines / rows;
+                       if (dis) {
+                               lines %= rows;
+                       }
+                       lines++;
+               }
+               write_stats(curr, USE_SADC, &count, NO_TM_START, tm_end.use,
+                           NO_RESET, ALL_ACTIVITIES);
+
+               if (record_hdr[curr].record_type == R_LAST_STATS) {
+                       /* File rotation is happening: Re-read header data sent by sadc */
+                       read_header_data();
+                       allocate_structures(act);
+               }
+
+               if (count > 0) {
+                       count--;
+               }
+               if (count) {
+                       curr ^= 1;
+               }
+       }
+       while (count);
+
+       /* Print statistics average */
+       dis = dis_hdr;
+       write_stats_avg(curr, USE_SADC, ALL_ACTIVITIES);
+}
+
+/*
+ ***************************************************************************
+ * Main entry to the sar program.
+ ***************************************************************************
+ */
+int main(int argc, char **argv)
+{
+       int opt = 1, args_idx = 2;
+       int fd[2];
+       char from_file[MAX_FILE_LEN], to_file[MAX_FILE_LEN];
+       char ltemp[20];
+
+       /* Get HZ */
+       get_HZ();
+
+       /* Compute page shift in kB */
+       get_kb_shift();
+
+       from_file[0] = to_file[0] = '\0';
+
+#ifdef USE_NLS
+       /* Init National Language Support */
+       init_nls();
+#endif
+
+       tm_start.use = tm_end.use = FALSE;
+       
+       /* Allocate and init activity bitmaps */
+       allocate_bitmaps(act);
+
+       init_structures();
+
+       /* Process options */
+       while (opt < argc) {
+
+               if (!strcmp(argv[opt], "-I")) {
+                       if (argv[++opt]) {
+                               /* Parse -I option */
+                               if (parse_sar_I_opt(argv, &opt, act)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-P")) {
+                       /* Parse -P option */
+                       if (parse_sa_P_opt(argv, &opt, &flags, act)) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-o")) {
+                       /* Save stats to a file */
+                       if ((argv[++opt]) && strncmp(argv[opt], "-", 1) &&
+                           (strspn(argv[opt], DIGITS) != strlen(argv[opt]))) {
+                               strncpy(to_file, argv[opt++], MAX_FILE_LEN);
+                               to_file[MAX_FILE_LEN - 1] = '\0';
+                       }
+                       else {
+                               strcpy(to_file, "-");
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-f")) {
+                       /* Read stats from a file */
+                       if ((argv[++opt]) && strncmp(argv[opt], "-", 1) &&
+                           (strspn(argv[opt], DIGITS) != strlen(argv[opt]))) {
+                               strncpy(from_file, argv[opt++], MAX_FILE_LEN);
+                               from_file[MAX_FILE_LEN - 1] = '\0';
+                       }
+                       else {
+                               set_default_file(&rectime, from_file);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-s")) {
+                       /* Get time start */
+                       if (parse_timestamp(argv, &opt, &tm_start, DEF_TMSTART)) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-e")) {
+                       /* Get time end */
+                       if (parse_timestamp(argv, &opt, &tm_end, DEF_TMEND)) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-h")) {
+                       /* Display help message */
+                       display_help(argv[0]);
+               }
+
+               else if (!strcmp(argv[opt], "-i")) {
+                       if (!argv[++opt] || (strspn(argv[opt], DIGITS) != strlen(argv[opt]))) {
+                               usage(argv[0]);
+                       }
+                       interval = atol(argv[opt++]);
+                       if (interval < 1) {
+                               usage(argv[0]);
+                       }
+                       flags |= S_F_INTERVAL_SET;
+               }
+
+               else if (!strcmp(argv[opt], "-m")) {
+                       if (argv[++opt]) {
+                               /* Parse option -m */
+                               if (parse_sar_m_opt(argv, &opt, act)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strcmp(argv[opt], "-n")) {
+                       if (argv[++opt]) {
+                               /* Parse option -n */
+                               if (parse_sar_n_opt(argv, &opt, act)) {
+                                       usage(argv[0]);
+                               }
+                       }
+                       else {
+                               usage(argv[0]);
+                       }
+               }
+
+               else if (!strncmp(argv[opt], "-", 1)) {
+                       /* Other options not previously tested */
+                       if (parse_sar_opt(argv, &opt, act, &flags, C_SAR)) {
+                               usage(argv[0]);
+                       }
+                       opt++;
+               }
+
+               else if (interval < 0) {
+                       /* Get interval */
+                       if (strspn(argv[opt], DIGITS) != strlen(argv[opt])) {
+                               usage(argv[0]);
+                       }
+                       interval = atol(argv[opt++]);
+                       if (interval < 0) {
+                               usage(argv[0]);
+                       }
+               }
+
+               else {
+                       /* Get count value */
+                       if ((strspn(argv[opt], DIGITS) != strlen(argv[opt])) ||
+                           !interval) {
+                               usage(argv[0]);
+                       }
+                       if (count) {
+                               /* Count parameter already set */
+                               usage(argv[0]);
+                       }
+                       count = atol(argv[opt++]);
+                       if (count < 1) {
+                               usage(argv[0]);
+                       }
+               }
+       }
+
+       /* 'sar' is equivalent to 'sar -f' */
+       if ((argc == 1) ||
+           ((interval < 0) && !from_file[0] && !to_file[0])) {
+               set_default_file(&rectime, from_file);
+       }
+
+       if (tm_start.use && tm_end.use && (tm_end.tm_hour < tm_start.tm_hour)) {
+               tm_end.tm_hour += 24;
+       }
+
+       /*
+        * Check option dependencies.
+        */
+       /* You read from a file OR you write to it... */
+       if (from_file[0] && to_file[0]) {
+               fprintf(stderr, _("-f and -o options are mutually exclusive\n"));
+               exit(1);
+       }
+       /* Use time start or option -i only when reading stats from a file */
+       if ((tm_start.use || INTERVAL_SET(flags)) && !from_file[0]) {
+               fprintf(stderr,
+                       _("Not reading from a system activity file (use -f option)\n"));
+               exit(1);
+       }
+       /* Don't print stats since boot time if -o or -f options are used */
+       if (!interval && (from_file[0] || to_file[0])) {
+               usage(argv[0]);
+       }
+
+       if (!count) {
+               /*
+                * count parameter not set: Display all the contents of the file
+                * or generate a report continuously.
+                */
+               count = -1;
+       }
+
+       /* Default is CPU activity... */
+       select_default_activity(act);
+       
+       /* Reading stats from file: */
+       if (from_file[0]) {
+               if (interval < 0) {
+                       interval = 1;
+               }
+
+               /* Read stats from file */
+               read_stats_from_file(from_file);
+               
+               /* Free stuctures and activity bitmaps */
+               free_bitmaps(act);
+               free_structures(act);
+
+               return 0;
+       }
+
+       /* Reading stats from sadc: */
+
+       /* Create anonymous pipe */
+       if (pipe(fd) == -1) {
+               perror("pipe");
+               exit(4);
+       }
+
+       switch (fork()) {
+
+       case -1:
+               perror("fork");
+               exit(4);
+               break;
+
+       case 0: /* Child */
+               if (dup2(fd[1], STDOUT_FILENO) < 0) {
+                       perror("dup2");
+                       exit(4);
+               }
+               CLOSE_ALL(fd);
+
+               /*
+                * Prepare options for sadc.
+                */
+               /* Program name */
+               salloc(0, SADC);
+
+               /* Interval value */
+               if (interval < 0) {
+                       usage(argv[0]);
+               }
+               else if (!interval) {
+                       strcpy(ltemp, "1");
+               }
+               else {
+                       sprintf(ltemp, "%ld", interval);
+               }
+               salloc(1, ltemp);
+
+               /* Count number */
+               if (count >= 0) {
+                       sprintf(ltemp, "%ld", count + 1);
+                       salloc(args_idx++, ltemp);
+               }
+
+               /* Flags to be passed to sadc */
+               salloc(args_idx++, "-z");
+               salloc(args_idx++, "-S");
+               salloc(args_idx++, K_ALL);
+
+               /* Outfile arg */
+               if (to_file[0]) {
+                       salloc(args_idx++, to_file);
+               }
+
+               /* Last arg is NULL */
+               args[args_idx] = NULL;
+
+               /* Call now the data collector */
+               execv(SADC_PATH, args);
+               execvp(SADC, args);
+               /*
+                * Note: Don't use execl/execlp since we don't have a fixed number of
+                * args to give to sadc.
+                */
+               fprintf(stderr, _("Cannot find the data collector (%s)\n"), SADC);
+               perror("exec");
+               exit(4);
+               break;
+
+       default: /* Parent */
+               if (dup2(fd[0], STDIN_FILENO) < 0) {
+                       perror("dup2");
+                       exit(4);
+               }
+               CLOSE_ALL(fd);
+
+               /* Get now the statistics */
+               read_stats();
+
+               break;
+       }
+
+       /* Free structures and activity bitmaps */
+       free_bitmaps(act);
+       free_structures(act);
+
+       return 0;
+}
diff --git a/sysconfig.in b/sysconfig.in
new file mode 100644 (file)
index 0000000..6d94b56
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * sysstat: System performance tools for Linux
+ * (C) 1999-2009 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _SYSCONFIG_H
+#define _SYSCONFIG_H
+
+/* sysstat configuration directory */
+#define IOCONF         "@SYSCONFIG_DIR@/sysstat.ioconf"
+#define LOCAL_IOCONF   "./sysstat.ioconf"
+
+#endif  /* _SYSCONFIG_H */
diff --git a/sysstat-9.1.5.lsm b/sysstat-9.1.5.lsm
new file mode 100644 (file)
index 0000000..3fb87ba
--- /dev/null
@@ -0,0 +1,37 @@
+Begin4
+Title:         sysstat - the sar, sadf, mpstat, iostat, nfsiostat, cifsiostat and pidstat commands for Linux
+Version:       9.1.5
+Entered-date:  2010-09-12
+Description:   The sysstat package contains the sar, sadf, mpstat, iostat,
+               pidstat, nfsiostat, cifsiostat and sa tools for Linux.
+               The sar command collects and reports system activity
+               information.
+               The information collected by sar can be saved in a file
+               in a binary format for future inspection.
+               The statistics reported by sar concern I/O transfer rates,
+               paging activity, process-related activities, interrupts,
+               network activity, memory and swap space utilization, CPU
+               utilization, kernel activities and TTY statistics, among
+               others. Both UP and SMP machines are fully supported.
+               The iostat command reports CPU utilization
+               and I/O statistics for disks. The mpstat command reports
+               global and per-processor statistics. The sadf command
+               is used to display data collected by sar in various
+               formats (XML, database-friendly, etc.).
+               The pidstat command reports statistics for Linux tasks (processes).
+               The nfsiostat command reports I/O statistics for network filesystems.
+               The cifsiostat command reports I/O statistics for CIFS filesystems.
+               NB: Send bugs, patches, suggestions and/or questions to
+               (sysstat [at] orange.fr) and not to the address below!
+               URL: http://pagesperso-orange.fr/sebastien.godard/ 
+Keywords:      system administration, sar, sadf, iostat, mpstat, pidstat, nfsiostat, cifsiostat, system accounting, performance, tuning
+Author:                sebastien.godard@orange.fr (Sebastien Godard)
+Maintained-by: sebastien.godard@orange.fr (Sebastien Godard)
+Primary-site:  http://pagesperso-orange.fr/sebastien.godard/
+               309kB sysstat-9.1.5.tar.gz
+               248kB sysstat-9.1.5.tar.bz2
+               312kB sysstat-9.1.5-1.src.rpm
+               311kB sysstat-9.1.5-1.i586.rpm
+Alternate-site:        ibiblio.org /pub/linux/system/status
+Copying-policy:        GPL
+End
diff --git a/sysstat-9.1.5.spec b/sysstat-9.1.5.spec
new file mode 100644 (file)
index 0000000..870d308
--- /dev/null
@@ -0,0 +1,79 @@
+Summary:       SAR, SADF, MPSTAT, IOSTAT, NFSIOSTAT, CIFSIOSTAT and PIDSTAT for Linux
+Name:          sysstat
+Version:       9.1.5
+Release:       1
+License:       GPL
+Group:                 Applications/System
+Source0:       %{name}-%{version}.tar.gz
+URL:           http://pagesperso-orange.fr/sebastien.godard/
+Packager:      Damien Faure <damien-jn.faure@bull.net>
+BuildRoot:     %{_tmppath}/%{name}-%{version}-root-%(id -u -n)
+Requires:      gettext
+
+%description
+The sysstat package contains the sar, sadf, mpstat, iostat, pidstat,
+nfsiostat, cifsiostat and sa tools for Linux.
+The sar command collects and reports system activity information.
+The information collected by sar can be saved in a file in a binary
+format for future inspection. The statistics reported by sar concern
+I/O transfer rates, paging activity, process-related activities,
+interrupts, network activity, memory and swap space utilization, CPU
+utilization, kernel activities and TTY statistics, among others. Both
+UP and SMP machines are fully supported.
+The sadf command may  be used to display data collected by sar in
+various formats (CSV, XML, etc.).
+The iostat command reports CPU utilization and I/O statistics for disks.
+The mpstat command reports global and per-processor statistics.
+The pidstat command reports statistics for Linux tasks (processes).
+The nfsiostat command reports I/O statistics for network filesystems.
+The cifsiostat command reports I/O statistics for CIFS filesystems.
+
+%prep 
+%setup 
+
+%build
+./configure --prefix=%{_prefix} \
+       sa_lib_dir=%{_libdir}/sa \
+       --mandir=%{_mandir} \
+       DESTDIR=$RPM_BUILD_ROOT
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT/var/log/sa
+
+make install
+
+mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d
+install -m 755  sysstat $RPM_BUILD_ROOT/etc/rc.d/init.d/sysstat
+mkdir -p $RPM_BUILD_ROOT/etc/sysconfig
+install -m 644 sysstat.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/sysstat
+install -m 644 sysstat.ioconf $RPM_BUILD_ROOT/etc/sysconfig/sysstat.ioconf
+mkdir -p $RPM_BUILD_ROOT/etc/cron.d
+install -m 644 sysstat.crond.sample $RPM_BUILD_ROOT/etc/cron.d/sysstat
+mkdir -p $RPM_BUILD_ROOT/etc/rc2.d
+cd $RPM_BUILD_ROOT/etc/rc2.d && ln -sf ../init.d/sysstat S01sysstat
+mkdir -p $RPM_BUILD_ROOT/etc/rc3.d
+cd $RPM_BUILD_ROOT/etc/rc3.d && ln -sf ../init.d/sysstat S01sysstat
+mkdir -p $RPM_BUILD_ROOT/etc/rc5.d
+cd $RPM_BUILD_ROOT/etc/rc5.d && ln -sf ../init.d/sysstat S01sysstat
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files 
+%defattr(644,root,root,755)
+%doc %{_datadir}/doc/sysstat-%{version}/*
+%attr(755,root,root) %{_bindir}/*
+%attr(755,root,root) %{_libdir}/sa/*
+%attr(644,root,root) %{_mandir}/man*/*
+%attr(644,root,root) %{_datadir}/locale/*/LC_MESSAGES/sysstat.mo
+%attr(755,root,root) %dir /var/log/sa
+%attr(755,root,root) /etc/rc.d/init.d/sysstat
+%attr(644,root,root) /etc/sysconfig/sysstat
+%attr(644,root,root) /etc/sysconfig/sysstat.ioconf
+%attr(755,root,root) /etc/rc2.d/S01sysstat
+%attr(755,root,root) /etc/rc3.d/S01sysstat
+%attr(755,root,root) /etc/rc5.d/S01sysstat
+%config(noreplace) %attr(0644,root,root) /etc/cron.d/sysstat
+
diff --git a/sysstat.cron.daily.in b/sysstat.cron.daily.in
new file mode 100644 (file)
index 0000000..943e9fe
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+# Generate a daily summary of process accounting.  Since this will probably
+# get kicked off in the morning, it would probably be better to run against
+# the previous days data.
+@SA_LIB_DIR@/sa2 -A &
diff --git a/sysstat.cron.hourly.in b/sysstat.cron.hourly.in
new file mode 100644 (file)
index 0000000..61c9cf2
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+# Run system activity accounting tool every @CRON_INTERVAL@ minutes
+@SA_LIB_DIR@/sa1 @CRON_INTERVAL_SEC@ @CRON_COUNT@ &
diff --git a/sysstat.crond.in b/sysstat.crond.in
new file mode 100644 (file)
index 0000000..bfe8722
--- /dev/null
@@ -0,0 +1,6 @@
+# Run system activity accounting tool every @CRON_INTERVAL@ minutes
+*/@CRON_INTERVAL@ * * * * @CRON_OWNER@ @SA_LIB_DIR@/sa1 1 1
+# 0 * * * * @CRON_OWNER@ @SA_LIB_DIR@/sa1 @CRON_INTERVAL_SEC@ @CRON_COUNT@ &
+# Generate a daily summary of process accounting at 23:53
+53 23 * * * @CRON_OWNER@ @SA_LIB_DIR@/sa2 -A
+
diff --git a/sysstat.in b/sysstat.in
new file mode 100644 (file)
index 0000000..8cb41d9
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# chkconfig: 12345 01 99
+# @INIT_DIR@/sysstat
+# (C) 2000-2010 Sebastien Godard (sysstat <at> orange.fr)
+#
+### BEGIN INIT INFO
+# Provides:            sysstat
+# Required-Start:
+# Required-Stop:
+# Default-Stop:
+# Description: Reset the system activity logs
+# Short-Description: Reset the system activity logs
+### END INIT INFO
+#@(#) @PACKAGE_NAME@-@PACKAGE_VERSION@ startup script:
+#@(#)   Insert a dummy record in current daily data file.
+#@(#)   This indicates that the counters have restarted from 0.
+
+RETVAL=0
+SYSCONFIG_DIR=@SYSCONFIG_DIR@
+#SADC_OPTIONS="-S DISK"
+SADC_OPTIONS=""
+
+# See how we were called.
+case "$1" in
+  start)
+       exitCodeIndicator="$(mktemp /tmp/sysstat-XXXXXX)" || exit 1
+       echo -n "Calling the system activity data collector (sadc): "
+       @SU_C_OWNER@ @QUOTE@ @SA_LIB_DIR@/sa1 --boot ${SADC_OPTIONS} || rm -f ${exitCodeIndicator} @QUOTE@
+
+       # Try to guess if sadc was successfully launched. The difficulty
+       # here is that the exit code is lost when the above command is
+       # run via "su foo -c ..."
+       if [ -f "${exitCodeIndicator}" ]; then
+               rm -f ${exitCodeIndicator}
+       else
+               RETVAL=2
+       fi
+       echo
+       ;;
+  stop|status|restart|reload|force-reload|condrestart|try-restart)
+       ;;
+  *)
+       echo "Usage: sysstat {start|stop|status|restart|reload|force-reload|condrestart|try-restart}"
+       exit 2
+esac
+exit ${RETVAL}
+
diff --git a/sysstat.ioconf b/sysstat.ioconf
new file mode 100644 (file)
index 0000000..ab34ba3
--- /dev/null
@@ -0,0 +1,268 @@
+#
+# sysstat.ioconf
+#
+#  Copyright (C) 2004, Red Hat, Inc.
+#
+#  Maintained by Sebastien Godard (sysstat [at] orange.fr)
+#
+#  This file gives iostat and sadc a clue about how to find whole
+#   disk devices in /proc/partitions and /proc/diskstats
+#  Authoritative source is: linux/Documentation/devices.txt
+#
+# line format, general record:
+#   major:name:ctrlpre:ctrlno:devfmt:devcnt:partpre:partcnt:description
+#
+#  major:              major # for device
+#  name:               base of device name
+#  ctrlpre:            string to use in generating controller designators
+#                       eg: the c in c0d2p6, decimal formatting implied
+#                      '*' means none or irrelevant
+#                      'x': exception... record contains a specific name
+#                       for a specific minor #, stored in the ctrlno field
+#  ctrlno:             which controller of this type is this
+#  devfmt:             type of device naming convention
+#      a:              alpha: xxa, xxb, ... xxaa, xxab, ... xxzz
+#      %string:        string to use in generating drive designators,
+#                       eg: the 'd' in c0d2p6 , decimal formatting implied
+#      d:              no special translations (decimal formatting)
+#  devcnt:             how many whole devs per major number
+#  partpre:            appended to whole dev before part designator
+#                        eg. the p in c0d2p6, decimal formatting implied
+#                       '*' means none
+#  partcnt:            number of partitions per volume
+#                       or minor # for exception records
+#  description:                informative text
+#
+# line format, indirect record:
+#   major:base_major:ctrlno[:[desc]]
+#
+#  major:              major number of the device
+#  base_major:         major number of the template for this type,
+#                       0 for not supported
+#  ctrlno:             controller number of this type
+#  desc:               controller-specific description
+#                      if absent the desc from base_major will be
+#                       used in sprintf( buf, desc, ctrlno )
+
+
+1:ram:*:0:d:256:*:1:RAM disks (ram0..ram255)
+1:initrd:x:250:d:256:*:1:Initial RAM Disk (initrd)
+
+#2:0:0:Floppy Devices
+2:fd:*:0:d:4:*:1:Floppy Devices fd0,fd1,fd2,fd3
+
+3:hd:*:0:a:2:*:64:IDE - Controller %d
+22:3:1:
+33:3:2:
+34:3:3:
+56:3:4:
+57:3:5:
+88:3:6:
+89:3:7:
+90:3:8:
+91:3:9:
+
+#4:0:0:NODEV
+#5:0:0:NODEV
+#6:0:0:NODEV
+7:loop:*:0:d:256:*:1:Loop Devices 
+
+8:sd:*:0:a:16:*:16:SCSI - Controller %d
+65:8:1:
+66:8:2:
+67:8:3:
+68:8:4:
+69:8:5:
+70:8:6:
+71:8:7:
+128:8:8:
+129:8:9:
+130:8:10:
+131:8:11:
+132:8:12:
+133:8:13:
+134:8:14:
+135:8:15:
+
+9:md:*:0:d:256:*:1:Metadisk (Software RAID) devices  (md0..md255)
+
+#10:0:0:NODEV
+
+#11:sr:*:0:d:256:*:1:CDROM - CDROM (sr0..sr255) (deprecated)
+11:scd:*:0:d:256:*:1:CDROM - CDROM (scd0..scd255)
+
+#12:0:0:MSCDEX CD-ROM Callback
+
+13:xd:*:0:a:2:*:64:8-bit MFM/RLL/IDE controller (xda, xdb)
+
+#14:0:0:BIOS Hard Drive Callback
+#15:0:0:CDROM - Sony CDU-31A/CDU-33A
+#16:0:0:CDROM - Goldstar
+#17:0:0:CDROM - Optics Storage
+#18:0:0:CDROM - Sanyo
+
+19:double:*:0:d:256:*:1:Compressed Disk (double0..double255)
+
+#20:0:0:CDROM - Hitachi
+
+21:mfm:*:0:a:2:*:64:Acorn MFM Hard Drive (mfma, mfmb)
+
+# 22: see IDE, dev 3
+
+#23:0:0:CDROM - Mistumi Proprietary
+#24:0:0:CDROM - Sony CDU-535
+#25:0:0:CDROM - Matsushita (Panasonic/Soundblaster) #1
+#26:0:1:CDROM - Matsushita (Panasonic/Soundblaster) #2
+#27:0:2:CDROM - Matsushita (Panasonic/Soundblaster) #3
+#28:0:3:CDROM - Matsushita (Panasonic/Soundblaster) #4
+# 28:0:0:! ACSI (Atari) Disk Not Supported
+#29:0:0:CDROM - Aztech/Orchid/Okano/Wearnes
+#30:0:0:CDROM - Philips LMS CM-205
+#31:0:0:ROM/flash Memory Card
+#32:0:0:CDROM -  Phillips LMS CM-206
+
+# 33: See IDE, dev 3
+# 34: See IDE, dev 3
+
+#35:0:0:Slow Memory RAM Disk
+
+36:ed:*:0:a:2:*:64:MCA ESDI Hard Disk (eda, edb)
+
+#37:0:0:Zorro II Ram Disk
+#38:0:0:Reserved For Linux/AP+
+#39:0:0:Reserved For Linux/AP+
+#40:0:0:Syquest EZ135 Parallel Port Drive
+#41:0:0:CDROM -  MicroSolutions Parallel Port BackPack
+#42:0:0:For DEMO Use Only
+
+43:nb:*:0:d:256:*:1:Network Block devices (nb0..nb255)
+44:ftl:*:0:a:16:*:16:Flash Translation Layer (ftla..ftlp)
+45:pd:*:0:a:4:*:16:Parallel Port IDE (pda..pdd)
+
+#46:0:0:CDROM - Parallel Port ATAPI
+
+47:pf:*:0:d:256:*:1:Parallel Port ATAPI Disk Devices (pf0..pf255)
+
+48:rd:/c:0:%d:32:p:8:Mylex DAC960 RAID, Controller %d
+49:48:1:
+50:48:2:
+51:48:3:
+52:48:4:
+53:48:5:
+54:48:6:
+55:48:7:
+136:48:8:
+137:48:9:
+138:48:10:
+139:48:11:
+140:48:12:
+141:48:13:
+142:48:14:
+143:48:15:
+
+# 56, 57: see IDE, dev 3:
+
+58:lvm:*:0:d:256:*:1:Logical Volume Manager (lvm0..lvm255)
+
+#59:0:0:PDA Filesystem Device
+#60:0:0:Local/Experimental Use
+#61:0:0:Local/Experimental Use
+#62:0:0:Local/Experimental Use
+#63:0:0:Local/Experimental Use
+#64:0:0:NODEV
+
+# 65..71: See SCSI, dev 8:
+
+72:ida/:c:0:%d:16:p:16:Compaq Intelligent Drive Array - Controller %d
+73:72:1:
+74:72:2:
+75:72:3:
+76:72:4:
+77:72:5:
+78:72:6:
+79:72:7:
+
+80:i2o/hd:*:0:a:16:*:16:I2O Disk - Controller %d
+81:80:1:
+82:80:2:
+83:80:3:
+84:80:4:
+85:80:5:
+86:80:6:
+87:80:7:
+
+# 88..91: see IDE, dev 3:
+
+#92:0:0:PPDD Encrypted Disk
+#93:0:0:NAND Flash Translation Layer not supported
+
+94:dasd:*:0:a:64:*:4:IBM S/390 DASD Block Storage (dasda, dasdb, ...)
+
+#95:0:0:IBM S/390 VM/ESA Minidisk
+#96:0:0:NODEV
+#97:0:0:CD/DVD packed writing devices not supported
+
+98:ubd:*:0:d:256:*:1:User-mode Virtual Block Devices (ubd0..ubd256)
+
+#99:0:0:JavaStation Flash Disk
+#100:0:0:NODEV
+
+101:amiraid/ar:*:0:d:16:p:16:AMI HyperDisk RAID (amiraid/ar0 - amiraid/ar15)
+
+#102:0:0:Compressed Block Device
+#103:0:0:Audit Block Device
+
+104:cciss:/c:0:%d:16:p:16:HP SA 5xxx/6xxx (cciss) Controller %d
+105:104:1:
+106:104:2:
+107:104:3:
+108:104:4:
+109:104:5:
+110:104:6:
+111:104:7:
+
+112:iseries/vd:*:0:a:32:*:8:IBM iSeries Virtual Disk (.../vda - .../vdaf)
+
+#113:0:0:CDROM - IBM iSeries Virtual
+
+# 114..159 NODEV
+
+120:emcpower:*:0:a:16:*:16:EMC PowerPath Unit %d
+
+#160:sx8/:*:0:d:8:p:32:Promise SATA SX8 Unit %d
+#161:160:1:
+160:carmel/:*:0:d:8:p:32:Carmel 8-port SATA Disks (carmel/0 - carmel/7)
+161:160:1:
+
+# 162..198 UNUSED
+
+180:ub:*:0:a:32:p:8:USB block devices
+
+#199:0:0:Veritas Volume Manager (VxVM) Volumes
+#200:0:0:NODEV
+#201:0:0:Veritas VxVM Dynamic Multipathing Driver
+
+202:xvd:*:0:a:16:p:16:Xen Virtual Block Device
+
+# 203..230: UNUSED
+
+232:emcpower:*:0:a:16:*:16:EMC PowerPath Unit %d
+233:232:1:
+234:232:2:
+235:232:3:
+236:232:4:
+237:232:5:
+238:232:6:
+239:232:7:
+240:232:8:
+241:232:9:
+242:232:10:
+243:232:11:
+244:232:12:
+245:232:13:
+246:232:14:
+247:232:15:
+
+# 240..254: LOCAL/Experimental
+# 255: reserved for big dev_t expansion
+
diff --git a/sysstat.sysconfig.in b/sysstat.sysconfig.in
new file mode 100644 (file)
index 0000000..b06b633
--- /dev/null
@@ -0,0 +1,10 @@
+# @PACKAGE_NAME@-@PACKAGE_VERSION@ configuration file.
+
+# How long to keep log files (in days).
+# If value is greater than 28, then log files are kept in
+# multiple directories, one for each month.
+HISTORY=@HISTORY@
+
+# Compress (using gzip or bzip2) sa and sar files older than (in days):
+COMPRESSAFTER=@COMPRESSAFTER@
+
diff --git a/version.in b/version.in
new file mode 100644 (file)
index 0000000..38caba4
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * sysstat: System performance tools for Linux
+ * (C) 1999-2009 by Sebastien Godard (sysstat <at> orange.fr)
+ */
+
+#ifndef _VERSION_H
+#define _VERSION_H
+
+/* sysstat version number */
+#define VERSION        "@PACKAGE_VERSION@"
+
+#endif  /* _VERSION_H */
diff --git a/xml/sysstat.dtd b/xml/sysstat.dtd
new file mode 100644 (file)
index 0000000..16849ec
--- /dev/null
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--DTD v2.8 for sysstat. See sadf.h -->
+<!ELEMENT boot EMPTY>
+<!ATTLIST boot
+       date CDATA #REQUIRED
+       time CDATA #REQUIRED
+>
+<!ELEMENT comment EMPTY>
+<!ATTLIST comment
+       date CDATA #REQUIRED
+       time CDATA #REQUIRED
+       com CDATA #REQUIRED
+>
+<!ELEMENT buffers (#PCDATA)>
+<!ELEMENT bufpg (#PCDATA)>
+<!ELEMENT cached (#PCDATA)>
+<!ELEMENT campg (#PCDATA)>
+<!ELEMENT commit (#PCDATA)>
+<!ELEMENT commit-percent (#PCDATA)>
+<!ELEMENT cpu EMPTY>
+<!ATTLIST cpu
+       number CDATA #REQUIRED
+       user CDATA #REQUIRED
+       nice CDATA #REQUIRED
+       system CDATA #REQUIRED
+       iowait CDATA #REQUIRED
+       steal CDATA #REQUIRED
+       idle CDATA #REQUIRED
+>
+<!ELEMENT cpu-load (cpu+)>
+<!ELEMENT cpu-all EMPTY>
+<!ATTLIST cpu-all
+        number CDATA #REQUIRED
+        usr CDATA #REQUIRED
+        nice CDATA #REQUIRED
+        sys CDATA #REQUIRED
+        iowait CDATA #REQUIRED
+        steal CDATA #REQUIRED
+        irq CDATA #REQUIRED
+        soft CDATA #REQUIRED
+        guest CDATA #REQUIRED
+        idle CDATA #REQUIRED
+>
+<!ELEMENT cpu-load-all (cpu-all+)>
+<!ELEMENT dentunusd (#PCDATA)>
+<!ELEMENT disk (disk-device+)>
+<!ATTLIST disk
+       per CDATA #REQUIRED
+>
+<!ELEMENT disk-device EMPTY>
+<!ATTLIST disk-device
+       dev CDATA #REQUIRED
+       tps CDATA #REQUIRED
+       rd_sec CDATA #REQUIRED
+       wr_sec CDATA #REQUIRED
+       avgrq-sz CDATA #REQUIRED
+       avgqu-sz CDATA #REQUIRED
+       await CDATA #REQUIRED
+       svctm CDATA #REQUIRED
+       util-percent CDATA #REQUIRED
+>
+<!ELEMENT file-nr (#PCDATA)>
+<!ELEMENT frmpg (#PCDATA)>
+<!ELEMENT host (sysname, release, machine, number-of-cpus, file-date, statistics, restarts, comments)>
+<!ATTLIST host
+       nodename CDATA #REQUIRED
+>
+<!ELEMENT inode-nr (#PCDATA)>
+<!ELEMENT int-global (irq+)>
+<!ATTLIST int-global
+       per CDATA #REQUIRED
+>
+<!ELEMENT interrupts (int-global)>
+<!ELEMENT io (tps, io-reads, io-writes)>
+<!ATTLIST io
+       per CDATA #REQUIRED
+>
+<!ELEMENT io-reads EMPTY>
+<!ATTLIST io-reads
+       rtps CDATA #REQUIRED
+       bread CDATA #REQUIRED
+>
+<!ELEMENT io-writes EMPTY>
+<!ATTLIST io-writes
+       wtps CDATA #REQUIRED
+       bwrtn CDATA #REQUIRED
+>
+<!ELEMENT irq EMPTY>
+<!ATTLIST irq
+       intr CDATA #REQUIRED
+       value CDATA #REQUIRED
+>
+<!ELEMENT kernel EMPTY>
+<!ATTLIST kernel
+       dentunusd CDATA #REQUIRED
+       file-nr CDATA #REQUIRED
+       inode-nr CDATA #REQUIRED
+       pty-nr CDATA #REQUIRED
+>
+<!ELEMENT memfree (#PCDATA)>
+<!ELEMENT memory (memfree, memused, memused-percent, buffers, cached, commit, commit-percent, swpfree, swpused, swpused-percent, swpcad, swpcad-percent, frmpg, bufpg, campg)>
+<!ATTLIST memory
+       per CDATA #REQUIRED
+       unit CDATA #REQUIRED
+>
+<!ELEMENT memused (#PCDATA)>
+<!ELEMENT memused-percent (#PCDATA)>
+<!ELEMENT network (net-dev+, net-edev+, net-nfs, net-nfsd, net-sock, net-ip, net-eip, net-icmp, net-eicmp, net-tcp, net-etcp, net-udp, net-sock6, net-ip6, net-eip6, net-icmp6, net-eicmp6, net-udp6)>
+<!ATTLIST network
+       per CDATA #REQUIRED
+>
+<!ELEMENT paging EMPTY>
+<!ATTLIST paging
+       per CDATA #REQUIRED
+       pgpgin CDATA #REQUIRED
+       pgpgout CDATA #REQUIRED
+       fault CDATA #REQUIRED
+       majflt CDATA #REQUIRED
+       pgfree CDATA #REQUIRED
+       pgscank CDATA #REQUIRED
+       pgscand CDATA #REQUIRED
+       pgsteal CDATA #REQUIRED
+       vmeff-percent CDATA #REQUIRED
+>
+<!ELEMENT process-and-context-switch EMPTY>
+<!ATTLIST process-and-context-switch
+       per CDATA #REQUIRED
+       proc CDATA #REQUIRED
+       cswch CDATA #REQUIRED
+>
+<!ELEMENT pty-nr (#PCDATA)>
+<!ELEMENT queue EMPTY>
+<!ATTLIST queue
+       runq-sz CDATA #REQUIRED
+       plist-sz CDATA #REQUIRED
+       ldavg-1 CDATA #REQUIRED
+       ldavg-5 CDATA #REQUIRED
+       ldavg-15 CDATA #REQUIRED
+>
+<!ELEMENT restarts (boot+)>
+<!ELEMENT comments (comment+)>
+<!ELEMENT net-dev EMPTY>
+<!ATTLIST net-dev
+       iface CDATA #REQUIRED
+       rxpck CDATA #REQUIRED
+       txpck CDATA #REQUIRED
+       rxkB CDATA #REQUIRED
+       txkB CDATA #REQUIRED
+       rxcmp CDATA #REQUIRED
+       txcmp CDATA #REQUIRED
+       rxmcst CDATA #REQUIRED
+>
+<!ELEMENT release (#PCDATA)>
+<!ELEMENT serial (tty+)>
+<!ATTLIST serial
+       per CDATA #REQUIRED
+>
+<!ELEMENT net-sock EMPTY>
+<!ATTLIST net-sock
+       totsck CDATA #REQUIRED
+       tcpsck CDATA #REQUIRED
+       udpsck CDATA #REQUIRED
+       rawsck CDATA #REQUIRED
+       ip-frag CDATA #REQUIRED
+       tcp-tw CDATA #REQUIRED
+>
+<!ELEMENT net-sock6 EMPTY>
+<!ATTLIST net-sock6
+        tcp6sck CDATA #REQUIRED
+        udp6sck CDATA #REQUIRED
+        raw6sck CDATA #REQUIRED
+        ip6-frag CDATA #REQUIRED
+>
+<!ELEMENT net-nfs EMPTY>
+<!ATTLIST net-nfs
+       call CDATA #REQUIRED
+       retrans CDATA #REQUIRED
+       read CDATA #REQUIRED
+       write CDATA #REQUIRED
+       access CDATA #REQUIRED
+       getatt CDATA #REQUIRED
+>
+<!ELEMENT net-nfsd EMPTY>
+<!ATTLIST net-nfsd
+       scall CDATA #REQUIRED
+       badcall CDATA #REQUIRED
+       packet CDATA #REQUIRED
+       udp CDATA #REQUIRED
+       tcp CDATA #REQUIRED
+       hit CDATA #REQUIRED
+       miss CDATA #REQUIRED
+       sread CDATA #REQUIRED
+       swrite CDATA #REQUIRED
+       saccess CDATA #REQUIRED
+       sgetatt CDATA #REQUIRED
+>
+<!ELEMENT net-ip EMPTY>
+<!ATTLIST net-ip
+       irec CDATA #REQUIRED
+       fwddgm CDATA #REQUIRED
+       idel CDATA #REQUIRED
+       orq CDATA #REQUIRED
+       asmrq CDATA #REQUIRED
+       asmok CDATA #REQUIRED
+       fragok CDATA #REQUIRED
+       fragcrt CDATA #REQUIRED
+>
+<!ELEMENT net-ip6 EMPTY>
+<!ATTLIST net-ip6
+        irec6 CDATA #REQUIRED
+        fwddgm6 CDATA #REQUIRED
+        idel6 CDATA #REQUIRED
+        orq6 CDATA #REQUIRED
+        asmrq6 CDATA #REQUIRED
+        asmok6 CDATA #REQUIRED
+        imcpck6 CDATA #REQUIRED
+        omcpck6 CDATA #REQUIRED
+        fragok6 CDATA #REQUIRED
+        fragcr6 CDATA #REQUIRED
+>
+<!ELEMENT net-eip EMPTY>
+<!ATTLIST net-eip
+       ihdrerr CDATA #REQUIRED
+       iadrerr CDATA #REQUIRED
+       iukwnpr CDATA #REQUIRED
+       idisc CDATA #REQUIRED
+       odisc CDATA #REQUIRED
+       onort CDATA #REQUIRED
+       asmf CDATA #REQUIRED
+       fragf CDATA #REQUIRED
+>
+<!ELEMENT net-eip6 EMPTY>
+<!ATTLIST net-eip6
+        ihdrer6 CDATA #REQUIRED
+        iadrer6 CDATA #REQUIRED
+        iukwnp6 CDATA #REQUIRED
+        i2big6 CDATA #REQUIRED
+        idisc6 CDATA #REQUIRED
+        odisc6 CDATA #REQUIRED
+        inort6 CDATA #REQUIRED
+        onort6 CDATA #REQUIRED
+        asmf6 CDATA #REQUIRED
+        fragf6 CDATA #REQUIRED
+        itrpck6 CDATA #REQUIRED
+>
+<!ELEMENT net-icmp EMPTY>
+<!ATTLIST net-icmp
+       imsg CDATA #REQUIRED
+       omsg CDATA #REQUIRED
+       iech CDATA #REQUIRED
+       iechr CDATA #REQUIRED
+       oech CDATA #REQUIRED
+       oechr CDATA #REQUIRED
+       itm CDATA #REQUIRED
+       itmr CDATA #REQUIRED
+       otm CDATA #REQUIRED
+       otmr CDATA #REQUIRED
+       iadrmk CDATA #REQUIRED
+       iadrmkr CDATA #REQUIRED
+       oadrmk CDATA #REQUIRED
+       oadrmkr CDATA #REQUIRED
+>
+<!ELEMENT net-icmp6 EMPTY>
+<!ATTLIST net-icmp6
+        imsg6 CDATA #REQUIRED
+        omsg6 CDATA #REQUIRED
+        iech6 CDATA #REQUIRED
+        iechr6 CDATA #REQUIRED
+        oechr6 CDATA #REQUIRED
+        igmbq6 CDATA #REQUIRED
+        igmbr6 CDATA #REQUIRED
+        ogmbr6 CDATA #REQUIRED
+        igmbrd6 CDATA #REQUIRED
+        ogmbrd6 CDATA #REQUIRED
+        irtsol6 CDATA #REQUIRED
+        ortsol6 CDATA #REQUIRED
+        irtad6 CDATA #REQUIRED
+        inbsol6 CDATA #REQUIRED
+        onbsol6 CDATA #REQUIRED
+        inbad6 CDATA #REQUIRED
+        onbad6 CDATA #REQUIRED
+>
+<!ELEMENT net-eicmp EMPTY>
+<!ATTLIST net-eicmp
+       ierr CDATA #REQUIRED
+       oerr CDATA #REQUIRED
+       idstunr CDATA #REQUIRED
+       odstunr CDATA #REQUIRED
+       itmex CDATA #REQUIRED
+       otmex CDATA #REQUIRED
+       iparmpb CDATA #REQUIRED
+       oparmpb CDATA #REQUIRED
+       isrcq CDATA #REQUIRED
+       osrcq CDATA #REQUIRED
+       iredir CDATA #REQUIRED
+       oredir CDATA #REQUIRED
+>
+<!ELEMENT net-eicmp6 EMPTY>
+<!ATTLIST net-eicmp6
+        ierr6 CDATA #REQUIRED
+        idtunr6 CDATA #REQUIRED
+        odtunr6 CDATA #REQUIRED
+        itmex6 CDATA #REQUIRED
+        otmex6 CDATA #REQUIRED
+        iprmpb6 CDATA #REQUIRED
+        oprmpb6 CDATA #REQUIRED
+        iredir6 CDATA #REQUIRED
+        oredir6 CDATA #REQUIRED
+        ipck2b6 CDATA #REQUIRED
+        opck2b6 CDATA #REQUIRED
+>
+<!ELEMENT net-tcp EMPTY>
+<!ATTLIST net-tcp
+       active CDATA #REQUIRED
+       passive CDATA #REQUIRED
+       iseg CDATA #REQUIRED
+       oseg CDATA #REQUIRED
+>
+<!ELEMENT net-etcp EMPTY>
+<!ATTLIST net-etcp
+       atmptf CDATA #REQUIRED
+       estres CDATA #REQUIRED
+       retrans CDATA #REQUIRED
+       isegerr CDATA #REQUIRED
+       orsts CDATA #REQUIRED
+>
+<!ELEMENT net-udp EMPTY>
+<!ATTLIST net-udp
+       idgm CDATA #REQUIRED
+       odgm CDATA #REQUIRED
+       noport CDATA #REQUIRED
+       idgmerr CDATA #REQUIRED
+>
+<!ELEMENT net-udp6 EMPTY>
+<!ATTLIST net-udp6
+        idgm6 CDATA #REQUIRED
+        odgm6 CDATA #REQUIRED
+        noport6 CDATA #REQUIRED
+        idgmer6 CDATA #REQUIRED
+>
+<!ELEMENT statistics (timestamp+)>
+<!ELEMENT swap-pages EMPTY>
+<!ATTLIST swap-pages
+       per CDATA #REQUIRED
+       pswpin CDATA #REQUIRED
+       pswpout CDATA #REQUIRED
+>
+<!ELEMENT swpcad (#PCDATA)>
+<!ELEMENT swpcad-percent (#PCDATA)>
+<!ELEMENT swpfree (#PCDATA)>
+<!ELEMENT swpused (#PCDATA)>
+<!ELEMENT swpused-percent (#PCDATA)>
+<!ELEMENT sysdata-version (#PCDATA)>
+<!ELEMENT sysname (#PCDATA)>
+<!ELEMENT machine (#PCDATA)>
+<!ELEMENT number-of-cpus (#PCDATA)>
+<!ELEMENT file-date (#PCDATA)>
+<!ELEMENT sysstat (sysdata-version, host)>
+<!ELEMENT timestamp (cpu-load, cpu-load-all, process-and-context-switch, interrupts, swap-pages, paging, io, memory, kernel, queue, serial, disk, network, power-management)>
+<!ATTLIST timestamp
+       date CDATA #REQUIRED
+       time CDATA #REQUIRED
+       interval CDATA #REQUIRED
+>
+<!ELEMENT tps (#PCDATA)>
+<!ELEMENT net-edev EMPTY>
+<!ATTLIST net-edev
+       iface CDATA #REQUIRED
+       rxerr CDATA #REQUIRED
+       txerr CDATA #REQUIRED
+       coll CDATA #REQUIRED
+       rxdrop CDATA #REQUIRED
+       txdrop CDATA #REQUIRED
+       txcarr CDATA #REQUIRED
+       rxfram CDATA #REQUIRED
+       rxfifo CDATA #REQUIRED
+       txfifo CDATA #REQUIRED
+>
+<!ELEMENT tty EMPTY>
+<!ATTLIST tty
+       line CDATA #REQUIRED
+       rcvin CDATA #REQUIRED
+       xmtin CDATA #REQUIRED
+       framerr CDATA #REQUIRED
+       prtyerr CDATA #REQUIRED
+       brk CDATA #REQUIRED
+       ovrun CDATA #REQUIRED
+>
+<!ELEMENT power-management (cpu-frequency, fan-speed, temperature, voltage-input)>
+<!ELEMENT cpu-frequency (cpufreq+)>
+<!ATTLIST cpu-frequency
+       unit CDATA #REQUIRED
+>
+<!ELEMENT cpufreq EMPTY>
+<!ATTLIST cpufreq
+       number CDATA #REQUIRED
+       frequency CDATA #REQUIRED
+>
+<!ELEMENT fan-speed (fanspd+)>
+<!ATTLIST fan-speed
+       unit CDATA #REQUIRED
+>
+<!ELEMENT fanspd EMPTY>
+<!ATTLIST fanspd
+       number CDATA #REQUIRED
+       rpm CDATA #REQUIRED
+       drpm CDATA #REQUIRED
+       device CDATA #REQUIRED
+>
+<!ELEMENT temperature (temp+)>
+<!ATTLIST temperature
+       unit CDATA #REQUIRED
+>
+<!ELEMENT temp EMPTY>
+<!ATTLIST temp
+       number CDATA #REQUIRED
+       degC CDATA #REQUIRED
+       percent-temp CDATA #REQUIRED
+       device CDATA #REQUIRED
+>
+<!ELEMENT voltage-input (in+)>
+<!ATTLIST voltage-input
+        unit CDATA #REQUIRED
+>
+<!ELEMENT in EMPTY>
+<!ATTLIST in
+       number CDATA #REQUIRED
+       inV CDATA #REQUIRED
+       percent-in CDATA #REQUIRED
+       device CDATA #REQUIRED
+>
+
diff --git a/xml/sysstat.xsd b/xml/sysstat.xsd
new file mode 100644 (file)
index 0000000..9ac00fa
--- /dev/null
@@ -0,0 +1,745 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://pagesperso-orange.fr/sebastien.godard/sysstat" targetNamespace="http://pagesperso-orange.fr/sebastien.godard/sysstat" elementFormDefault="qualified">
+<xs:annotation><xs:appinfo>-- XML Schema v2.8 for sysstat. See sadf.h --</xs:appinfo></xs:annotation>
+
+    <xs:element name="queue" type="queue-type"></xs:element>
+
+    <xs:complexType name="queue-type">
+       <xs:sequence></xs:sequence>
+       <xs:attribute name="runq-sz" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="plist-sz" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="ldavg-1" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="ldavg-5" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="ldavg-15" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="kernel" type="kernel-type"></xs:element>
+
+    <xs:complexType name="kernel-type">
+       <xs:sequence></xs:sequence>
+       <xs:attribute name="dentunusd" type="xs:nonNegativeInteger">
+       <xs:attribute name="file-nr" type="xs:nonNegativeInteger">
+       <xs:attribute name="inode-nr" type="xs:nonNegativeInteger">
+       <xs:attribute name="pty-nr" type="xs:nonNegativeInteger">
+       </xs:attribute>
+    </xs:complexType>
+
+    <xs:simpleType name="per-type">
+       <xs:restriction base="xs:string">
+               <xs:enumeration value="second"></xs:enumeration>
+       </xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="memory" type="memory-type"></xs:element>
+
+    <xs:complexType name="memory-type">
+       <xs:sequence>
+               <xs:element name="memfree" type="xs:negativeInteger"></xs:element>
+               <xs:element name="memused" type="xs:nonNegativeInteger"></xs:element>
+               <xs:element name="memused-percent" type="hundredth-type"></xs:element>
+               <xs:element name="buffers" type="xs:nonNegativeInteger"></xs:element>
+               <xs:element name="cached" type="xs:nonNegativeInteger"></xs:element>
+               <xs:element name="commit" type="xs:nonNegativeInteger"></xs:element>
+               <xs:element name="commit-percent" type="hundredth-type"></xs:element>
+               <xs:element name="swpfree" type="xs:nonNegativeInteger"></xs:element>
+               <xs:element name="swpused" type="xs:nonNegativeInteger"></xs:element>
+               <xs:element name="swpused-percent" type="hundredth-type"></xs:element>
+               <xs:element name="swpcad" type="xs:nonNegativeInteger"></xs:element>
+               <xs:element name="swpcad-percent" type="hundredth-type"></xs:element>
+               <xs:element name="frmpg" type="hundredth-type"></xs:element>
+               <xs:element name="bufpg" type="hundredth-type"></xs:element>
+               <xs:element name="campg" type="hundredth-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="unit" type="unit-type"></xs:attribute>
+    </xs:complexType>
+    
+    <xs:simpleType name="unit-type">
+       <xs:restriction base="xs:string">
+               <xs:enumeration value="kB"></xs:enumeration>
+       </xs:restriction>
+    </xs:simpleType>
+
+
+    <xs:simpleType name="hundredth-type">
+       <xs:restriction base="xs:float">
+               <xs:pattern value="\d*\.\d\d"></xs:pattern>
+       </xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="paging" type="paging-type"></xs:element>
+    
+    <xs:complexType name="paging-type">
+       <xs:sequence></xs:sequence>
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+       <xs:attribute name="pgpgin" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="pgpgout" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="fault" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="majflt" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="pgfree" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="pgscank" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="pgscand" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="pgsteal" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="vmeff-precent" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-sock" type="net-sock-type"></xs:element>
+
+    <xs:complexType name="net-sock-type">
+       <xs:attribute name="totsck" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="tcpsck" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="udpsck" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="rawsck" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="ip-frag" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="tcp-tw" type="xs:nonNegativeInteger"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-sock6" type="net-sock6-type"></xs:element>
+
+    <xs:complexType name="net-sock6-type">
+        <xs:attribute name="tcp6sck" type="xs:nonNegativeInteger"></xs:attribute>
+        <xs:attribute name="udp6sck" type="xs:nonNegativeInteger"></xs:attribute>
+        <xs:attribute name="raw6sck" type="xs:nonNegativeInteger"></xs:attribute>
+        <xs:attribute name="ip6-frag" type="xs:nonNegativeInteger"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-nfsd" type="net-nfsd-type"></xs:element>
+
+    <xs:complexType name="net-nfsd-type">
+       <xs:sequence></xs:sequence>
+       <xs:attribute name="scall" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="badcall" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="packet" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="udp" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="tcp" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="hit" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="miss" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="sread" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="swrite" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="saccess" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="sgetatt" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-nfs" type="net-nfs-type"></xs:element>
+
+    <xs:complexType name="net-nfs-type">
+       <xs:attribute name="call" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="retrans" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="read" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="write" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="access" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="getatt" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-dev" type="net-dev-type"></xs:element>
+
+    <xs:complexType name="net-dev-type">
+       <xs:attribute name="iface" type="xs:string"></xs:attribute>    
+       <xs:attribute name="rxpck" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="txpck" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="rxkB" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="txkB" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="rxcmp" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="txcmp" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="rxmcst" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-edev" type="net-edev-type"></xs:element>
+
+    <xs:complexType name="net-edev-type">
+       <xs:attribute name="iface" type="xs:string"></xs:attribute>
+       <xs:attribute name="rxerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="txerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="coll" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="rxdrop" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="txdrop" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="txcarr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="rxfram" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="rxfifo" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="txfifo" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-ip" type="net-ip-type"></xs:element>
+
+    <xs:complexType name="net-ip-type">
+       <xs:attribute name="irec" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="fwddgm" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="idel" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="orq" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="asmrq" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="asmok" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="fragok" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="fragcrt" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-ip6" type="net-ip6-type"></xs:element>
+
+    <xs:complexType name="net-ip6-type">
+        <xs:attribute name="irec6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="fwddgm6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="idel6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="orq6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="asmrq6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="asmok6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="imcpck6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="omcpck6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="fragok6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="fragcr6" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-eip" type="net-eip-type"></xs:element>
+
+    <xs:complexType name="net-eip-type">
+       <xs:attribute name="ihdrerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iadrerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iukwnpr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="idisc" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="odisc" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="onort" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="asmf" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="fragf" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-eip6" type="net-eip6-type"></xs:element>
+
+    <xs:complexType name="net-eip6-type">
+        <xs:attribute name="ihdrer6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="iadrer6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="iukwnp6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="i2big6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="idisc6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="odisc6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="inort6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="onort6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="asmf6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="fragf6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="itrpck6" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-icmp" type="net-icmp-type"></xs:element>
+
+    <xs:complexType name="net-icmp-type">
+       <xs:attribute name="imsg" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="omsg" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iech" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iechr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oech" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oechr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="itm" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="itmr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="otm" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="otmr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iadrmk" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iadrmkr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oadrmk" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oadrmkr" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-icmp6" type="net-icmp6-type"></xs:element>
+
+    <xs:complexType name="net-icmp6-type">
+        <xs:attribute name="imsg6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="omsg6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="iech6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="iechr6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="oechr6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="igmbq6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="igmbr6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="ogmbr6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="igmbrd6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="ogmbrd6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="irtsol6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="ortsol6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="irtad6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="inbsol6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="onbsol6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="inbad6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="onbad6" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-eicmp" type="net-eicmp-type"></xs:element>
+
+    <xs:complexType name="net-eicmp-type">
+       <xs:attribute name="ierr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="idstunr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="odstunr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="itmex" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="otmex" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iparmpb" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oparmpb" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="isrcq" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="osrcq" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iredir" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oredir" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-eicmp6" type="net-eicmp6-type"></xs:element>
+
+    <xs:complexType name="net-eicmp6-type">
+        <xs:attribute name="ierr6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="idtunr6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="odtunr6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="itmex6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="otmex6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="iprmpb6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="oprmpb6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="iredir6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="oredir6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="ipck2b6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="opck2b6" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-tcp" type="net-tcp-type"></xs:element>
+
+    <xs:complexType name="net-tcp-type">
+       <xs:attribute name="active" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="passive" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iseg" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="oseg" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-etcp" type="net-etcp-type"></xs:element>
+
+    <xs:complexType name="net-etcp-type">
+       <xs:attribute name="atmptf" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="estres" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="retrans" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="isegerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="orsts/" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-udp" type="net-udp-type"></xs:element>
+
+    <xs:complexType name="net-udp-type">
+       <xs:attribute name="idgm" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="odgm" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="noport" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="idgmerr" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="net-udp6" type="net-udp6-type"></xs:element>
+
+    <xs:complexType name="net-udp6-type">
+        <xs:attribute name="idgm6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="odgm6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="noport6" type="hundredth-type"></xs:attribute>
+        <xs:attribute name="idgmer6" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="network" type="network-type"></xs:element>
+
+    <xs:complexType name="network-type">
+       <xs:sequence>
+               <xs:element name="net-dev" type="net-dev-type" minOccurs="1"></xs:element>
+               <xs:element name="net-edev" type="net-edev-type" minOccurs="1"></xs:element>
+               <xs:element name="net-nfs" type="net-nfs-type" minOccurs="1"></xs:element>
+               <xs:element name="net-nfsd" type="net-nfsd-type" minOccurs="1"></xs:element>
+               <xs:element name="net-sock" type="net-sock-type" minOccurs="1"></xs:element>
+               <xs:element name="net-ip" type="net-ip-type"></xs:element>
+               <xs:element name="net-eip" type="net-eip-type"></xs:element>
+               <xs:element name="net-icmp" type="net-icmp-type"></xs:element>
+               <xs:element name="net-eicmp" type="net-eicmp-type"></xs:element>
+               <xs:element name="net-tcp" type="net-tcp-type"></xs:element>
+               <xs:element name="net-etcp" type="net-etcp-type"></xs:element>
+               <xs:element name="net-udp" type="net-udp-type"></xs:element>
+                <xs:element name="net-sock6" type="net-sock6-type" minOccurs="1"></xs:element>
+                <xs:element name="net-ip6" type="net-ip6-type"></xs:element>
+                <xs:element name="net-eip6" type="net-eip6-type"></xs:element>
+                <xs:element name="net-icmp6" type="net-icmp6-type"></xs:element>
+                <xs:element name="net-eicmp6" type="net-eicmp6-type"></xs:element>
+                <xs:element name="net-udp6" type="net-udp6-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="tty" type="tty-type"></xs:element>
+
+    <xs:complexType name="tty-type">
+       <xs:attribute name="line" type="xs:int"></xs:attribute>
+       <xs:attribute name="rcvin" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="xmtin" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="framerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="prtyerr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="brk" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="ovrun" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="serial" type="serial-type"></xs:element>
+
+    <xs:complexType name="serial-type">
+       <xs:sequence>
+               <xs:element name="tty" type="tty-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="disk-device" type="disk-device-type"></xs:element>
+
+    <xs:complexType name="disk-device-type">
+       <xs:attribute name="dev" type="xs:string"></xs:attribute>
+       <xs:attribute name="tps" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="rd_sec" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="wr_sec" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="avgrq-sz" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="avrqu-sz" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="await" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="svctm" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="util-percent" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="disk" type="disk-type"></xs:element>
+
+    <xs:complexType name="disk-type">
+       <xs:sequence>
+               <xs:element name="disk-device" type="disk-device-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="tps" type="tps-type"></xs:element>
+
+    <xs:element name="io-reads" type="io-reads-type"></xs:element>
+
+    <xs:complexType name="io-reads-type">
+       <xs:attribute name="rtps" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="bread" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="io-writes" type="io-writes-type"></xs:element>
+
+    <xs:complexType name="io-writes-type">
+       <xs:attribute name="wtps" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="bwrtn" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="io" type="io-type"></xs:element>
+
+    <xs:complexType name="io-type">
+       <xs:sequence>
+               <xs:element name="io-reads" type="io-reads-type" minOccurs="1"></xs:element>
+               <xs:element name="io-writes" type="io-writes-type" minOccurs="1"></xs:element>
+               <xs:element name="tps" type="tps-type" minOccurs="1"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="swap-pages" type="swap-pages-type"></xs:element>
+
+    <xs:complexType name="swap-pages-type">
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+       <xs:attribute name="pswpin" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="pswpout" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="int-global" type="int-global-type"></xs:element>
+
+    <xs:complexType name="int-global-type">
+       <xs:sequence>
+               <xs:element name="irq" type="irq-type" minOccurs="1"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="cpu-frequency" type="cpu-frequency-type"></xs:element>
+
+    <xs:complexType name="cpu-frequency-type">
+       <xs:sequence>
+               <xs:element name="cpufreq" type="cpufreq-type" minOccurs="1"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="unit" type="frequnit-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:simpleType name="frequnit-type">
+       <xs:restriction base="xs:string">
+               <xs:enumeration value="MHz"></xs:enumeration>
+       </xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="fan-speed" type="fan-speed-type"></xs:element>
+
+    <xs:complexType name="fan-speed-type">
+       <xs:sequence>
+               <xs:element name="fan" type="fan-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="unit" type="fanunit-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:simpleType name="fanunit-type">
+       <xs:restriction base="xs:string">
+               <xs:enumeration value="rpm"></xs:enumeration>
+       </xs:restriction>
+    </xs:simpleType>
+
+   <xs:element name="temperature" type="temperature-type"></xs:element>
+
+   <xs:complexType name="temperature-type">
+       <xs:sequence>
+               <xs:element name="temp" type="temp-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="unit" type="tempunit-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:simpleType name="tempunit-type">
+       <xs:restriction base="xs:string">
+               <xs:enumeration value="degree Celsius"></xs:enumeration>
+       </xs:restriction>
+    </xs:simpleType>
+
+   <xs:element name="voltage-input" type="voltage-input-type"></xs:element>
+
+   <xs:complexType name="voltage-input-type">
+       <xs:sequence>
+               <xs:element name="in" type="in-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="unit" type="inunit-type"></xs:attribute>
+   </xs:complexType>
+
+    <xs:simpleType name="inunit-type">
+       <xs:restriction base="xs:string">
+               <xs:enumeration value="V"></xs:enumeration>
+       </xs:restriction>
+   </xs:simpleType>
+
+    <xs:element name="irq" type="irq-type"></xs:element>
+
+    <xs:complexType name="irq-type">
+       <xs:attribute name="intr" type="xs:int"></xs:attribute>
+       <xs:attribute name="value" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+    
+    <xs:element name="cpufreq" type="cpufreq-type"></xs:element>
+
+    <xs:complexType name="cpufreq-type">
+       <xs:attribute name="number" type="xs:string"></xs:attribute>
+       <xs:attribute name="frequency" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="fan" type="fan-type"></xs:element>
+
+    <xs:complexType name="fan-type">
+       <xs:attribute name="number" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="rpm" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="drpm" type="xs:integer"></xs:attribute>
+       <xs:attribute name="device" type="xs:string"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="temp" type="temp-type"></xs:element>
+
+    <xs:complexType name="temp-type">
+       <xs:attribute name="number" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="degC" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="percent-temp" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="device" type="xs:string"></xs:attribute>
+    </xs:complexType>
+
+   <xs:element name="in" type="in-type"></xs:element>
+
+   <xs:complexType name="in-type">
+       <xs:attribute name="number" type="xs:nonNegativeInteger"></xs:attribute>
+       <xs:attribute name="inV" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="percent-in" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="device" type="xs:string"></xs:attribute>
+   </xs:complexType>
+
+    <xs:element name="cpu" type="cpu-type"></xs:element>
+
+    <xs:complexType name="cpu-type">
+       <xs:attribute name="number" type="xs:string"></xs:attribute>
+       <xs:attribute name="user" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="nice" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="system" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iowait" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="steal" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="idle" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="cpu-all" type="cpu-all-type"></xs:element>
+
+    <xs:complexType name="cpu-all-type">
+       <xs:attribute name="number" type="xs:string"></xs:attribute>
+       <xs:attribute name="usr" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="nice" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="sys" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="iowait" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="steal" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="irq" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="soft" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="guest" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="idle" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="cpu-load" type="cpu-load-type"></xs:element>
+
+    <xs:complexType name="cpu-load-type">
+       <xs:sequence>
+               <xs:element name="cpu" type="cpu-type"></xs:element>
+       </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="cpu-load-all" type="cpu-load-all-type"></xs:element>
+
+    <xs:complexType name="cpu-load-all-type">
+       <xs:sequence>
+               <xs:element name="cpu-all" type="cpu-all-type"></xs:element>
+       </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="process-and-context-switch"
+           type="process-and-context-switch-type"></xs:element>
+
+    <xs:complexType name="process-and-context-switch-type">
+       <xs:attribute name="per" type="per-type"></xs:attribute>
+       <xs:attribute name="proc" type="hundredth-type"></xs:attribute>
+       <xs:attribute name="cswch" type="hundredth-type"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="timestamp" type="timestamp-type"></xs:element>
+
+    <xs:complexType name="timestamp-type">
+       <xs:sequence>
+               <xs:element name="cpu-load" type="cpu-load-type"></xs:element>
+               <xs:element name="cpu-load-all" type="cpu-load-all-type"></xs:element>
+               <xs:element name="process-and-context-switch"
+                       type="process-and-context-switch-type"></xs:element>
+               <xs:element name="interrupts" type="interrupts-type"></xs:element>
+               <xs:element name="swap-pages" type="swap-pages-type"></xs:element>
+               <xs:element name="paging" type="paging-type"></xs:element>
+               <xs:element name="io" type="io-type"></xs:element>
+               <xs:element name="memory" type="memory-type"></xs:element>
+               <xs:element name="kernel" type="kernel-type"></xs:element>
+               <xs:element name="queue" type="queue-type"></xs:element>
+               <xs:element name="serial" type="serial-type"></xs:element>
+               <xs:element name="disk" type="disk-type"></xs:element>
+               <xs:element name="network" type="network-type"></xs:element>
+               <xs:element name="power-management" type="power-management-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="date" type="xs:date"></xs:attribute>
+       <xs:attribute name="time" type="xs:time"></xs:attribute>
+       <xs:attribute name="interval" type="xs:nonNegativeInteger"></xs:attribute>
+    </xs:complexType>
+
+    <xs:element name="interrupts" type="interrupts-type"></xs:element>
+
+    <xs:complexType name="interrupts-type">
+       <xs:sequence>
+               <xs:element name="int-global" type="int-global-type"
+                       minOccurs="1">
+               </xs:element>
+       </xs:sequence>
+    </xs:complexType>
+    
+    <xs:element name="power-management" type="power-management-type"></xs:element>
+
+    <xs:complexType name="power-management-type">
+       <xs:sequence>
+               <xs:element name="cpu-frequency" type="cpu-frequency-type"
+                       minOccurs="1">
+               </xs:element>
+               <xs:element name="fan-speed" type="fan-speed-type"></xs:element>
+               <xs:element name="temperature" type="temperature-type"></xs:element>
+               <xs:element name="voltage-input" type="voltage-input-type"></xs:element>
+       </xs:sequence>
+    </xs:complexType>
+
+    <xs:simpleType name="tps-type">
+       <xs:restriction base="hundredth-type"></xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="statistics" type="statistics-type"></xs:element>
+
+    <xs:complexType name="statistics-type">
+       <xs:sequence>
+               <xs:element name="timestamp" type="timestamp-type"></xs:element>
+       </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="release" type="release-type"></xs:element>
+
+    <xs:simpleType name="release-type">
+       <xs:restriction base="xs:string"></xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="machine" type="machine-type"></xs:element>
+
+    <xs:simpleType name="machine-type">
+       <xs:restriction base="xs:string"></xs:restriction>
+    </xs:simpleType>
+    
+    <xs:element name="number-of-cpus" type="number-of-cpus-type"></xs:element>
+
+    <xs:simpleType name="number-of-cpus-type">
+       <xs:restriction base="xs:nonNegativeInteger"></xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="file-date" type="file-date-type"></xs:element>
+
+    <xs:simpleType name="file-date-type">
+        <xs:restriction base="xs:date"></xs:restriction>
+
+    </xs:simpleType>
+    <xs:element name="sysname" type="sysname-type"></xs:element>
+
+    <xs:simpleType name="sysname-type">
+       <xs:restriction base="xs:string"></xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="host" type="host-type"></xs:element>
+
+    <xs:complexType name="host-type">
+       <xs:sequence>
+               <xs:element name="sysname" type="sysname-type"></xs:element>
+               <xs:element name="release" type="release-type"></xs:element>
+               <xs:element name="machine" type="machine-type"></xs:element>
+               <xs:element name="file-date" type="file-date-type"></xs:element>
+               <xs:element name="number-of-cpus" type="number-of-cpus-type"></xs:element>
+               <xs:element name="statistics" type="statistics-type"></xs:element>
+               <xs:element name="restarts" type="restarts-type"></xs:element>
+               <xs:element name="comments" type="comments-type"></xs:element>
+       </xs:sequence>
+       <xs:attribute name="nodename" type="xs:string"></xs:attribute>
+    </xs:complexType>
+    
+    <xs:element name="sysdata-version" type="sysdata-version-type"></xs:element>
+
+
+    <xs:simpleType name="sysdata-version-type">
+       <xs:restriction base="xs:string"></xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="sysstat" type="sysstat-type"></xs:element>
+
+    <xs:complexType name="sysstat-type">
+       <xs:sequence>
+               <xs:element name="sysdata-version"
+                       type="sysdata-version-type">
+               </xs:element>
+               <xs:element name="host" type="host-type"></xs:element>
+       </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="restarts" type="restarts-type"></xs:element>
+
+    <xs:complexType name="restarts-type">
+       <xs:sequence>
+               <xs:element name="boot" type="boot-type"></xs:element>
+       </xs:sequence>
+    </xs:complexType>
+    
+    <xs:element name="comments" type="comments-type"></xs:element>
+
+    <xs:complexType name="comments-type">
+       <xs:attribute name="date" type="xs:date"></xs:attribute>
+       <xs:attribute name="time" type="xs:time"></xs:attribute>
+       <xs:attribute name="comment" type="xs:string"></xs:attribute>
+    </xs:complexType>
+
+    
+
+    <xs:element name="boot" type="boot-type"></xs:element>
+
+    <xs:complexType name="boot-type">
+       <xs:sequence></xs:sequence>
+       <xs:attribute name="date" type="xs:date"></xs:attribute>
+       <xs:attribute name="time" type="xs:time"></xs:attribute>
+    </xs:complexType>
+</xs:schema>