Blob Blame History Raw
--- netkit-rusers-0.17/rpc.rstatd/rstat_proc.c.2.4	Wed Feb 14 20:54:31 2001
+++ netkit-rusers-0.17/rpc.rstatd/rstat_proc.c	Wed Feb 14 20:55:08 2001
@@ -385,12 +385,14 @@
 
 #if defined(__linux__)
 
+#define MAX_DISKS 4
+
 struct _ldisk {
-	unsigned int xfer[4];
-	unsigned int rio[4];
-	unsigned int wio[4];
-	unsigned int rblk[4];
-	unsigned int wblk[4];
+	unsigned int xfer[MAX_DISKS];
+	unsigned int rio[MAX_DISKS];
+	unsigned int wio[MAX_DISKS];
+	unsigned int rblk[MAX_DISKS];
+	unsigned int wblk[MAX_DISKS];
 };
 
 static void
@@ -401,7 +403,8 @@
   static int stat;
 #define	BUFFSIZE	1024
   char buff[BUFFSIZE];
-
+  int ndisks;
+  
   if ((stat=open("/proc/stat", O_RDONLY, 0)) != -1) {
     char* b;
     buff[BUFFSIZE-1] = 0;  /* ensure null termination in buffer */
@@ -410,24 +413,29 @@
     *itot = 0; 
     *i1 = 1;   /* ensure assert below will fail if the sscanf bombs */
     b = strstr(buff, "cpu ");
+    if(b)
     sscanf(b, "cpu  %lu %lu %lu %lu", cuse, cice, csys, cide);
-    b = strstr(buff, "disk ");
-    sscanf(b, "disk %u %u %u %u", d->xfer+0, d->xfer+1, d->xfer+2, d->xfer+3);
-    b = strstr(buff, "disk_rio ");
-    sscanf(b, "disk_rio %u %u %u %u", d->rio+0, d->rio+1, d->rio+2, d->rio+3);
-    b = strstr(buff, "disk_wio ");
-    sscanf(b, "disk_rio %u %u %u %u", d->wio+0, d->wio+1, d->wio+2, d->wio+3);
-    b = strstr(buff, "disk_rblk ");
-    sscanf(b, "disk_rblk %u %u %u %u", d->rblk+0,d->rblk+1,d->rblk+2,d->rblk+3);
-    b = strstr(buff, "disk_wblk ");
-    sscanf(b, "disk_wblk %u %u %u %u", d->wblk+0,d->wblk+1,d->wblk+2,d->wblk+3);
+    b = strstr(buff, "disk_io:");
+    ndisks = 0;
+    while ( (b = strstr(b, "):")) != NULL && ndisks < MAX_DISKS ) {
+      sscanf (b, "):(%u,%u,%u,%u,%u)", &d->xfer[ndisks], 
+	      &d->rio[ndisks], &d->rblk[ndisks], 
+	      &d->wio[ndisks], &d->wblk[ndisks]);
+      ndisks++;
+      b += 2;
+    }
+
     b = strstr(buff, "page ");
+    if(b)
     sscanf(b, "page %u %u", pin, pout);
     b = strstr(buff, "swap ");
+    if(b)
     sscanf(b, "swap %u %u", sin, sout);
     b = strstr(buff, "intr ");
+    if(b)
     sscanf(b, "intr %u %u", itot, i1);
     b = strstr(buff, "ctxt ");
+    if(b)
     sscanf(b, "ctxt %u", ct);
     assert(*itot>*i1);
   }
@@ -477,6 +485,7 @@
 {
     switch (procnetdev_vsn) {
     case 3:
+	if(bp)
 	sscanf(bp,
 	"%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",
 	       &ife->stats.rx_bytes,
@@ -498,6 +507,7 @@
 	       &ife->stats.tx_compressed);
 	break;
     case 2:
+	if(bp)
 	sscanf(bp, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",
 	       &ife->stats.rx_bytes,
 	       &ife->stats.rx_packets,
@@ -516,6 +526,7 @@
 	ife->stats.rx_multicast = 0;
 	break;
     case 1:
+	if(bp)
 	sscanf(bp, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",
 	       &ife->stats.rx_packets,
 	       &ife->stats.rx_errors,