|
|
95ca85a |
diff -up net-tools-2.0/include/interface.h.stack net-tools-2.0/include/interface.h
|
|
|
95ca85a |
diff -up net-tools-2.0/lib/interface.c.stack net-tools-2.0/lib/interface.c
|
|
|
fbff637 |
--- net-tools-2.0/lib/interface.c.stack 2014-11-24 14:54:32.293134466 +0100
|
|
|
fbff637 |
+++ net-tools-2.0/lib/interface.c 2014-11-24 15:07:58.434764441 +0100
|
|
|
626e1f7 |
@@ -214,10 +214,11 @@ out:
|
|
|
331d28b |
return err;
|
|
|
331d28b |
}
|
|
|
331d28b |
|
|
|
fbff637 |
-static const char *get_name(char *name, const char *p)
|
|
|
fbff637 |
+static const char *get_name(char **namep, const char *p)
|
|
|
331d28b |
{
|
|
|
331d28b |
while (isspace(*p))
|
|
|
331d28b |
p++;
|
|
|
331d28b |
+ char *name = *namep = p;
|
|
|
331d28b |
while (*p) {
|
|
|
331d28b |
if (isspace(*p))
|
|
|
331d28b |
break;
|
|
|
fbff637 |
@@ -320,9 +321,10 @@ static int get_dev_fields(const char *bp
|
|
|
fbff637 |
static int if_readlist_proc(const char *target)
|
|
|
331d28b |
{
|
|
|
331d28b |
FILE *fh;
|
|
|
331d28b |
- char buf[512];
|
|
|
331d28b |
struct interface *ife;
|
|
|
331d28b |
int err;
|
|
|
331d28b |
+ char *line = NULL;
|
|
|
fbff637 |
+ size_t linelen = 0;
|
|
|
331d28b |
|
|
|
626e1f7 |
fh = fopen(_PATH_PROCNET_DEV, "r");
|
|
|
626e1f7 |
if (!fh) {
|
|
|
fbff637 |
@@ -330,10 +332,11 @@ static int if_readlist_proc(const char *
|
|
|
c90847a |
_PATH_PROCNET_DEV, strerror(errno));
|
|
|
626e1f7 |
return -2;
|
|
|
c90847a |
}
|
|
|
3f72065 |
- if (fgets(buf, sizeof buf, fh))
|
|
|
3f72065 |
- /* eat line */;
|
|
|
3f72065 |
- if (fgets(buf, sizeof buf, fh))
|
|
|
3f72065 |
- /* eat line */;
|
|
|
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,
|
|
|
fbff637 |
@@ -358,14 +361,14 @@ static int if_readlist_proc(const char *
|
|
|
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 |
+ while (getline(&line, &linelen, fh) != -1) {
|
|
|
fbff637 |
const char *s;
|
|
|
fbff637 |
- char name[IFNAMSIZ];
|
|
|
fbff637 |
- s = get_name(name, buf);
|
|
|
fbff637 |
+ char *name;
|
|
|
331d28b |
+ s = get_name(&name, line);
|
|
|
626e1f7 |
ife = if_cache_add(name);
|
|
|
331d28b |
get_dev_fields(s, ife);
|
|
|
331d28b |
ife->statistics_valid = 1;
|
|
|
fbff637 |
@@ -380,6 +383,8 @@ static int if_readlist_proc(const char *
|
|
|
331d28b |
#if 0
|
|
|
331d28b |
free(fmt);
|
|
|
331d28b |
#endif
|
|
|
331d28b |
+ out:
|
|
|
331d28b |
+ free(line);
|
|
|
331d28b |
fclose(fh);
|
|
|
331d28b |
return err;
|
|
|
331d28b |
}
|
|
|
fbff637 |
@@ -387,24 +392,28 @@ static int if_readlist_proc(const char *
|
|
|
fbff637 |
static int if_readlist_rep(const 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 |
{
|
|
|
fbff637 |
@@ -417,6 +426,8 @@ static int if_readlist_rep(const char *t
|
|
|
331d28b |
err = -1;
|
|
|
331d28b |
}
|
|
|
331d28b |
|
|
|
331d28b |
+ out:
|
|
|
331d28b |
+ free(line);
|
|
|
331d28b |
fclose(fh);
|
|
|
331d28b |
return err;
|
|
|
331d28b |
}
|