Merge branch 'master' of git+ssh://vda@busybox.net/var/lib/git/busybox
[oweals/busybox.git] / networking / nameif.c
index 5a3bd606f5126b6481c10a4d74911a9c07774f4f..36fbb954ebe6fcd0c020e01ce8eedf48aad91f11 100644 (file)
@@ -92,7 +92,7 @@ static void nameif_parse_selector(ethtable_t *ch, char *selector)
                        lmac = xmalloc(ETH_ALEN);
                        ch->mac = ether_aton_r(selector + (strncmp(selector, "mac=", 4) ? 0 : 4), lmac);
                        if (ch->mac == NULL)
-                               bb_error_msg_and_die("cannot parse %s", selector);
+                               bb_error_msg_and_die("can't parse %s", selector);
 #if  ENABLE_FEATURE_NAMEIF_EXTENDED
                        found_selector++;
                };
@@ -136,17 +136,17 @@ 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);
-               logmode = LOGMODE_SYSLOG;
+               /* Why not just "="? I assume logging to stderr
+                * can't hurt. 2>/dev/null if you don't like it: */
+               logmode |= LOGMODE_SYSLOG;
        }
        argc -= optind;
        argv += optind;
@@ -160,37 +160,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_for_read("/proc/net/dev");
+       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_IFNAMSIZ(ifr.ifr_name, token[0]);
 
 #if ENABLE_FEATURE_NAMEIF_EXTENDED
                /* Check for driver etc. */
@@ -213,15 +202,16 @@ 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,
-                                       "cannot change ifname %s to %s",
+                                       "can't change ifname %s to %s",
                                        ifr.ifr_name, ch->ifname);
                }
                /* Remove list entry of renamed interface */
@@ -230,16 +220,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;