626e1f7
diff -up net-tools-1.60/include/interface.h.stack net-tools-1.60/include/interface.h
3f72065
--- net-tools-1.60/include/interface.h.stack	2012-01-05 12:22:43.000000000 +0100
3f72065
+++ net-tools-1.60/include/interface.h	2012-01-05 13:00:10.564699085 +0100
626e1f7
@@ -73,7 +73,7 @@ extern int do_if_print(struct interface
626e1f7
 
626e1f7
 extern int    procnetdev_version(char *buf);
626e1f7
 extern int    get_dev_fields(char *bp, struct interface *ife);
626e1f7
-extern char * get_name(char *name, char *p);
626e1f7
+extern char * get_name(char **namep, char *p);
626e1f7
 
626e1f7
 extern void ife_print(struct interface *ptr);
626e1f7
 
626e1f7
diff -up net-tools-1.60/lib/interface.c.stack net-tools-1.60/lib/interface.c
3f72065
--- net-tools-1.60/lib/interface.c.stack	2012-01-05 13:00:10.561699123 +0100
3f72065
+++ net-tools-1.60/lib/interface.c	2012-01-05 13:03:19.522336790 +0100
626e1f7
@@ -214,10 +214,11 @@ out:
331d28b
     return err;
331d28b
 }
331d28b
 
626e1f7
-char *get_name(char *name, char *p)
626e1f7
+char *get_name(char **namep, char *p)
331d28b
 {
331d28b
     while (isspace(*p))
331d28b
 	p++;
331d28b
+    char *name = *namep = p;
331d28b
     while (*p) {
331d28b
 	if (isspace(*p))
331d28b
 	    break;
3f72065
@@ -320,20 +321,22 @@ int get_dev_fields(char *bp, struct inte
626e1f7
 static int if_readlist_proc(char *target)
331d28b
 {
331d28b
     FILE *fh;
331d28b
-    char buf[512];
331d28b
     struct interface *ife;
331d28b
     int err;
331d28b
+    char *line = NULL;
331d28b
+    size_t linelen = 0;
331d28b
 
626e1f7
     fh = fopen(_PATH_PROCNET_DEV, "r");
626e1f7
     if (!fh) {
3f72065
 		fprintf(stderr, _("Warning: cannot open %s (%s). Limited output.\n"),
331d28b
 			_PATH_PROCNET_DEV, strerror(errno)); 
626e1f7
 		return -2;
3f72065
-	}	
3f72065
-    if (fgets(buf, sizeof buf, fh))
3f72065
-		/* eat line */;
3f72065
-    if (fgets(buf, sizeof buf, fh))
3f72065
-		/* eat line */;
3f72065
+	}
331d28b
+    if (getline(&line, &linelen, fh) == -1 /* eat line */
3f72065
+	|| getline(&line, &linelen, fh) == -1) { /* eat line */
331d28b
+		err = -1;
331d28b
+		goto out;
3f72065
+	}
331d28b
 
331d28b
 #if 0				/* pretty, but can't cope with missing fields */
331d28b
     fmt = proc_gen_fmt(_PATH_PROCNET_DEV, 1, fh,
3f72065
@@ -358,13 +361,13 @@ static int if_readlist_proc(char *target
331d28b
     if (!fmt)
331d28b
 	return -1;
331d28b
 #else
331d28b
-    procnetdev_vsn = procnetdev_version(buf);
331d28b
+    procnetdev_vsn = procnetdev_version(line);
331d28b
 #endif
331d28b
 
331d28b
     err = 0;
331d28b
-    while (fgets(buf, sizeof buf, fh)) {
331d28b
-	char *s, name[IFNAMSIZ];
331d28b
-	s = get_name(name, buf);    
331d28b
+    while (getline(&line, &linelen, fh) != -1) {
331d28b
+	char *s, *name;
331d28b
+	s = get_name(&name, line);    
626e1f7
 	ife = if_cache_add(name);
331d28b
 	get_dev_fields(s, ife);
331d28b
 	ife->statistics_valid = 1;
3f72065
@@ -379,6 +382,8 @@ static int if_readlist_proc(char *target
331d28b
 #if 0
331d28b
     free(fmt);
331d28b
 #endif
331d28b
+  out:
331d28b
+    free(line);
331d28b
     fclose(fh);
331d28b
     return err;
331d28b
 }
3f72065
@@ -386,24 +391,28 @@ static int if_readlist_proc(char *target
331d28b
 static int if_readlist_rep(char *target, struct interface *ife)
331d28b
 {
331d28b
     FILE *fh;
331d28b
-    char buf[512];
331d28b
     int err;
331d28b
+    char *line = NULL;
331d28b
+    size_t linelen = 0;
331d28b
 
331d28b
     fh = fopen(_PATH_PROCNET_DEV, "r");
331d28b
     if (!fh) {
3f72065
 		fprintf(stderr, _("Warning: cannot open %s (%s). Limited output.\n"),
331d28b
 			_PATH_PROCNET_DEV, strerror(errno)); 
331d28b
 		return if_readconf();
3f72065
-	}	
331d28b
-    fgets(buf, sizeof buf, fh);	/* eat line */
331d28b
-    fgets(buf, sizeof buf, fh);
3f72065
+	}
331d28b
+    if (getline(&line, &linelen, fh) == -1 /* eat line */
3f72065
+	|| getline(&line, &linelen, fh) == -1) { /* eat line */
331d28b
+		err = -1;
331d28b
+		goto out;
3f72065
+	}
331d28b
 
331d28b
-    procnetdev_vsn = procnetdev_version(buf);
331d28b
+    procnetdev_vsn = procnetdev_version(line);
331d28b
 
331d28b
     err = 0;
331d28b
-    while (fgets(buf, sizeof buf, fh)) {
331d28b
-	char *s, name[IFNAMSIZ];
331d28b
-	s = get_name(name, buf);    
331d28b
+    while (getline(&line, &linelen, fh) != -1) {
331d28b
+	char *s, *name;
331d28b
+	s = get_name(&name, line);    
331d28b
 	get_dev_fields(s, ife);
331d28b
 	if (target && !strcmp(target,name))
331d28b
 	{
3f72065
@@ -416,6 +425,8 @@ static int if_readlist_rep(char *target,
331d28b
 	err = -1;
331d28b
     }
331d28b
 
331d28b
+  out:
331d28b
+    free(line);
331d28b
     fclose(fh);
331d28b
     return err;
331d28b
 }