diff --git a/lib/rt_names.c b/lib/rt_names.c index e6a1e013..1698036b 100644 --- a/lib/rt_names.c +++ b/lib/rt_names.c @@ -27,43 +27,63 @@ #define CONFDIR "/etc/iproute2" #endif +#define NAME_MAX_LEN 512 + struct rtnl_hash_entry { struct rtnl_hash_entry *next; const char * name; unsigned int id; }; +static int fread_id_name(FILE *fp, int *id, char *namebuf) +{ + char buf[NAME_MAX_LEN]; + + while (fgets(buf, sizeof(buf), fp)) { + char *p = buf; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p == '#' || *p == '\n' || *p == 0) + continue; + + if (sscanf(p, "0x%x %s\n", id, namebuf) != 2 && + sscanf(p, "0x%x %s #", id, namebuf) != 2 && + sscanf(p, "%d %s\n", id, namebuf) != 2 && + sscanf(p, "%d %s #", id, namebuf) != 2) { + strcpy(namebuf, p); + return -1; + } + return 1; + } + return 0; +} + static void rtnl_hash_initialize(const char *file, struct rtnl_hash_entry **hash, int size) { struct rtnl_hash_entry *entry; - char buf[512]; FILE *fp; + int id; + char namebuf[NAME_MAX_LEN] = {0}; + int ret; fp = fopen(file, "r"); if (!fp) return; - while (fgets(buf, sizeof(buf), fp)) { - char *p = buf; - int id; - char namebuf[512]; - while (*p == ' ' || *p == '\t') - p++; - if (*p == '#' || *p == '\n' || *p == 0) - continue; - if (sscanf(p, "0x%x %s\n", &id, namebuf) != 2 && - sscanf(p, "0x%x %s #", &id, namebuf) != 2 && - sscanf(p, "%d %s\n", &id, namebuf) != 2 && - sscanf(p, "%d %s #", &id, namebuf) != 2) { + while ((ret = fread_id_name(fp, &id, &namebuf[0]))) { + if (ret == -1) { fprintf(stderr, "Database %s is corrupted at %s\n", - file, p); + file, namebuf); fclose(fp); return; } if (id<0) continue; + entry = malloc(sizeof(*entry)); entry->id = id; entry->name = strdup(namebuf); @@ -75,31 +95,22 @@ rtnl_hash_initialize(const char *file, struct rtnl_hash_entry **hash, int size) static void rtnl_tab_initialize(const char *file, char **tab, int size) { - char buf[512]; FILE *fp; + int id; + char namebuf[NAME_MAX_LEN] = {0}; + int ret; fp = fopen(file, "r"); if (!fp) return; - while (fgets(buf, sizeof(buf), fp)) { - char *p = buf; - int id; - char namebuf[512]; - while (*p == ' ' || *p == '\t') - p++; - if (*p == '#' || *p == '\n' || *p == 0) - continue; - if (sscanf(p, "0x%x %s\n", &id, namebuf) != 2 && - sscanf(p, "0x%x %s #", &id, namebuf) != 2 && - sscanf(p, "%d %s\n", &id, namebuf) != 2 && - sscanf(p, "%d %s #", &id, namebuf) != 2) { + while ((ret = fread_id_name(fp, &id, &namebuf[0]))) { + if (ret == -1) { fprintf(stderr, "Database %s is corrupted at %s\n", - file, p); + file, namebuf); fclose(fp); return; } - if (id<0 || id>size) continue; @@ -185,8 +196,7 @@ int rtnl_rtprot_a2n(__u32 *id, const char *arg) return 0; } - -static char * rtnl_rtscope_tab[256] = { +static const char * rtnl_rtscope_tab[256] = { "global", };