"CPU;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%gnice;%idle",
#endif
.gtypes_nr = {10, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_cpu_stats,
.f_xml_print = xml_print_cpu_stats,
.hdr_line = "proc/s;cswch/s",
#endif
.gtypes_nr = {1, 1, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_pcsw_stats,
.f_xml_print = xml_print_pcsw_stats,
.hdr_line = "INTR;intr/s",
#endif
.gtypes_nr = {1, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_irq_stats,
.f_xml_print = xml_print_irq_stats,
.hdr_line = "pswpin/s;pswpout/s",
#endif
.gtypes_nr = {0, 2, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_swap_stats,
.f_xml_print = xml_print_swap_stats,
"pgfree/s;pgscank/s;pgscand/s;pgsteal/s;%vmeff",
#endif
.gtypes_nr = {0, 8, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_paging_stats,
.f_xml_print = xml_print_paging_stats,
.hdr_line = "tps;rtps;wtps;bread/s;bwrtn/s",
#endif
.gtypes_nr = {5, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_io_stats,
.f_xml_print = xml_print_io_stats,
"kbswpfree;kbswpused;%swpused;kbswpcad;%swpcad",
#endif
.gtypes_nr = {0, 17, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_memory_stats,
.f_xml_print = xml_print_memory_stats,
.hdr_line = "dentunusd;file-nr;inode-nr;pty-nr",
#endif
.gtypes_nr = {0, 0, 4},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_ktables_stats,
.f_xml_print = xml_print_ktables_stats,
.hdr_line = "runq-sz;plist-sz;ldavg-1;ldavg-5;ldavg-15;blocked",
#endif
.gtypes_nr = {0, 2, 4},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_queue_stats,
.f_xml_print = xml_print_queue_stats,
.hdr_line = "TTY;rcvin/s;txmtin/s;framerr/s;prtyerr/s;brk/s;ovrun/s",
#endif
.gtypes_nr = {0, 0, 7},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_serial_stats,
.f_xml_print = xml_print_serial_stats,
.hdr_line = "DEV;tps;rkB/s;wkB/s;areq-sz;aqu-sz;await;svctm;%util",
#endif
.gtypes_nr = {1, 2, 6},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_disk_stats,
.f_xml_print = xml_print_disk_stats,
.hdr_line = "IFACE;rxpck/s;txpck/s;rxkB/s;txkB/s;rxcmp/s;txcmp/s;rxmcst/s;%ifutil",
#endif
.gtypes_nr = {7, 0, 1},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_dev_stats,
.f_xml_print = xml_print_net_dev_stats,
"txcarr/s;rxfram/s;rxfifo/s;txfifo/s",
#endif
.gtypes_nr = {9, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_edev_stats,
.f_xml_print = xml_print_net_edev_stats,
.hdr_line = "call/s;retrans/s;read/s;write/s;access/s;getatt/s",
#endif
.gtypes_nr = {0, 0, 6},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_nfs_stats,
.f_xml_print = xml_print_net_nfs_stats,
"sread/s;swrite/s;saccess/s;sgetatt/s",
#endif
.gtypes_nr = {0, 0, 11},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_nfsd_stats,
.f_xml_print = xml_print_net_nfsd_stats,
.hdr_line = "totsck;tcpsck;udpsck;rawsck;ip-frag;tcp-tw",
#endif
.gtypes_nr = {0, 0, 6},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_sock_stats,
.f_xml_print = xml_print_net_sock_stats,
.hdr_line = "irec/s;fwddgm/s;idel/s;orq/s;asmrq/s;asmok/s;fragok/s;fragcrt/s",
#endif
.gtypes_nr = {8, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_ip_stats,
.f_xml_print = xml_print_net_ip_stats,
.hdr_line = "ihdrerr/s;iadrerr/s;iukwnpr/s;idisc/s;odisc/s;onort/s;asmf/s;fragf/s",
#endif
.gtypes_nr = {8, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_eip_stats,
.f_xml_print = xml_print_net_eip_stats,
"otmr/s;iadrmk/s;iadrmkr/s;oadrmk/s;oadrmkr/s",
#endif
.gtypes_nr = {0, 14, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_icmp_stats,
.f_xml_print = xml_print_net_icmp_stats,
"iparmpb/s;oparmpb/s;isrcq/s;osrcq/s;iredir/s;oredir/s",
#endif
.gtypes_nr = {0, 12, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_eicmp_stats,
.f_xml_print = xml_print_net_eicmp_stats,
.hdr_line = "active/s;passive/s;iseg/s;oseg/s",
#endif
.gtypes_nr = {0, 4, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_tcp_stats,
.f_xml_print = xml_print_net_tcp_stats,
.hdr_line = "atmptf/s;estres/s;retrans/s;isegerr/s;orsts/s",
#endif
.gtypes_nr = {0, 5, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_etcp_stats,
.f_xml_print = xml_print_net_etcp_stats,
.hdr_line = "idgm/s;odgm/s;noport/s;idgmerr/s",
#endif
.gtypes_nr = {0, 4, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_udp_stats,
.f_xml_print = xml_print_net_udp_stats,
.hdr_line = "tcp6sck;udp6sck;raw6sck;ip6-frag",
#endif
.gtypes_nr = {0, 0, 4},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_sock6_stats,
.f_xml_print = xml_print_net_sock6_stats,
"imcpck6/s;omcpck6/s;fragok6/s;fragcr6/s",
#endif
.gtypes_nr = {10, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_ip6_stats,
.f_xml_print = xml_print_net_ip6_stats,
"inort6/s;onort6/s;asmf6/s;fragf6/s;itrpck6/s",
#endif
.gtypes_nr = {11, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_eip6_stats,
.f_xml_print = xml_print_net_eip6_stats,
"inbad6/s;onbad6/s",
#endif
.gtypes_nr = {0, 17, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_icmp6_stats,
.f_xml_print = xml_print_net_icmp6_stats,
"iprmpb6/s;oprmpb6/s;iredir6/s;oredir6/s;ipck2b6/s;opck2b6/s",
#endif
.gtypes_nr = {0, 11, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_eicmp6_stats,
.f_xml_print = xml_print_net_eicmp6_stats,
.hdr_line = "idgm6/s;odgm6/s;noport6/s;idgmer6/s",
#endif
.gtypes_nr = {0, 4, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_net_udp6_stats,
.f_xml_print = xml_print_net_udp6_stats,
.hdr_line = "CPU;MHz",
#endif
.gtypes_nr = {0, 1, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_pwr_cpufreq_stats,
.f_xml_print = xml_print_pwr_cpufreq_stats,
.hdr_line = "FAN;DEVICE;rpm;drpm",
#endif
.gtypes_nr = {2, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_pwr_fan_stats,
.f_xml_print = xml_print_pwr_fan_stats,
.hdr_line = "TEMP;DEVICE;degC;%temp",
#endif
.gtypes_nr = {3, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_pwr_temp_stats,
.f_xml_print = xml_print_pwr_temp_stats,
.hdr_line = "IN;DEVICE;inV;%in",
#endif
.gtypes_nr = {3, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_pwr_in_stats,
.f_xml_print = xml_print_pwr_in_stats,
.hdr_line = "kbhugfree;kbhugused;%hugused",
#endif
.gtypes_nr = {0, 2, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_huge_stats,
.f_xml_print = xml_print_huge_stats,
.hdr_line = "CPU;wghMHz",
#endif
.gtypes_nr = {1, 1, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_pwr_wghfreq_stats,
.f_xml_print = xml_print_pwr_wghfreq_stats,
.hdr_line = "manufact;product;BUS;idvendor;idprod;maxpower",
#endif
.gtypes_nr = {0, 0, 4},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_pwr_usb_stats,
.f_xml_print = xml_print_pwr_usb_stats,
"MOUNTPOINT;MBfsfree;MBfsused;%fsused;%ufsused;Ifree;Iused;%Iused",
#endif
.gtypes_nr = {5, 0, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_filesystem_stats,
.f_xml_print = xml_print_filesystem_stats,
.hdr_line = "FCHOST;fch_rxf/s;fch_txf/s;fch_rxw/s;fch_txw/s",
#endif
.gtypes_nr = {0, 4, 0},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_fchost_stats,
.f_xml_print = xml_print_fchost_stats,
.hdr_line = "CPU;total/s;dropd/s;squeezd/s;rx_rps/s;flw_lim/s",
#endif
.gtypes_nr = {0, 0, 5},
+ .ftypes_nr = {0, 0, 0},
#ifdef SOURCE_SADF
.f_render = render_softnet_stats,
.f_xml_print = xml_print_softnet_stats,
}
}
else if (act[p]->nr > 0) {
+ /*
+ * Note: If msize was smaller than fsize,
+ * then it has been set to fsize in check_file_actlst().
+ */
sa_fread(ifd, act[p]->buf[curr], act[p]->fsize * act[p]->nr * act[p]->nr2, HARD_SIZE);
}
else {
/* Normalize endianness for current activity's structures */
if (endian_mismatch) {
for (j = 0; j < (act[p]->nr * act[p]->nr2); j++) {
- swap_struct(act[p]->gtypes_nr, (char *) act[p]->buf[curr] + j * act[p]->msize,
+ swap_struct(act[p]->ftypes_nr, (char *) act[p]->buf[curr] + j * act[p]->msize,
arch_64);
}
}
+
+ /* Remap structure's fields to those known by current sysstat version */
+ for (j = 0; j < (act[p]->nr * act[p]->nr2); j++) {
+ remap_struct(act[p]->gtypes_nr, act[p]->ftypes_nr,
+ (char *) act[p]->buf[curr] + j * act[p]->msize, act[p]->fsize);
+ }
}
}
struct file_activity **file_actlst, unsigned int id_seq[],
int ignore, int *endian_mismatch, int *arch_64)
{
- int i, j, p;
+ int i, j, k, p;
unsigned int a_cpu = FALSE;
struct file_activity *fal;
void *buffer = NULL;
memcpy(file_hdr, buffer, FILE_HEADER_SIZE);
free(buffer);
- /* Normalize endianness for file_hdr structure */
+ /* Tell that data come from a 64 bit machine */
*arch_64 = (file_hdr->sa_sizeof_long == SIZEOF_LONG_64BIT);
+
+ /* Normalize endianness for file_hdr structure */
if (*endian_mismatch) {
swap_struct(hdr_types_nr, file_hdr, *arch_64);
}
if (fal->nr > act[p]->nr_max) {
handle_invalid_sa_file(ifd, file_magic, dfile, 0);
}
+ /*
+ * Number of fields of each type ("long long", or "long"
+ * or "int") composing the structure with statistics may
+ * only increase with new sysstat versions. Here, we may
+ * be reading a file created by current sysstat version,
+ * or by an older or a newer version.
+ */
+ if (!(((fal->types_nr[0] >= act[p]->gtypes_nr[0]) &&
+ (fal->types_nr[1] >= act[p]->gtypes_nr[1]) &&
+ (fal->types_nr[2] >= act[p]->gtypes_nr[2]))
+ ||
+ ((fal->types_nr[0] <= act[p]->gtypes_nr[0]) &&
+ (fal->types_nr[1] <= act[p]->gtypes_nr[1]) &&
+ (fal->types_nr[2] <= act[p]->gtypes_nr[2])))) {
+ handle_invalid_sa_file(ifd, file_magic, dfile, 0);
+ }
+ for (k = 0; k < 3; k++) {
+ act[p]->ftypes_nr[k] = fal->types_nr[k];
+ }
if (fal->id == A_CPU) {
a_cpu = TRUE;