diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-04-10 02:03:21 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-04-10 02:03:21 +0000 |
| commit | b3f39f0cfa766344cd1faec3de3c8812184a237f (patch) | |
| tree | 36ae9ed007783c5b17e7eb461837e0a61c160d4e | |
| parent | 858ebf130ae3c337f64af7c510ac86d412c055ed (diff) | |
| download | busybox-w32-b3f39f0cfa766344cd1faec3de3c8812184a237f.tar.gz busybox-w32-b3f39f0cfa766344cd1faec3de3c8812184a237f.tar.bz2 busybox-w32-b3f39f0cfa766344cd1faec3de3c8812184a237f.zip | |
nameif: fix vda's breakage (Nico Erfurth <masta AT perlgolf.de>)
function old new delta
nameif_main 684 691 +7
prepend_new_eth_table 304 301 -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 7/-3) Total: 4 bytes
| -rw-r--r-- | networking/nameif.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/networking/nameif.c b/networking/nameif.c index 43388ab32..afc88917e 100644 --- a/networking/nameif.c +++ b/networking/nameif.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | * Written 2000 by Andi Kleen. | 5 | * Written 2000 by Andi Kleen. |
| 6 | * Busybox port 2002 by Nick Fedchik <nick@fedchik.org.ua> | 6 | * Busybox port 2002 by Nick Fedchik <nick@fedchik.org.ua> |
| 7 | * Glenn McGrath | 7 | * Glenn McGrath |
| 8 | * Extended matching support 2008 by Nico Erfurth <masta@perlgolf.de> | ||
| 8 | * | 9 | * |
| 9 | * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. | 10 | * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. |
| 10 | */ | 11 | */ |
| @@ -93,12 +94,10 @@ static void nameif_parse_selector(ethtable_t *ch, char *selector) | |||
| 93 | found_selector++; | 94 | found_selector++; |
| 94 | } else { | 95 | } else { |
| 95 | #endif | 96 | #endif |
| 96 | lmac = ether_aton(selector + (strncmp(selector, "mac=", 4) == 0 ? 4 : 0)); | 97 | lmac = xmalloc(ETH_ALEN); |
| 97 | /* Check ascii selector, convert and copy to *mac */ | 98 | ch->mac = ether_aton_r(selector + (strncmp(selector, "mac=", 4) ? 0 : 4), lmac); |
| 98 | if (lmac == NULL) | 99 | if (ch->mac == NULL) |
| 99 | bb_error_msg_and_die("cannot parse %s", selector); | 100 | bb_error_msg_and_die("cannot parse %s", selector); |
| 100 | ch->mac = xmalloc(ETH_ALEN); | ||
| 101 | memcpy(ch->mac, lmac, ETH_ALEN); | ||
| 102 | #if ENABLE_FEATURE_NAMEIF_EXTENDED | 101 | #if ENABLE_FEATURE_NAMEIF_EXTENDED |
| 103 | found_selector++; | 102 | found_selector++; |
| 104 | }; | 103 | }; |
| @@ -115,7 +114,7 @@ static void prepend_new_eth_table(ethtable_t **clist, char *ifname, char *select | |||
| 115 | if (strlen(ifname) >= IF_NAMESIZE) | 114 | if (strlen(ifname) >= IF_NAMESIZE) |
| 116 | bb_error_msg_and_die("interface name '%s' too long", ifname); | 115 | bb_error_msg_and_die("interface name '%s' too long", ifname); |
| 117 | ch = xzalloc(sizeof(*ch)); | 116 | ch = xzalloc(sizeof(*ch)); |
| 118 | ch->ifname = ifname; | 117 | ch->ifname = xstrdup(ifname); |
| 119 | nameif_parse_selector(ch, selector); | 118 | nameif_parse_selector(ch, selector); |
| 120 | ch->next = *clist; | 119 | ch->next = *clist; |
| 121 | if (*clist) | 120 | if (*clist) |
| @@ -123,6 +122,21 @@ static void prepend_new_eth_table(ethtable_t **clist, char *ifname, char *select | |||
| 123 | *clist = ch; | 122 | *clist = ch; |
| 124 | } | 123 | } |
| 125 | 124 | ||
| 125 | #if ENABLE_FEATURE_CLEAN_UP | ||
| 126 | static void delete_eth_table(ethtable_t *ch) | ||
| 127 | { | ||
| 128 | free(ch->ifname); | ||
| 129 | #if ENABLE_FEATURE_NAMEIF_EXTENDED | ||
| 130 | free(ch->bus_info); | ||
| 131 | free(ch->driver); | ||
| 132 | #endif | ||
| 133 | free(ch->mac); | ||
| 134 | free(ch); | ||
| 135 | }; | ||
| 136 | #else | ||
| 137 | void delete_eth_table(ethtable_t *ch); | ||
| 138 | #endif | ||
| 139 | |||
| 126 | int nameif_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 140 | int nameif_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 127 | int nameif_main(int argc, char **argv) | 141 | int nameif_main(int argc, char **argv) |
| 128 | { | 142 | { |
| @@ -156,14 +170,13 @@ int nameif_main(int argc, char **argv) | |||
| 156 | char *next; | 170 | char *next; |
| 157 | 171 | ||
| 158 | line_ptr = skip_whitespace(line); | 172 | line_ptr = skip_whitespace(line); |
| 159 | if ((line_ptr[0] == '#') || (line_ptr[0] == '\n')) { | 173 | if ((line_ptr[0] == '#') || (line_ptr[0] == '\n')) |
| 160 | free(line); | 174 | goto read_next_line; |
| 161 | continue; | ||
| 162 | } | ||
| 163 | next = skip_non_whitespace(line_ptr); | 175 | next = skip_non_whitespace(line_ptr); |
| 164 | if (*next) | 176 | if (*next) |
| 165 | *next++ = '\0'; | 177 | *next++ = '\0'; |
| 166 | prepend_new_eth_table(&clist, line_ptr, next); | 178 | prepend_new_eth_table(&clist, line_ptr, next); |
| 179 | read_next_line: | ||
| 167 | free(line); | 180 | free(line); |
| 168 | } | 181 | } |
| 169 | fclose(ifh); | 182 | fclose(ifh); |
| @@ -187,7 +200,7 @@ int nameif_main(int argc, char **argv) | |||
| 187 | 200 | ||
| 188 | /* Find the current interface name and copy it to ifr.ifr_name */ | 201 | /* Find the current interface name and copy it to ifr.ifr_name */ |
| 189 | line_ptr = skip_whitespace(line); | 202 | line_ptr = skip_whitespace(line); |
| 190 | *skip_non_whitespace(line_ptr) = '\0'; | 203 | *strpbrk(line_ptr, " \t\n:") = '\0'; |
| 191 | 204 | ||
| 192 | memset(&ifr, 0, sizeof(struct ifreq)); | 205 | memset(&ifr, 0, sizeof(struct ifreq)); |
| 193 | strncpy(ifr.ifr_name, line_ptr, sizeof(ifr.ifr_name)); | 206 | strncpy(ifr.ifr_name, line_ptr, sizeof(ifr.ifr_name)); |
| @@ -230,16 +243,15 @@ int nameif_main(int argc, char **argv) | |||
| 230 | else | 243 | else |
| 231 | clist = ch->next; | 244 | clist = ch->next; |
| 232 | if (ch->next != NULL) | 245 | if (ch->next != NULL) |
| 233 | ch->next->prev = ch->prev; | 246 | ch->next->prev = ch->prev; |
| 234 | if (ENABLE_FEATURE_CLEAN_UP) { | 247 | if (ENABLE_FEATURE_CLEAN_UP) |
| 235 | free(ch->ifname); | 248 | delete_eth_table(ch); |
| 236 | free(ch->mac); | ||
| 237 | free(ch); | ||
| 238 | } | ||
| 239 | next_line: | 249 | next_line: |
| 240 | free(line); | 250 | free(line); |
| 241 | } | 251 | } |
| 242 | if (ENABLE_FEATURE_CLEAN_UP) { | 252 | if (ENABLE_FEATURE_CLEAN_UP) { |
| 253 | for (ch = clist; ch; ch = ch->next) | ||
| 254 | delete_eth_table(ch); | ||
| 243 | fclose(ifh); | 255 | fclose(ifh); |
| 244 | }; | 256 | }; |
| 245 | 257 | ||
