X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fnameif.c;h=36fbb954ebe6fcd0c020e01ce8eedf48aad91f11;hb=f6b29a2dc9fc4e3c0cf8cd0c2ac6e674d47480ec;hp=5a3bd606f5126b6481c10a4d74911a9c07774f4f;hpb=5415c856eaccd1bc5d064022770a288f43b2e94f;p=oweals%2Fbusybox.git diff --git a/networking/nameif.c b/networking/nameif.c index 5a3bd606f..36fbb954e 100644 --- a/networking/nameif.c +++ b/networking/nameif.c @@ -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;