runsvd: shrink by Vladimir
[oweals/busybox.git] / networking / nameif.c
index 76a8cb7df3f3dcf98da094f4f1a16c97ed661df3..75829fac353c6bc635f153aaf2d2b6304e4d4d54 100644 (file)
@@ -136,13 +136,11 @@ int nameif_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int nameif_main(int argc, char **argv)
 {
        ethtable_t *clist = NULL;
-       FILE *ifh;
        const char *fname = "/etc/mactab";
-       char *line;
-       char *line_ptr;
-       int linenum;
        int ctl_sk;
        ethtable_t *ch;
+       parser_t *parser;
+       char *token[2];
 
        if (1 & getopt32(argv, "sc:", &fname)) {
                openlog(applet_name, 0, LOG_LOCAL0);
@@ -160,37 +158,26 @@ int nameif_main(int argc, char **argv)
                        prepend_new_eth_table(&clist, ifname, *argv++);
                }
        } else {
-               struct parser_t *parser = config_open(fname);
-               if (parser) {
-                       char *tokens[2];
-                       while (config_read(parser, tokens, 2, 2, "# \t", 0))
-                               prepend_new_eth_table(&clist, tokens[0], tokens[1]);
-                       config_close(parser);
-               }
+               parser = config_open(fname);
+               while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL))
+                       prepend_new_eth_table(&clist, token[0], token[1]);
+               config_close(parser);
        }
 
        ctl_sk = xsocket(PF_INET, SOCK_DGRAM, 0);
-       ifh = xfopen("/proc/net/dev", "r");
+       parser = config_open2("/proc/net/dev", xfopen_for_read);
 
-       linenum = 0;
-       while (clist) {
+       while (clist && config_read(parser, token, 2, 2, "\0: \t", PARSE_NORMAL)) {
                struct ifreq ifr;
 #if  ENABLE_FEATURE_NAMEIF_EXTENDED
                struct ethtool_drvinfo drvinfo;
 #endif
-
-               line = xmalloc_fgets(ifh);
-               if (line == NULL)
-                       break; /* Seems like we're done */
-               if (linenum++ < 2 )
-                       goto next_line; /* Skip the first two lines */
+               if (parser->lineno < 2)
+                       continue; /* Skip the first two lines */
 
                /* Find the current interface name and copy it to ifr.ifr_name */
-               line_ptr = skip_whitespace(line);
-               *strpbrk(line_ptr, " \t\n:") = '\0';
-
                memset(&ifr, 0, sizeof(struct ifreq));
-               strncpy(ifr.ifr_name, line_ptr, sizeof(ifr.ifr_name));
+               strncpy(ifr.ifr_name, token[0], sizeof(ifr.ifr_name));
 
 #if ENABLE_FEATURE_NAMEIF_EXTENDED
                /* Check for driver etc. */
@@ -213,11 +200,12 @@ int nameif_main(int argc, char **argv)
                        if (ch->mac && memcmp(ch->mac, ifr.ifr_hwaddr.sa_data, ETH_ALEN) != 0)
                                continue;
                        /* if we came here, all selectors have matched */
-                       goto found;
+                       break;
                }
                /* Nothing found for current interface */
-               goto next_line;
- found:
+               if (!ch)
+                       continue;
+
                if (strcmp(ifr.ifr_name, ch->ifname) != 0) {
                        strcpy(ifr.ifr_newname, ch->ifname);
                        ioctl_or_perror_and_die(ctl_sk, SIOCSIFNAME, &ifr,
@@ -230,16 +218,14 @@ int nameif_main(int argc, char **argv)
                else
                        clist = ch->next;
                if (ch->next != NULL)
-               ch->next->prev = ch->prev;
+                       ch->next->prev = ch->prev;
                if (ENABLE_FEATURE_CLEAN_UP)
                        delete_eth_table(ch);
- next_line:
-               free(line);
        }
        if (ENABLE_FEATURE_CLEAN_UP) {
                for (ch = clist; ch; ch = ch->next)
                        delete_eth_table(ch);
-               fclose(ifh);
+               config_close(parser);
        };
 
        return 0;