]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
lib names: Add helper func for parse id and name from file
authorvadimk <vadim4j@gmail.com>
Sat, 6 Dec 2014 02:05:12 +0000 (04:05 +0200)
committerStephen Hemminger <shemming@brocade.com>
Wed, 10 Dec 2014 04:38:02 +0000 (20:38 -0800)
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
lib/rt_names.c

index e6a1e013da4f7009be26992e0abbe269d77228f4..1698036bc069ef44c905a27104c3f8508d1d8251 100644 (file)
 #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",
 };